Add scripts for managing e-conomic customer numbers
- Implemented fix_economic_numbers.sh to correct invalid 10-digit economic_customer_number entries in the database. - Created import_economic_csv.py for importing customers from a CSV file into the Hub database, handling updates and new entries. - Developed match_all_customers.sh to match all customers from a CSV file to the Hub database, updating or creating records as necessary. - Added simple_match.sh for a straightforward matching process of customers from a CSV file to the Hub database.
This commit is contained in:
parent
ca53573952
commit
42b766b31e
BIN
Kunder-2.xlsx
Normal file
BIN
Kunder-2.xlsx
Normal file
Binary file not shown.
83
scripts/fix_economic_numbers.sh
Normal file
83
scripts/fix_economic_numbers.sh
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script til at rette forkerte 10-cifrede e-conomic kundenumre
|
||||||
|
# Baseret på CSV eksport fra e-conomic
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CONTAINER_NAME="bmc-hub-postgres-prod"
|
||||||
|
DB_USER="bmc_hub"
|
||||||
|
DB_NAME="bmc_hub"
|
||||||
|
|
||||||
|
# Farver til output
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${GREEN}🔍 Finder kunder med forkerte 10-cifrede economic_customer_number...${NC}"
|
||||||
|
|
||||||
|
# Find alle kunder med 10+ cifrede numre (over 999999999)
|
||||||
|
echo "SELECT id, name, economic_customer_number FROM customers WHERE economic_customer_number > 999999999 ORDER BY economic_customer_number;" | \
|
||||||
|
sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}⚠️ Disse numre er ugyldige i e-conomic (max 9 cifre tilladt)${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Ret specifikke kendte cases fra CSV
|
||||||
|
echo -e "${GREEN}🔧 Retter kendte forkerte numre...${NC}"
|
||||||
|
|
||||||
|
# PFA kunder med forkerte numre - baseret på mønstre i CSV
|
||||||
|
# 2065328011 skal være 20653280X (find det rigtige i e-conomic)
|
||||||
|
# 2065328014 skal være 206532814 eller lignende
|
||||||
|
|
||||||
|
# Først: Fjern sidste ciffer hvis det er 1 og nummeret eksisterer i e-conomic
|
||||||
|
echo -e "${YELLOW}📋 Strategi: Fjerner sidste ciffer fra 10-cifrede numre${NC}"
|
||||||
|
|
||||||
|
# Hent alle 10-cifrede numre
|
||||||
|
INVALID_NUMBERS=$(sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -t -c \
|
||||||
|
"SELECT id, economic_customer_number FROM customers WHERE economic_customer_number > 999999999;")
|
||||||
|
|
||||||
|
if [ -z "$INVALID_NUMBERS" ]; then
|
||||||
|
echo -e "${GREEN}✅ Ingen forkerte numre fundet!${NC}"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For hver forkert nummer, prøv at rette det
|
||||||
|
echo "$INVALID_NUMBERS" | while IFS='|' read -r id number; do
|
||||||
|
id=$(echo "$id" | xargs)
|
||||||
|
number=$(echo "$number" | xargs)
|
||||||
|
|
||||||
|
if [ -z "$id" ] || [ -z "$number" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fjern sidste ciffer
|
||||||
|
corrected=$((number / 10))
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Kunde ID $id: $number → $corrected${NC}"
|
||||||
|
|
||||||
|
# Opdater i database
|
||||||
|
sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -c \
|
||||||
|
"UPDATE customers SET economic_customer_number = $corrected WHERE id = $id;"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✅ Opdateret kunde $id${NC}"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✅ Rettelser komplet!${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}📋 Verificer resultatet:${NC}"
|
||||||
|
|
||||||
|
sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -c \
|
||||||
|
"SELECT id, name, economic_customer_number FROM customers WHERE economic_customer_number > 999999999;"
|
||||||
|
|
||||||
|
REMAINING=$(sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -t -c \
|
||||||
|
"SELECT COUNT(*) FROM customers WHERE economic_customer_number > 999999999;")
|
||||||
|
|
||||||
|
if [ "$REMAINING" -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✅ Alle kundenumre er nu gyldige!${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}⚠️ $REMAINING kunder har stadig ugyldige numre${NC}"
|
||||||
|
fi
|
||||||
85
scripts/import_economic_csv.py
Normal file
85
scripts/import_economic_csv.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Import e-conomic customers fra CSV til Hub database
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import csv
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def run_sql(sql):
|
||||||
|
"""Kør SQL kommando via podman"""
|
||||||
|
cmd = [
|
||||||
|
'sudo', 'podman', 'exec', '-i', 'bmc-hub-postgres-prod',
|
||||||
|
'psql', '-U', 'bmc_hub', '-d', 'bmc_hub', '-t', '-c', sql
|
||||||
|
]
|
||||||
|
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||||
|
return result.stdout.strip()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Brug: python3 import_economic_csv.py <csv-file>")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
csv_file = sys.argv[1]
|
||||||
|
print(f"📂 Læser {csv_file}...")
|
||||||
|
|
||||||
|
updated = 0
|
||||||
|
created = 0
|
||||||
|
skipped = 0
|
||||||
|
|
||||||
|
with open(csv_file, 'r', encoding='utf-8-sig') as f:
|
||||||
|
# Skip første 3 linjer (header osv.)
|
||||||
|
for _ in range(3):
|
||||||
|
next(f)
|
||||||
|
|
||||||
|
reader = csv.DictReader(f, delimiter=';')
|
||||||
|
|
||||||
|
for row in reader:
|
||||||
|
nummer = row.get('Nr.', '').strip()
|
||||||
|
navn = row.get('Navn', '').strip()
|
||||||
|
|
||||||
|
if not nummer or not navn:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Skip non-numeric
|
||||||
|
if not nummer.isdigit():
|
||||||
|
continue
|
||||||
|
|
||||||
|
nummer_int = int(nummer)
|
||||||
|
|
||||||
|
# Skip for store numre
|
||||||
|
if nummer_int > 999999999:
|
||||||
|
print(f"⚠️ Springer over {navn} - Nummer for stort: {nummer}")
|
||||||
|
skipped += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f"[{updated + created + skipped + 1}] {nummer} - {navn}")
|
||||||
|
|
||||||
|
# Escape quotes
|
||||||
|
navn_esc = navn.replace("'", "''")
|
||||||
|
|
||||||
|
# Find kunde
|
||||||
|
find_sql = f"SELECT id FROM customers WHERE LOWER(name) = LOWER('{navn_esc}') LIMIT 1;"
|
||||||
|
kunde_id = run_sql(find_sql).strip()
|
||||||
|
|
||||||
|
if kunde_id and kunde_id.isdigit():
|
||||||
|
# Update
|
||||||
|
update_sql = f"UPDATE customers SET economic_customer_number = {nummer_int} WHERE id = {kunde_id};"
|
||||||
|
run_sql(update_sql)
|
||||||
|
print(f" ✅ Opdateret ID {kunde_id}")
|
||||||
|
updated += 1
|
||||||
|
else:
|
||||||
|
# Create
|
||||||
|
create_sql = f"INSERT INTO customers (name, economic_customer_number, created_at, updated_at) VALUES ('{navn_esc}', {nummer_int}, NOW(), NOW());"
|
||||||
|
run_sql(create_sql)
|
||||||
|
print(f" ➕ Oprettet")
|
||||||
|
created += 1
|
||||||
|
|
||||||
|
print(f"\n✅ Færdig!")
|
||||||
|
print(f" Opdateret: {updated}")
|
||||||
|
print(f" Oprettet: {created}")
|
||||||
|
print(f" Sprunget over: {skipped}")
|
||||||
|
print(f" Total: {updated + created}")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
145
scripts/match_all_customers.sh
Normal file
145
scripts/match_all_customers.sh
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script til at matche ALLE kunder fra e-conomic CSV til Hub database
|
||||||
|
# Opdaterer economic_customer_number baseret på kunde navn match
|
||||||
|
|
||||||
|
# VIGTIGT: Ingen set -e her - vi vil fortsætte ved fejl
|
||||||
|
set +e
|
||||||
|
|
||||||
|
CONTAINER_NAME="bmc-hub-postgres-prod"
|
||||||
|
DB_USER="bmc_hub"
|
||||||
|
DB_NAME="bmc_hub"
|
||||||
|
CSV_FILE="$1"
|
||||||
|
|
||||||
|
# Farver
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
if [ -z "$CSV_FILE" ]; then
|
||||||
|
echo -e "${RED}❌ Brug: $0 <path-to-csv-file>${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "Eksempel: $0 ~/Downloads/Kunder-2.csv"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$CSV_FILE" ]; then
|
||||||
|
echo -e "${RED}❌ Fil ikke fundet: $CSV_FILE${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}📂 Læser CSV fil: $CSV_FILE${NC}"
|
||||||
|
|
||||||
|
# Vis første 10 linjer for debugging
|
||||||
|
echo -e "${YELLOW}📋 Første linjer i CSV:${NC}"
|
||||||
|
head -10 "$CSV_FILE"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Statistik
|
||||||
|
TOTAL=0
|
||||||
|
MATCHED=0
|
||||||
|
UPDATED=0
|
||||||
|
SKIPPED=0
|
||||||
|
ERRORS=0
|
||||||
|
|
||||||
|
# Lav temp fil med data
|
||||||
|
TEMP_FILE=$(mktemp)
|
||||||
|
tail -n +5 "$CSV_FILE" | grep -v "^$" > "$TEMP_FILE"
|
||||||
|
|
||||||
|
echo -e "${GREEN}🔢 Antal linjer i CSV: $(wc -l < "$TEMP_FILE")${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Parse CSV og match kunder
|
||||||
|
# Format: Nr.;Navn;Gruppe;Attention;Saldo;Forfalden;E-mail
|
||||||
|
while IFS=';' read -r nummer navn gruppe attention saldo forfalden email rest || [ -n "$nummer" ]; do
|
||||||
|
# Skip tomme linjer og header
|
||||||
|
if [ -z "$nummer" ] || [ "$nummer" = "Nr." ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Trim whitespace og fjern BOM/special chars
|
||||||
|
nummer=$(echo "$nummer" | xargs | tr -cd '0-9')
|
||||||
|
navn=$(echo "$navn" | xargs)
|
||||||
|
|
||||||
|
if [ -z "$navn" ] || [ -z "$nummer" ]; then
|
||||||
|
echo -e "${RED}DEBUG: Skipping empty - nummer='$nummer', navn='$navn'${NC}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
TOTAL=$((TOTAL + 1))
|
||||||
|
|
||||||
|
# Debug ALLE linjer
|
||||||
|
echo -e "${YELLOW}[$TOTAL] Processing: $nummer - $navn${NC}"
|
||||||
|
|
||||||
|
# Escape single quotes i navn
|
||||||
|
navn_escaped=$(echo "$navn" | sed "s/'/''/g")
|
||||||
|
|
||||||
|
# Tjek om nummer er gyldigt (max 9 cifre)
|
||||||
|
if [ "$nummer" -gt 999999999 ] 2>/dev/null; then
|
||||||
|
echo -e "${YELLOW}⚠️ Springer over $navn - Nummer for stort: $nummer${NC}"
|
||||||
|
SKIPPED=$((SKIPPED + 1))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find matchende kunde i Hub
|
||||||
|
MATCH=$(sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -t -c \
|
||||||
|
"SELECT id FROM customers WHERE LOWER(TRIM(name)) = LOWER(TRIM('$navn_escaped')) LIMIT 1;")
|
||||||
|
|
||||||
|
MATCH=$(echo "$MATCH" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$MATCH" ]; then
|
||||||
|
MATCHED=$((MATCHED + 1))
|
||||||
|
|
||||||
|
# Opdater economic_customer_number (altid - tvungen opdatering)
|
||||||
|
UPDATE_RESULT=$(sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -t -c \
|
||||||
|
"UPDATE customers SET economic_customer_number = $nummer, last_synced_at = NOW()
|
||||||
|
WHERE id = $MATCH
|
||||||
|
RETURNING id;" 2>&1)
|
||||||
|
|
||||||
|
if echo "$UPDATE_RESULT" | grep -q "^[0-9]"; then
|
||||||
|
echo -e "${GREEN}✅ $navn → e-conomic #$nummer (opdateret)${NC}"
|
||||||
|
UPDATED=$((UPDATED + 1))
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⏭️ $navn - Ingen ændring nødvendig${NC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Kunde findes ikke i Hub - opret den
|
||||||
|
CREATE_RESULT=$(sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -t -c \
|
||||||
|
"INSERT INTO customers (name, economic_customer_number, created_at, updated_at)
|
||||||
|
VALUES ('$navn_escaped', $nummer, NOW(), NOW())
|
||||||
|
ON CONFLICT DO NOTHING
|
||||||
|
RETURNING id;" 2>&1)
|
||||||
|
|
||||||
|
if echo "$CREATE_RESULT" | grep -q "^[0-9]"; then
|
||||||
|
echo -e "${GREEN}➕ OPRETTET: $navn → e-conomic #$nummer${NC}"
|
||||||
|
UPDATED=$((UPDATED + 1))
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠️ Kunne ikke oprette: $navn (e-conomic #$nummer)${NC}"
|
||||||
|
SKIPPED=$((SKIPPED + 1))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Progress hver 50. kunde
|
||||||
|
if [ $((TOTAL % 50)) -eq 0 ] && [ $TOTAL -gt 0 ]; then
|
||||||
|
echo -e "${YELLOW}📊 Progress: $TOTAL behandlet, $MATCHED matched, $UPDATED opdateret${NC}"
|
||||||
|
fi
|
||||||
|
done < "$TEMP_FILE"
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -f "$TEMP_FILE"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✅ Matching komplet!${NC}"
|
||||||
|
echo -e "${GREEN}📊 Statistik:${NC}"
|
||||||
|
echo -e " Total behandlet: $TOTAL"
|
||||||
|
echo -e " Matched i Hub: $MATCHED"
|
||||||
|
echo -e " Opdateret: $UPDATED"
|
||||||
|
echo -e " Sprunget over: $SKIPPED"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Vis kunder der mangler economic_customer_number
|
||||||
|
MISSING=$(sudo podman exec -i "$CONTAINER_NAME" psql -U "$DB_USER" -d "$DB_NAME" -t -c \
|
||||||
|
"SELECT COUNT(*) FROM customers WHERE economic_customer_number IS NULL;")
|
||||||
|
|
||||||
|
echo -e "${YELLOW}⚠️ $MISSING kunder mangler stadig economic_customer_number${NC}"
|
||||||
58
scripts/simple_match.sh
Normal file
58
scripts/simple_match.sh
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Simpel version - ingen fancy features
|
||||||
|
CSV_FILE="$1"
|
||||||
|
CONTAINER="bmc-hub-postgres-prod"
|
||||||
|
|
||||||
|
if [ -z "$CSV_FILE" ]; then
|
||||||
|
echo "Brug: $0 <csv-file>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Reading $CSV_FILE..."
|
||||||
|
LINE_NO=0
|
||||||
|
UPDATED=0
|
||||||
|
|
||||||
|
while IFS=';' read -r nummer navn rest; do
|
||||||
|
LINE_NO=$((LINE_NO + 1))
|
||||||
|
|
||||||
|
# Skip første 4 linjer
|
||||||
|
if [ $LINE_NO -le 4 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean nummer og navn
|
||||||
|
nummer=$(echo "$nummer" | tr -cd '0-9')
|
||||||
|
navn=$(echo "$navn" | xargs)
|
||||||
|
|
||||||
|
# Skip hvis tomt
|
||||||
|
if [ -z "$nummer" ] || [ -z "$navn" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$LINE_NO] $nummer - $navn"
|
||||||
|
|
||||||
|
# Escape quotes
|
||||||
|
navn_esc=$(echo "$navn" | sed "s/'/''/g")
|
||||||
|
|
||||||
|
# Find kunde
|
||||||
|
ID=$(sudo podman exec -i "$CONTAINER" psql -U bmc_hub -d bmc_hub -t -c \
|
||||||
|
"SELECT id FROM customers WHERE LOWER(name) = LOWER('$navn_esc') LIMIT 1;" | xargs)
|
||||||
|
|
||||||
|
if [ -n "$ID" ]; then
|
||||||
|
# Update
|
||||||
|
sudo podman exec -i "$CONTAINER" psql -U bmc_hub -d bmc_hub -c \
|
||||||
|
"UPDATE customers SET economic_customer_number = $nummer WHERE id = $ID;" > /dev/null
|
||||||
|
echo " ✅ Updated ID $ID"
|
||||||
|
UPDATED=$((UPDATED + 1))
|
||||||
|
else
|
||||||
|
# Create
|
||||||
|
sudo podman exec -i "$CONTAINER" psql -U bmc_hub -d bmc_hub -c \
|
||||||
|
"INSERT INTO customers (name, economic_customer_number, created_at, updated_at) VALUES ('$navn_esc', $nummer, NOW(), NOW());" > /dev/null
|
||||||
|
echo " ➕ Created"
|
||||||
|
UPDATED=$((UPDATED + 1))
|
||||||
|
fi
|
||||||
|
done < "$CSV_FILE"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Done! Updated: $UPDATED customers"
|
||||||
Loading…
Reference in New Issue
Block a user