132 lines
4.9 KiB
Python
132 lines
4.9 KiB
Python
"""
|
|
Seed-Script: Legt Firma KPT-Consulting + User Florian an
|
|
und importiert das LV-KPT-Proj+Doku-2024ff inkl. Langtexte.
|
|
"""
|
|
import sys, os
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
from app import create_app
|
|
from app.extensions import db
|
|
from app.models.company import Company
|
|
from app.models.user import User
|
|
from app.models.lv import LVPosition
|
|
from app.models.contract import Contract
|
|
from datetime import date
|
|
|
|
app = create_app()
|
|
|
|
LV_NAME = 'LV-KPT-Proj+Doku-2024ff'
|
|
FLATFILE = os.path.join('..', 'daten', 'LV', f'{LV_NAME}.txt')
|
|
LANGFOLDER = os.path.join('..', 'daten', 'LV', LV_NAME)
|
|
|
|
def run():
|
|
with app.app_context():
|
|
# 1. Firma anlegen
|
|
company = Company.query.filter_by(slug='kpt-consulting').first()
|
|
if not company:
|
|
company = Company(
|
|
name='KPT-Consulting', slug='kpt-consulting',
|
|
strasse='Musterstr. 1', plz='88045', ort='Friedrichshafen',
|
|
telefon='+49 7541 123456', email='info@kpt-consulting.de'
|
|
)
|
|
db.session.add(company)
|
|
db.session.flush()
|
|
print(f'Firma angelegt: {company.name} (ID {company.id})')
|
|
else:
|
|
print(f'Firma existiert bereits: {company.name} (ID {company.id})')
|
|
|
|
# 2. User Florian Kramer anlegen
|
|
user = User.query.filter_by(email='fk@kpt-consulting.de').first()
|
|
if not user:
|
|
user = User(
|
|
company_id=company.id, email='fk@kpt-consulting.de',
|
|
vorname='Florian', nachname='Kramer', rolle='firmadmin',
|
|
darf_projekte_anlegen=True, darf_lv_verwalten=True,
|
|
darf_preise_sehen=True, darf_aufmass_verwalten=True,
|
|
)
|
|
user.set_password('kpt2024')
|
|
db.session.add(user)
|
|
db.session.flush()
|
|
print(f'User angelegt: {user.full_name} ({user.email})')
|
|
else:
|
|
print(f'User existiert bereits: {user.full_name}')
|
|
|
|
# 3. Vertrag anlegen
|
|
contract = Contract.query.filter_by(company_id=company.id, belegnummer='4650014601').first()
|
|
if not contract:
|
|
contract = Contract(
|
|
company_id=company.id,
|
|
name='SW Proj+Doku 2024ff',
|
|
belegnummer='4650014601',
|
|
beleg_datum=date(2025, 12, 16),
|
|
laufzeit_start=date(2024, 6, 1),
|
|
laufzeit_ende=date(2026, 5, 31),
|
|
status='Angenommen',
|
|
)
|
|
db.session.add(contract)
|
|
db.session.flush()
|
|
print(f'Vertrag angelegt: {contract.name}')
|
|
else:
|
|
print(f'Vertrag existiert bereits: {contract.name}')
|
|
|
|
# 4. LV-Positionen importieren
|
|
if not os.path.exists(FLATFILE):
|
|
print(f'FEHLER: Flatfile nicht gefunden: {FLATFILE}')
|
|
return
|
|
|
|
existing = LVPosition.query.filter_by(company_id=company.id, lv_name=LV_NAME).count()
|
|
if existing > 0:
|
|
print(f'LV {LV_NAME} bereits importiert ({existing} Positionen). Überspringe.')
|
|
return
|
|
|
|
# Encoding automatisch erkennen (UTF-16-BE/LE oder UTF-8)
|
|
with open(FLATFILE, 'rb') as f:
|
|
raw = f.read()
|
|
if raw[:2] in (b'\xff\xfe', b'\xfe\xff'):
|
|
enc = 'utf-16'
|
|
else:
|
|
enc = 'utf-8'
|
|
text = raw.decode(enc, errors='replace').strip('\ufeff').replace('\r\n', '\n').replace('\r', '\n')
|
|
lines = text.split('\n')
|
|
|
|
count = 0
|
|
for idx, line in enumerate(lines):
|
|
line = line.strip()
|
|
if not line or line.startswith('#'):
|
|
continue
|
|
parts = [p.strip() for p in line.split('|')]
|
|
if len(parts) < 2:
|
|
continue
|
|
pos_nr = parts[0]
|
|
kurztext = parts[1] if len(parts) > 1 else ''
|
|
einheit = parts[2] if len(parts) > 2 else 'ST'
|
|
preis_str = parts[3] if len(parts) > 3 else '0'
|
|
einzelpreis = float(preis_str.replace(',', '.')) if preis_str else 0.0
|
|
|
|
# Langtext aus Einzeldatei lesen
|
|
langtext = ''
|
|
txt_path = os.path.join(LANGFOLDER, f'{pos_nr}.txt')
|
|
if os.path.exists(txt_path):
|
|
with open(txt_path, 'rb') as tf:
|
|
raw_txt = tf.read()
|
|
if raw_txt[:2] in (b'\xff\xfe', b'\xfe\xff'):
|
|
enc_txt = 'utf-16'
|
|
else:
|
|
enc_txt = 'utf-8'
|
|
langtext = raw_txt.decode(enc_txt, errors='replace').strip()
|
|
|
|
pos = LVPosition(
|
|
company_id=company.id, contract_id=contract.id, lv_name=LV_NAME,
|
|
pos_nr=pos_nr, order_index=idx + 1,
|
|
kurztext=kurztext, langtext=langtext,
|
|
einheit=einheit, einzelpreis=einzelpreis,
|
|
)
|
|
db.session.add(pos)
|
|
count += 1
|
|
|
|
db.session.commit()
|
|
print(f'{count} LV-Positionen importiert (mit Langtext aus {LANGFOLDER})')
|
|
|
|
if __name__ == '__main__':
|
|
run()
|