from datetime import date, datetime, timedelta from pathlib import Path from werkzeug.security import generate_password_hash from app.extensions import db from app.models.invoice import Invoice, InvoiceStatus, InvoiceType, Tag from app.models.setting import AppSetting from app.models.user import User from app.models.company import Company, UserCompanyAccess def seed_data(): company = Company.query.filter_by(name='Demo Sp. z o.o.').first() if not company: company = Company(name='Demo Sp. z o.o.', tax_id='5250000001', sync_enabled=True, sync_interval_minutes=60) db.session.add(company) db.session.flush() if not User.query.filter_by(email='admin@example.com').first(): user = User(email='admin@example.com', name='Admin', password_hash=generate_password_hash('admin123'), role='admin') db.session.add(user) db.session.flush() db.session.add(UserCompanyAccess(user_id=user.id, company_id=company.id, access_level='full')) AppSetting.set(f'company.{company.id}.ksef.last_sync_at', datetime.utcnow().isoformat()) AppSetting.set(f'company.{company.id}.ksef.status', 'ready') AppSetting.set(f'company.{company.id}.notify.enabled', 'true') AppSetting.set(f'company.{company.id}.notify.min_amount', '1000') AppSetting.set(f'company.{company.id}.ksef.base_url', 'https://api.ksef.mf.gov.pl/v2') AppSetting.set(f'company.{company.id}.ksef.auth_mode', 'token') AppSetting.set(f'company.{company.id}.ksef.mock_mode', 'true') AppSetting.set(f'company.{company.id}.app.read_only_mode', 'false') if Invoice.query.filter_by(company_id=company.id).count() == 0: tag = Tag.query.filter_by(name='stały dostawca').first() or Tag(name='stały dostawca', color='primary') db.session.add(tag) db.session.flush() archive_dir = Path('storage/archive/company_%s' % company.id) archive_dir.mkdir(parents=True, exist_ok=True) for idx in range(1, 13): issued = date.today() - timedelta(days=idx * 7) xml_path = archive_dir / f'FV_{idx:03d}.xml' xml_path.write_text(f'FV/{idx:03d}/2026', encoding='utf-8') invoice = Invoice( company_id=company.id, ksef_number=f'KSEF/C{company.id}/{2025 + (idx % 2)}/{1000 + idx}', invoice_number=f'FV/{idx:03d}/2026', contractor_name=f'Kontrahent {idx}', contractor_nip=f'12345678{idx:02d}', issue_date=issued, received_date=issued + timedelta(days=1), fetched_at=datetime.utcnow() - timedelta(days=idx), net_amount=1000 * idx, vat_amount=230 * idx, gross_amount=1230 * idx, invoice_type=InvoiceType.PURCHASE if idx % 2 else InvoiceType.SALE, status=InvoiceStatus.NEW if idx % 3 else InvoiceStatus.ACCOUNTED, currency='PLN', xml_path=str(xml_path), internal_note='Przykładowa faktura testowa.', queue_accounting=idx % 2 == 0, ) invoice.tags.append(tag) db.session.add(invoice) db.session.commit()