neue docs

This commit is contained in:
ValueOn AG 2025-09-03 08:24:37 +02:00
parent d24854483f
commit 66d5a87245
84 changed files with 5222 additions and 5607 deletions

View file

View file

@ -0,0 +1,7 @@
born in geneva, f part
live in switzerland north near zurich with family 3 kids, wonderful wife
digital business since 26 years
started in infrastructure as civil engineer
then it & communication to support digital transformations, design and build datacenters
finally supporting ai integrations with people and teams in the focus

View file

@ -0,0 +1,11 @@
Procurement
From your procurement expertise, how can strategic sourcing and supplier partnerships accelerate our business transformation?
What's your view on how procurement can enable innovation through digital supplier ecosystems and partnerships that benefit our core business?
How can procurement's data and spend analytics provide insights that drive better business decisions across the organization?
Based on your experience, how should we engage procurement teams to ensure they're aligned with and supporting our business transformation goals?
What procurement-driven value creation opportunities do you see that could strengthen our overall business strategy and benefit our internal customers?

View file

@ -0,0 +1,85 @@
STAKEHOLDER INTERVIEW TOBIAS
Date: 29 August 2025
Attendees: Tobias, Pieter, Patrick, Jeroen
Agenda (60”):
Framing & introductions (10” max.)
Interview
Next staps & wrap-up (5”)
Notes:
Pieters introduction: charismatic, empathic, clear, concise, …
Could be clearer on exact deliverables of the initiative
Lighting is not optimal in Pieters room
Q2: E-mobility questions for managers from outside the BU E-mobility
How well do you know E-mobility? Do you know the BUs primary strategic targets?
BOrn inSweden
Mgmt consultant
MSc Civil Engineering, nuclear domain & reactor, then treasury dept.
Thomas based in Stockholm, his major team in Berlin
Supporting 6 categories: solar, m&c, Finance, E-mobility, hydrogen
17 FTE, 6 team leads and strateg. Buyers, junior buyers too to share load incl diversity
I like procurement, because
People , great team to lead
In the center of transformation of industry (electrification)
To contribute to better world
What is the nature of your relationship with E-mobility?
Before was category manager of BU E-Mob
If at all, where and how can the collaboration between your team and E-mobility be elevated to a next level in service of Vattenfall?
Closely integrated already, sometimes surprised about decision and direction to jeopardize current state, to identify short-termed changes
Unclear changes on situations, short-term → difficult to adapt so fast to adapt better
Example:_ batteries to integrate into chargers → grid connections and revenue as criteria; so different solutions which lead to pressure and short termed adaptions
When handed over category manager role, one job was to NOT ACT until date fixed, so to prevent unused work → then acted on all initiatives, which overloads the team → creates informal leaders (Bastiaan de Jong vs. Stefano/Sven) → difficult situation then how to lead and give oversight → so to prepare answers wisely and having the pig picture, rather than just giving an answer
Collaborative mood? - great collaboration in super atmosphere, “special persons” now away, psycho safety awareness in the team without hidden agenda. So good clean healthy communication. Always to improve for sure.
To treat suppliers fair and neutral, some still preferring suppliers - this to be fixed → brand is in the core!
Q3: Tech vision & framework
This initiative aims to develop, implement and maintain the tech vision for BU E-mobility. How would you define a tech vision?
Tech vision feels for me like engineering focus → i miss the link to the customer needs. No to bombard him with 1000 technical needs, away from he really wants
Procurement can help focussing
Capabilities to shape better, to focus on corporate strengths → to identify our USP
We use a framework to cover all relevant aspects. What do you feel is missing if anything? SHOW THE STEERING WHEEL SEE SLIDE 3
Culture & strategy → not to underesimate CULTURE
Customer to put more to FOCUS
How strongly is digital transformation anchored in your procurement strategy, and what's your vision for procurement's role in the company's digital future?
Category deep dive running now → WORK IN PROGRESS
Catecory management tool, AI enabled: launched beginning of 2025, named: :-)
Q4: Procurement
From your procurement expertise, how can strategic sourcing and supplier partnerships accelerate our business transformation?
Procurement has a lot of experience and a time-tested framework when it comes to identifying and managing strategic suppliers (Fast-charging and AC suppliers) → Core values: Active, open, positive space
ABB, Kempower, Alfen are already supported this way. The others can benefit from this
What's your view on how procurement can enable innovation through digital supplier ecosystems and partnerships that benefit our core business?
If our roadmap is clearly communicated we can piggyback on an enormous amount of R&D budget on suppliers side, so that we can influence their R&D agendas in a way that helps the BU to be successful → Could be a multiplier to our R&D budgets
There is a lot of interest from the hardware team to explore many interesting possibilities, yet sometimes it feels like they are running without a compass.
How can procurement's data and spend analytics provide insights that drive better business decisions across the organization?
Procurement already has a supplier dashboard (SBTI - scientific based target initiative).
Based on your experience, how should we engage procurement teams to ensure they're aligned with and supporting our business transformation goals?
I have experienced that there was a bit more pushback for working with cat management. We now have a 5-point support approach, which has been time-tested. “Steal with pride”.
What procurement-driven value creation opportunities do you see that could strengthen our overall business strategy and benefit our internal customers?
Cooperation between Susanna Hurtig and Network Solutions was not helping in the past, lack of focussing on the bigger picture, that was annoying and I could not support that. Some individuals are still there and this has affected the relationships. Intercompany margins is not for procurement to get involved with.
5. Conclusion:
Anything else? Focus on Change Management → there is a lot going on within BU E-mobility. There may be a few who think “there we go again”. It is important to take that into account.
Do you have anything else to add in this context? Anything we missed?
change management to understand and to have a clear process
Interviewers: Thank the interviewee → Pieter

View file

@ -0,0 +1,257 @@
00:00 Ommeren Pieter van (SB): And I'm also still applying for the role, so I need to go to full formal process. Including talks, assessment, tests, everything this week. But now I'm done with that analogy. Yeah, yeah, he did it as well.
00:17 Winblad Tobias (FPSC): Oh yeah, yeah.
00:20 Ommeren Pieter van (SB): I must say I like the company.
00:22 Winblad Tobias (FPSC): Yeah, yeah.
00:26 Ommeren Pieter van (SB): It's it's good but but of course you need to prepare, right?
00:26 Winblad Tobias (FPSC): Yeah, but it's it's nice to get hit in the face and sort of. I mean, I've. I've never felt as stupid as when I did the assessment.
00:40 Patrick Motsch: This I know this I understand.
00:43 Winblad Tobias (FPSC): But yeah, but apparently I I passed so.
00:45 Ommeren Pieter van (SB): Yeah, yeah, yeah. You're still here? Yeah. So let's see if I'm still there next week.
00:51 Winblad Tobias (FPSC): Yeah.
00:52 Jeroen Haverkorn van Rijsewijk: So so the so the so the method works. The methodology works then, yeah.
00:55 Winblad Tobias (FPSC): Yeah, indeed. And I have. I have another meeting that starts at 2 by the way, and I need to prep a bit so if we can end maybe latest 1022 would be appreciated.
01:07 Ommeren Pieter van (SB): Then I will. Shall I then immediately kick off guys. So thanks for joining to be assured and thanks for also for the questions you raised. I'd like to introduce the initiative really quickly and then hand over to you and Patrick for introduction. But looking at the the DSH, this is my unit now digital solution in hardware. Any mobility, there's great people. A lot of great work happening and also huge potential ahead and I cannot say but. At the same time, many challenges and opportunities that we're facing and so I think we're often questioned about our strategy and quite often we don't have a clear answer. Things like how do we incorporate AI into our way of working? How do we further accelerate the automation in our system landscape? What do we think of plug in charge and what is our road map towards it? What should we buy and what should we build but also connected to hardware? And So what is our vision? On take offers on supplier management. On what is actually, how do we make sure we select the right suppliers? I think we have experienced this as well together, right where things change along the way quite often because we don't know or didn't think it through upfront. And also you mentioned sometimes to Mia. What is it that you want, right? So tell me because then we can better support you. And then please don't change it every time. I think it's fair, right? So. On the digital side, we have similar similar challenges. And This is why I discussed the Fabian. That would be good to start the initiative to come to a, to a vision and a tech strategy or tech vision and a strategy. And this is where H3, so eole and Patrick come in. I know you know it for a long time. Sort of. Us basically help from H3 company to support us in this journey. Because I really see it as a journey. Where we say, OK, we launched this initiative which is collaborative effort. So it's a Co creation to defining and accelerate our long term Technology Strategy and we decided to to start from top to bottom. So we don't want to to. Drown in details immediately, but we want to start basically from strategic level, which is why we will start with amongst others you, but also yetska from it and Fabian. But obviously along the way we will, when we've defined what we actually want to do, involve of course more colleagues on the pressure levels. So that is, in short, is it? Does it make sense they get what we were after a little bit from the initiative perspective?
03:51 Winblad Tobias (FPSC): So the expected outcome of this exercise is to have a documented and clear hardware and sort of asset management strategy is that. In a nutshell, or.
04:04 Ommeren Pieter van (SB): I would say technology vision, which is broader than that than it also includes for instance. But but if you now say we know that AI is coming name something. If you would ask me, what do we do with it? The answer is we don't know because we haven't looked into it. So this is an example for instance.
04:24 Winblad Tobias (FPSC): Mm-hmm.
04:25 Ommeren Pieter van (SB): That the level of detail, it's still still not known yet, I would say. But it should give a lot of guidance and an overall vision that should at least solve the problems that we're currently facing.
04:37 Winblad Tobias (FPSC): OK. Yeah. Clear. Thanks.
04:40 Ommeren Pieter van (SB): And I would like to hand over to Johan for the intro and next steps.
04:44 Jeroen Haverkorn van Rijsewijk: Wonderful. And then thanks, Peter and again wonderful to meet you, Tobias. I think you're in best in Berlin. If I remember correctly, or or Amsterdam still.
04:54 Winblad Tobias (FPSC): No. Yeah, exactly. The majority of my team is based in Berlin, so maybe that is why.
05:00 Jeroen Haverkorn van Rijsewijk: OK. Well then I was. It's it's, it's, I guess three times, right? But then with with with it has to be. Probably Burlington still cold. More Amsterdam, but good to meet you and maybe just before before I share a bit about myself to build 11 extra thing on what Peter said at the tech vision, but also to help, I think a clear deliverable is also to help. In fabulous words, DSH to. To. To to to to create a clear kind of a signature. So a signature present. So for an identity, right, Peter, that's what we also spoke about.
05:40 Ommeren Pieter van (SB): I think the unit, especially here.
05:43 Jeroen Haverkorn van Rijsewijk: And then the tech vision is one of the yeah, one of the deliverables in which that manifests. So it's also there's also a team building aspect within DSH and a wonderful that you were here willing to to talk to us in, in spirit of Co creation. So yeah. So I've been wearing several jackets. Since 2018, but that's when I started first working with Peter and his colleagues from the BUMT. Back then, with Thomas and Stefano and Eric, and all of them. And so we've seen quite a few teams and yeah, very excited. Now with this with. This context. I'm Dutch. I'm based in east of the Netherlands. Let's say Greater Amsterdam, three kids and. I've been an executive coach and boardroom advisor for about 1 1/2. Decades. Yeah, and very, very happy to welcome Patrick alongside me, who is an absolute expert on the on the specific topic or I come more also from the leadership culture change management strategy side better comes from the from the side that he can now explain himself. So that's great.
06:52 Patrick Motsch: Thank you. My name is Patrick. I'm based in Switzerland, originally from the French part. Now I live in the German part I'm. Would say I'm what is important originally. I'm civil engineer and from another domain. This helped me because recently I did data centres. My whole job was a long time to plan build hand over data centres in the northern part of Switzerland for a touch company. It was at that time and based on this I'm skilled. I would say an infrastructure and company. Combination with management skills and also management coach. My core competence is digital transformation combined with AI integration and in this field the major of topics I have is to communicate to people and the way how we interact together. I have three kids and a nice wife, so now I'm done.
07:43 Jeroen Haverkorn van Rijsewijk: Thanks. Wonderful.
07:46 Winblad Tobias (FPSC): So the and the kids are not nice then, right?
07:47 Patrick Motsch: Good observation. Sorry, talk to talk when you say this. Yes, I had a girl. The girl was very nice and I have two boys. OK.
07:58 Jeroen Haverkorn van Rijsewijk: Yeah, yeah, I'm afraid we're not going to make the time. Toby is when we start talking about kids. So, but yeah, no. Maybe one to two add. So thanks Patrick. And to add, maybe one thing on my side, so I back in the days actually studied computer science, artificial intelligence. But that's already quite a while ago and I've been helping to be you not only to be UMT, but also the various teams, and I'm helping. So the various teams reporting into the BU M. The over the years, including their snows and and central teams, and now helping Peter with this in this context. So maybe over to you if that works at Tobias, then we have some questions and. Unless of course, you want to ask us some questions before. Are you good to? Good. Good to go.
08:49 Winblad Tobias (FPSC): I can give. I'm good to go. I think I can give you my one minute executive summary of who I am and.
08:57 Jeroen Haverkorn van Rijsewijk: That's our first question, so that's great.
08:59 Winblad Tobias (FPSC): Yeah, alright. Right. So born and raised in Sweden, I've been working with the company for quite some time. So that as a management consultant, I also I'm I have a Master of Science in in engineering, so also a civil engineer I've been and also. Studied sort of my my core competence. Is actually a nuclear engineering. So I'm I'm I'm I majored in quantum physics. So that's where I'm originating. And 15 years ago I wanted to deploy my sort of knowledge in the energy sector and it was either solar or nuclear. And then solar 15 years ago was basically nothing. So I decided to go nuclear, so that is where I spent most of my time designing course and bundles and and nuclear sort of. Sort of. The the bundle that goes into the reactor so the reactor design and also the sort of the the bubble, doesn't really. It's not a one to one fit with what I'm procuring and supporting the business with now, but it's it's where I'm where I'm from, I spent quite. A few years, also in the Treasury Department. So managing currency exposures of buying and and selling. Swaps and financial instruments. And. After that I transition to procurement and I've been leading a team that is growing. For now, I think it's three years and. So I'm supporting 6 categories we define from procurement that we work with category management and and the main category that I'm supporting in addition to VOE mobility then or E mobility or evsc is solar large scale solar batteries, hydrogen marketing and communication and finance. So I'm sometimes it feels like I'm a bit schizophrenic, so I'm all over the place and and nowhere sometimes.
10:56 Jeroen Haverkorn van Rijsewijk: So solar marketing and communication finance.
11:01 Winblad Tobias (FPSC): Hydrogen.
11:03 Jeroen Haverkorn van Rijsewijk: Hydrogen.
11:05 Winblad Tobias (FPSC): And yeah, so now.
11:08 Jeroen Haverkorn van Rijsewijk: OK, but no nuclear anymore.
11:08 Winblad Tobias (FPSC): No, not yet, at least we're. I think that you have seen in the news that it's it's a big fuss in the media nowadays that we have down selected down to two suppliers that we are preparing to build a new small modular reactor in the on the West Coast of Sweden. So it could. Be I mean a battery that's an advanced battery in a sense. With a. With a pressure cooker inside integrated. No, and I'm living in Stockholm. I only have two kids, so not 3. That's the rest of you. But I I think I keep myself busy with those two girls anyway. They're five and seven and definitely a handful and and I have sort of two nice girls and a nice wife.
11:59 Jeroen Haverkorn van Rijsewijk: Well, that's let's celebrate that during the school. That's good. Tobias, thanks. Wonderful. Yeah. Thanks. Yeah. And so and so your team. How big is your team? I mean, Peter knows but.
12:14 Winblad Tobias (FPSC): I have 17 FT XS right now with 16 leads and. Strategic buyers. Basically all of them, but I have quite a few. Sort of union buyers as well. So I'm it was more or less when I inherited the team we were nine and it was mainly grey foxes. To put it mightily. And and now I've been able to put a bit more energy into the team and and a bit more diversity. So I have more. More ladies and also more younger and promising individuals. So. A nice team.
12:52 Jeroen Haverkorn van Rijsewijk: And what? Yeah. Nice. And it sounds nice. Just maybe one last maybe in a few words. What do what do you like most about your about, about your work in, in procurement? What? Yeah. Gives you energy, let's say.
13:07 Winblad Tobias (FPSC): Well, within a picture I mean the the, the role that I have, I would say the the people, I mean I really like that I'm in this in the center of the transformation of the industry that we're facing in terms of electrification. I mean, it's definitely why I. Go up in the morning or to to leave a better place for my 2 girls than. The the world that I that I was born into. That's very I I. I live and breathe our purpose. That's and I think that that is also a common denominator with my team. I'm I have a great team and they also give me and they seem to be happy with me. They give me a lot of positive feedback at least so.
13:52 Jeroen Haverkorn van Rijsewijk: Great, good. Thanks. Thanks. Yeah. And indeed, I think that at least I feel that's also true for most, if not all people I meet within the BU E mobility. I haven't been a lot outside of being with you in front of so many purpose driven really people wanting to contribute to this transition. So that caused lots of energy to to to be there at fulfillment. Thanks. So next question.
14:20 Winblad Tobias (FPSC): And maybe worth mentioning as well that before the the sort of I've been needing this three in three years and then before that I was. Dedicating most or basically all my effort to BUE mobility because I was the category manager for BU Mobility. So now I'm a bit further away, so I'm I'm still familiar with how it was run when when you mentioned Stefano and Thomas and so forth. I'm still keeping in contact with Peter and and I and also with Fabian. But but I'm a bit more distant, used to the fact that I need to prioritize my time, and I don't have.
14:55 Jeroen Haverkorn van Rijsewijk: Yeah, yeah, yeah.
14:56 Winblad Tobias (FPSC): Even though it's so I have, I think that I know at least. Quite quite a bit about mobility and the journey.
15:05 Jeroen Haverkorn van Rijsewijk: What? Yeah, yeah. Wonderful. Yeah. Yeah. Peter, you are. You already told us about that, that you and the Tobias knows a lot about you. And see. Yeah, and. And the journey and, well, what a journey it has been. And it's not yet. And it still is, let's say. Let's do it like that. Wonderful. So. I think maybe the next question would be. How do you feel the collaboration between your team and immobility can be? Can be elevated to the next level. Let's say in service of Father. What would come to mind comes to mind.
15:45 Winblad Tobias (FPSC): Well, I think Peter already mentioned that that to to I think that we are very closely integrated, but sometimes for some reason we are still a bit surprised with the decisions or directions that are completely in opposite of what we thought we would support the BU with and. Then all of a sudden we take the the example that comes to mind is the battery integrated charger. Where where? We were more or less. Advised. Store. I wouldn't say force, but at least it was a lot of effort that we put into making sure that we had a solution in place. Fabian was really keen on having it. Well, yesterday rather than tomorrow because we were losing a lot of money. We had EBITDA figures that that was sort of provided to us and it was a forecast that was more or less bankable with 50 stations. And then I'm exaggerating. A bit, but that is in a nutshell. What I'm and then all of a sudden one month passed after we signed a contract, another one, and then we didn't see any orders and we were a bit OK. So what? What happened along their journey? I mean, why did we put other stuff aside and prioritize on this issue when apparently it wasn't that important? So that I think, can be even further. Her enhanced sort of the the communication and what would be, how would she could should we prioritize our efforts to best meet your strategic ambitions when it comes to solutions that that we can then provide to you from the supply base?
17:29 Jeroen Haverkorn van Rijsewijk: Yeah. And could you repeat the specific example that battery, what did you call it?
17:35 Winblad Tobias (FPSC): Yeah. Well, where we have batteries that are integrated into the charger. So one of the main I think Fabian always mentioned that two of the main challenges that eBay mobility is facing is grid connections and and sort of revenues or or utilization or what is it's not the correct word but.
17:58 Jeroen Haverkorn van Rijsewijk: Usage, yeah.
18:00 Winblad Tobias (FPSC): Yeah, usage. Yeah, maybe that's easier. Easy enough, and one of one of the one of the solutions is to make sure that we reinforce the grid, in particular in Germany with buying Transformers. Another one would be to integrate batteries.
18:14 Jeroen Haverkorn van Rijsewijk: OK. Yeah, yeah. And that was a recent example where you experience these. A lot of pressure and then a little result, but was there also? Yeah. OK. So and then, so communications is what I hear you. That's where where we can throw better, more frequent or communications? Is that what I hear?
18:38 Winblad Tobias (FPSC): Yeah. But, but I mean now also being very open and transparent. One of the things that I actually sorry. Yeah. One of the things that I went when I handed over my category management role to chainer, one of the tips that I gave him was to not act. Until you give it a day, because things can change, and if you sort of act on the emails and and the directions that you get one day the other day, it could be completely different. So what we need to do is to sit back, take a deep breath, and not be sort of acting on all of these initiatives that are coming from right and left and also to really figure out who is it that we should listen to because there are so. Many opinions. And we need to have one BU mobility voice. And that is one thing that has been lagging or lacking. So because there are. There are informal leaders, I. One one of the. Out one of the one of the informal leaders that I engaged a lot with was Boston de John used to give you a great I think that he's still around, right?
19:50 Ommeren Pieter van (SB): Yes. Yep.
19:53 Winblad Tobias (FPSC): Yeah. And then he has. He's really opinionated and could build a lot of momentum. It's my perception in the organization and then that could deviate from Stefano's perspective on what should be the Orson Jasper's position. So it it was a bit complex to really navigate and and to. To really be clear on what direction is that the right one and and who we should listen to?
20:19 Jeroen Haverkorn van Rijsewijk: Yeah, clear. So then on your side, indeed not responding to every e-mail, but maybe take a breath and see what's still true tomorrow. But on BU inability side more clarity.
20:39 Winblad Tobias (FPSC): Wouldn't say not responding to emails, but I would say do not respond directly.
20:42 Jeroen Haverkorn van Rijsewijk: Yeah, yeah, I don't. Yeah, I mean, indeed, taking a breath and and.
20:47 Ommeren Pieter van (SB): And connected to that, we have seen to many more of these examples right where there was a there was a tender process started with an ambition and along the way it changed and not sometimes even more than once. The question is, do we actually know what we want?
21:05 Jeroen Haverkorn van Rijsewijk: Yeah, yeah. And what I what I what? I then what? I conclude I don't hear you say. But what I conclude is that what would also benefit this collaboration is improved. What you said. Who can actually decide? But that translates into my head as a clear business processes with clear roles in within those processes and a more kind of a discipline to keep to those processes. Something like that happens then in me, but maybe I'm. I'm I'm going places. But I mean, there's also something on the bubbles side. That can can help to elevate this collaboration. This black point here, OK. Wonderful. How would you say would you say the how is the general mood, let's say in the collaboration? Is it? Is it positive? Is it friendly? Is it engaging or is it also? Is it not so much of that what you maybe?
22:14 Winblad Tobias (FPSC): No, I think that that is that is one of the reasons why I still have my my buyers in and and why they are motivated because it's they have great fun collaborating and and I think that the atmosphere is is is super we've we've had in the past. A few. Exceptions to that, but those I think there was very much tied to specific individuals and and they are no longer there. And so I think that that is definitely. I I feel that's one of the. Things that I'm working a lot with within my team. Psychological safety I think that was for a time period, not there where certain individuals were afraid to speak up. And now I feel the opposite, that it's very open, very transparent and there is no hidden agenda or any. Blaming games or or anything but, but we need to also make sure that we can challenge each other and and be clear and crisp about what what we need to support you. And that is definitely.
23:13 Jeroen Haverkorn van Rijsewijk: Yeah.
23:13 Winblad Tobias (FPSC): Where I see there is still room for improvement and also one-on-one of the core sort of purposes of of procurement is to make sure that we treat our suppliers fair and transparently. And I still have the tension that some individuals have a tendency to prefer certain suppliers rather than focusing on demands and and technical requirements so that we can openly support. And and drive our process. And it's natural. It's not something that is unique to bemobility, but that's that's something that we continuously need to work with to protect our brand. When we then go to the market next time.
23:57 Jeroen Haverkorn van Rijsewijk: Right. Thanks. A couple of questions on tech, the tech vision. So firstly. Yeah. When we say these and Peter is framing what what comes to your mind, how do you? How would you define the tech vision? 'Cause it's it's not set in stone. We have a lot of thoughts around it, but we also would love to, yeah, be in the space of Co creation to make sure that we are actually creating something that. Yeah, it's connected and and makes sense in in the context in which it should land.
24:33 Winblad Tobias (FPSC): You know well for me, honestly, when I heard the word, when I hear the word tech vision, it feels like we would. It's engineering focus and a lot of technical capabilities well, I think. One of the one of the sort of missing links that I have felt at least a couple of years ago is sort of the the customer needs. How do we make sure that we are not? Bombarding our customer with a lot of technically advanced solutions where they are saying OK, nice, but I don't need that. And and how do we then connect the dots from the supply side with their R&D capabilities? Because procurement can give you a mobility access to a lot of R&D capabilities rather than focusing on our R&D capabilities in House, I mean there are still 2030 or 40 suppliers that when, whenever. We enter a hardware tender that they are super keen on working with us, even though we haven't. Bought anywhere close to the volumes that we have put out to the market. Year to date but but still I think that is that that is what I would hope to see, that there is a red thread from from the customer and to the capabilities that we have and that we actually. Focus on our strengths as a company that we are an integrated utility that we have a really strong sustainability agenda and focus and that if you want to choose should be very clear that we have offerings that other CP OS don't have with when it comes to green.
26:15 Jeroen Haverkorn van Rijsewijk: OK.
26:16 Winblad Tobias (FPSC): Electricity when it comes to loyalty, there is a lot of. A lot of solutions that you can build and integrate. If you start with the customer and put that in focus.
26:28 Jeroen Haverkorn van Rijsewijk: Thanks. So we actually have a, let's say, a prototype. I'll share that. Which we feel at least covers. At least these aspects should be in it, and as you were speaking, of course I was checking whether we actually have customers. We do, even though maybe not super prominent, but we have them here with engagement now there. I mean we will go into this. We will bring this also to the kickoff and then we can read it. I could like explore it together and we're going to flesh it out. Also based on the interviews of course, but at a high level. We feel leadership is at the core of making this into a reality. Of course, you have the culture strategy and an operating model to enable that. All that within. Within the the context of data and AI equality. And implementation. So if you look at this, is there anything? And I know, I know it. I know this was very fast and and we actually spent a lot of hours on this and I'm not doing that any justice, but like kind of from the first five, this is kind of is anything crucial missing. Let me maybe put it that way. When you, when you look at this with the limited knowledge that you have now. About this.
27:56 Winblad Tobias (FPSC): Yeah, that's. That's, I guess why we would pay you for helping us with this, but no. But I mean the first glad there there is a vote that comes to mind when I see culture and strategy. That culture eats strategy for breakfast. So I think the culture element of this is I think should not be underestimated. I think culture is really. Where? Where it where it starts and ends.
28:25 Jeroen Haverkorn van Rijsewijk: Very good. Yeah. I'm fully with you.
28:32 Winblad Tobias (FPSC): I've done that. I think that customers should be a bit more visible than underneath engagement.
28:37 Jeroen Haverkorn van Rijsewijk: Yeah. Clear. Clear. Thanks. Yeah, that's super helpful feedback. Wonderful. So back-to-back to you. Back to not looking at a PowerPoint, I mean. Maybe the last question for me and then switching to Patrick. And then I will take over the note taking. Patrick, thanks. I'm looking at a Google Doc which is being filled. Thanks to Patrick as well. Next to AIRAI note taker. Umm. Within procurement, yeah, what initiatives or trends or or things are relevant for us to to know or maybe there are documents that that would be really helpful for us to receive as well. So we can. Be of better service to to this initiative.
29:32 Winblad Tobias (FPSC): Just just by chance I requested a category deep dive on Monday together with my manager and we went through all of these categories of view. Imbility was one.
29:41 Jeroen Haverkorn van Rijsewijk: OK.
29:42 Winblad Tobias (FPSC): Then we had five additional sessions that I think also it's very interesting, but maybe not for you at this stage. And I can just give you a glance and I'm happy to share that in hindsight. What I was now you disappear, but you can see my screen I. Hope and it's only we tried to condensate it with four slides where this is the strategic landscape. The the sort of services and hardware that we're buying. But insights in the maturity and and the the pricing level. So it's more sort of procurement focus. Here or how we translate the needs to negotiate? These are the initiatives that we're currently working on. These are the key trends that we have identified and the risks and how we respond to those and also another sort of the last picture is very much driven out of our category management. Framework. So these four slides I think would potentially help you to respond to those questions that you raised.
30:50 Jeroen Haverkorn van Rijsewijk: Fantastic.
30:52 Ommeren Pieter van (SB): Yeah, 100%.
30:53 Winblad Tobias (FPSC): So I'm happy to share that with you after this. And then rather than going through because going through that will take me more than 30 minutes.
31:03 Jeroen Haverkorn van Rijsewijk: For sure. No. Amazing and great timing then.
31:07 Winblad Tobias (FPSC): And then if you I think if that's more efficient, if you look through the PowerPoint and then if you have any questions, I'm happy to elaborate on or potentially also reaching out to Chainer who is then the category manager within the team.
31:18 Jeroen Haverkorn van Rijsewijk: Yeah, yeah. Yeah, yeah, yeah, for sure. Super thanks tobius. And that would be very helpful if you could indeed share that with us.
31:30 Winblad Tobias (FPSC): Well, I share that with Peter and then you you take care of the distribution, Peter.
31:34 Jeroen Haverkorn van Rijsewijk: Perfect.
31:35 Ommeren Pieter van (SB): Thanks for.
31:39 Jeroen Haverkorn van Rijsewijk: Last question, I think it's you gave it to me. So how strongly is digital transformation anchored in your procurement strategy? And what's your vision for Procurement's role in the company's digital future?
31:54 Winblad Tobias (FPSC): Well, we have actually recently deployed a category management tool that is called searcho that is based on AI where we do some prompting about what, how does the market look like. What are our levers that we would like to focus on? And then it sort of spots out a category plan? So we already integrate AI into developing all of our category strategies now going forward and that is something that recently was launched at beginning of this year. So we are, I think also from procurement, we are lagging a bit behind in terms of AI, but we are ramping up and there's a lot of lessons learned along the way with utilizing this tool and so far so good. It looks very promising even though there are. Some hiccups.
32:39 Jeroen Haverkorn van Rijsewijk: Yeah. Wonderful. Thanks torias. That's it for me, Patrick. You take over.
32:45 Patrick Motsch: Perfect. I have some 234 questions about the procurement itself, about the supporting role that you also have for us and especially your expert role in this. So first what I would like to be interested if you can say something the strategic sourcing and the supplier management that you do, how you could support us with these disciplines in our business? What do you think?
33:07 Winblad Tobias (FPSC): In terms of supply relationship management, you mean or?
33:11 Patrick Motsch: Yes.
33:12 Winblad Tobias (FPSC): Well, we have a lot of experience within the company when it comes to managing our strategic suppliers and we have a framework in place that we have deployed for all of our identified strategic suppliers at least for the the fast charging suppliers and also the AC suppliers, so. We have defined how we would, at least from our perspective together then with Stefan Lutz, who has also been around for quite some time. How we engage strategically, tactically and operational. And the strategic element is agreed that it's something that we will support and we will follow that framework where we make use of our core values or. Well its core values now. It's not experience principles any longer. It goes back and forth within the company, but active open, positive and safe. And then we we find, well, we build up with, with, with some questions and then self-assessment where where we rank from 1:00 to 5:00 and then we have. An open conversation with the management team on. The performance and then how to translate that into sort of tangible initiatives? I I keep it very high level now, but that is in a nutshell how we support.
34:26 Patrick Motsch: I already I tried to summarize, so this is means we can profit from a framework that you have that you have aligned that you have adaptative straight and forward and you can support us using this framework that we all are fast.
34:36 Winblad Tobias (FPSC): That's what we're currently doing. I think that we can definitely enhance that even further. So we are doing it with with some suppliers really advanced with with sort of ABB and and chem power to some extent. But ABB and ALPHAN comes to mind. The others might need a bit more push. And I'm I'm a bit uncertain about the future of C tech. I don't all of the details in in front of me, but. We can definitely make use of the already existing framework. How we work with suppliers from procurement.
35:12 Patrick Motsch: Perfect. Thank you. An Intel questions just because we are curious because it could have an impact on us. What's what is your personal view on how procurement could enable innovation through an EMT's work, digital suppliers, ecosystems, digital supplier ecosystems. What would you say about this? Your opinion?
35:32 Winblad Tobias (FPSC): Yeah. Well, I I don't. Well, correct me if I'm if I'm out of scope of your question, but I I think I mentioned that already that I think we could definitely make sure that if our road map is clearly communicated to our suppliers and also the supply base, we can piggyback on a. Enormous buffer of R&D budget that we cannot do by ourselves. So I think that that is something to be clear on if we. If we can push or get support from the market, but it starts with also getting a bit clear on what we would like them to focus on. So they are not doing what they think is necessary, but we can actually influence and that starts with them being clear. On what we would like them to focus on, I think that there's still a good appetite for them to to listen to what we need and then. We would. Well, we we have a. What is sort of a multiplier of our R&D budget, if we can use that wisely?
36:43 Patrick Motsch: You've got the perfect. What was my Commission? I try. I try carefully to summarize what I understood is we are not yet there that we have shaped. What are our needs in the digitalisation business that we can align the suppliers and to categorize what we need from who? But we are on this road to define this would be summarise it correctly or what would you say?
37:05 Winblad Tobias (FPSC): I think to some degree we, we all you already know when it comes to ISO 1511, although it's the kind of sort of initiatives that we've been talking about with OCPD 2.0 those abbreviations with. But how do we actually? How can we make sure that we then can translate that into some tangible customer value? That is the missing element? I think that is where.
37:30 Patrick Motsch: Good to transform it to formulate what kind of service or component we need. This point is this is still open. Did I get it?
37:40 Winblad Tobias (FPSC): Yeah, I think that there is a lot of a lot of interest from the the guys and girls within the hardware team to explore all certain innovative aspects. But sometimes it feels like they're running without the compass, to be honest.
37:56 Patrick Motsch: So clear. Make sense then about procurement state that you have much state. You also expressed it before the the KP as that you measure the alignments of that you have the cutteries that you have. What do you think? Could there be something in for us that we could use better? Something like a dashboard or what? You just said before. Some some category list or analysis? What do you think about this? Could there be some some service from your side, from procurement or what could we expect? I ask like this openly.
38:25 Winblad Tobias (FPSC): No, but we already have a a supplier dashboard. I mean it it it was mainly driven out of the SPTI. I mean the scientific based target initiatives and used to track the suppliers who have signed up to that, but also when it comes to Echo, Vades and EPD's. And so it it has grown a bit. So we already have that in place and in particular, if I go into. That system and look into alpha and I get a lot of business intelligence. And so from from that.
38:57 Patrick Motsch: Perfect. Next question. I just keep because, well, it was about your experience how it can be enhanced, the engagement of procurement teams on your site with our teams that they are aligned and supporting us. I think this already had in deep this collaboration that we can enhance or you have some some more comments that you will give on this because I think you already said it.
39:19 Winblad Tobias (FPSC): You know what? I think that there. Maybe again, I've experienced that there was a bit more push back from working with category management in the past and now I I mean we we have a five step approach or a sort of a continuous circle that we are deploying for all our categories and I think. That is, it starts with. How does it. What is the status as of today? What is the strategic outlook if we continue the way that we are doing today? Will it serve the purpose that we have or sort of the ambitions that we have? And I mean we we can support you with, with, with, with guidance on driving these strategic initiatives through that model. It doesn't mean that we would. Give you a strategy, but it we can act the enablers or or facilitators.
40:12 Patrick Motsch: You contribute. Yeah, I facilitate good things now. Afterward, good. You can facilitate us by your experience as.
40:22 Winblad Tobias (FPSC): Yeah, I think that that is one of one of the one of the corporate ditches that we sometimes end up with throughout the company that we are eager to reinvent the wheel. When we do have a lot of capabilities in the House already. So still with pride, that's also something that I continuously ask to to sort of share across not only BU's but B as and. Make sure that we are not. That's also part of the excellence ambition. Is that we have and the expectation from our CFO.
40:57 Patrick Motsch: Good, good expectation. So last question, you are experiencing external suppliers. We have internal customers and suppliers. Is there something that you could give us from your experience that we should integrate or think about when we exchange now or adapt our business strategy?
41:18 Winblad Tobias (FPSC): In relation to your internal customers.
41:21 Patrick Motsch: About relations. Yes, relation about our I speak about, we say our internal customers we also contribute services internally not to external customers. It's the collaboration between the teams. Is there something based on procurement work on procurement expert that you do that you say guys internally you should think about this and this that you do it better?
41:39 Winblad Tobias (FPSC): Well, I don't if that is still the case, but that annoyed the hell out of me when I was exposed to. It was mainly, I think, the cooperation between Susana Huttig and the Network Solutions, because Network Solutions they sell power as a service and then they wanted they. They obviously also talk to customers and then they need then the support by the BOE mobility and then they wanted to. Buy some some chargers and then all of a sudden they were exposed to a 10 or 15. 15% margin on top of the already negotiated prices and I said I will not support that from procurement. You need to figure that out with with an SLA internally. But I I was really depressed with the lack of focusing on the big picture as well with with having just your own P&L in focus. That's something that should not be there within the company that I will never support those kind of. Initiatives where you try to. To boost your own figures. So that's something to and I think that for for some individuals, they are still there. And I think that that the relationship might have been affected by that experience.
42:52 Patrick Motsch: OK, I understand now. Great point. Also to follow the Intel corporate rules and boundaries.
43:03 Winblad Tobias (FPSC): Yeah, yeah, yeah. But that is, there is no internal rules on on the on those topics. It's more when it comes to those arm lengths, but the procurement will not support with with. With those kind of intercompany margins.
43:21 Patrick Motsch: Good point. Important point. That's it. From the questionary. So did we forget or did we miss anything that you after discussion all these points that we had together that you say hey, this is something that it would like to give you. You already said or. So for this tech vision that you want to do that, we don't do it too much engineering driven. These are already wrote, but are there more points that you tell us when you do these round guys think about this.
43:53 Winblad Tobias (FPSC): Hmm. No, no, I don't think so. But I think that there has been. A lot of changes within BOE mobility and yeah, you need to figure out how to how to work with change management. That's that's definitely core. And then so that I know that there are quite a few that will feel whole here we go again. But how to then make sure that it's understandable why we need to do this? That's. And also with the I mean it's something that I think is still confidential when it comes to these rotten fallen customer investor direction, but that will have an impact on the on on BU on the BU. So.
44:41 Jeroen Haverkorn van Rijsewijk: Yeah.
44:41 Patrick Motsch: Thanks.
44:43 Winblad Tobias (FPSC): Yeah.
44:43 Jeroen Haverkorn van Rijsewijk: Thanks and. Yeah, we didn't. I I I should have mentioned before, but indeed like Peter said, please be open. This is confidential set up. Obviously we do have an AI note taker. It's it's been. It's it's a GDPR compliant and everything and runs on EU servers as well. I find it important to to share. We we use that for our own purpose only, and those are also available to to Peter and to to you. If you want to as well as part of this Co creative exploration. So just just to to note that as well. Thanks Peter. Back to you, I think.
45:30 Ommeren Pieter van (SB): Yeah. And then I will. I will round off in 2 minutes so we give you the the 10 minutes you need, hopefully even a little bit more. First of all thanks. I find it's very I found it very interesting and I've learned a few new things. For instance, on the Ind budget. Topic you mentioned. Maybe you've mentioned it before to me, but now now it really sticks. Finally, and thanks for the for openly sharing and and not always new for me of course, but I think it's it's good when we have these interviews to yeah. Have us all on the same page. We will for now in the next two weeks, finalize interviews with all senior stakeholders. Jetzka from IT. You are the one from procurement. We will talk to the SN OS to funny and Fabian. So those will will be taken into account as a first round and then we will basically take all those feedback, everything we're learning through consideration to design the kick off session. You will also be part of that. And from there we will start the program, which is still also a little bit unknown. Because we based also on the interviews, we have a structure for it that what we will exactly do, and by when it's also something we will define over the next few weeks. So that is it actually. Yeah. Thanks a lot.
46:45 Winblad Tobias (FPSC): Well, happy. Hopefully you got something out of it and then happy to. To to support and give you feedback. I know that I've been also challenging the the BU when I was in in sort of more involved in in certain things that that that I felt was not really working in the right direction. So I'm happy to to try to avoid getting into those corporate ditches again, and if there is anything, any specific question, I'm I'm happy to elaborate. As I mentioned, for these PowerPoint them.
47:20 Ommeren Pieter van (SB): Yep.
47:20 Patrick Motsch: Thank you.
47:21 Ommeren Pieter van (SB): Thank you so much.
47:23 Winblad Tobias (FPSC): All right. Good. Yeah, same to you.
47:28 Ommeren Pieter van (SB): All right.
47:30 Jeroen Haverkorn van Rijsewijk: Nice meetings.
47:30 Winblad Tobias (FPSC): All right, bye.
47:32 Patrick Motsch: Thank you. Bye.
47:32 Jeroen Haverkorn van Rijsewijk: Ciao, Ciao.

View file

@ -0,0 +1,18 @@
0:00: So, good evening, , Patrick.
0:03: , a voice app to brief you on tomorrow's stakeholders, , elite and funny, , elite, , both female leaders, both.
0:17: Strong leaders, I would say in their own right, , Ali being Dutch based in Amsterdam, , has succeeded Peter after he left to, , do a one year stint as director of Germany in Berlin, which he is now ending, , as he, , takes on the role of director of digital services and hardware.
0:46: But Ali was very much .
0:49: Yeah, Peter's right hand, so to speak, in the.
0:53: In running the .
0:55: Sales and operations unit in the Netherlands.
0:59: , she is a lawyer by degree, , went, I think, into like public, , relationships and communication and gradually ended up, , more in operations, being very successful in the Dutch tenders, , , which, , was an important and is an important part of, .
1:27: Of, , of the, of the, the Dutch success, , and still is very much a driver of the BU P&L.
1:41: So she's, , I would say she, she describes herself as herself as a red in terms of color theory.
1:50: , now it depends a bit on which color theory you're talking about, right?
1:53: But this, in this case, red means results, so she's result driven and oriented, , yet also super fun to kind of hang out with and good sense of humor, , so also in that sense I would say a warm personality.
2:09: , yeah, I think mother to two children, , probably in the range of .
2:17: Yeah, let's say 6,7, and 9, 10-ish, I think, , from the top of my head, and I've been , well, so I, I had, so I, I was, , helping, supporting Peter to make a step in the team development, and then she took over, so I ran a few sessions.
2:41: Also with her as the new leader for the Netherlands.
2:46: , and I really enjoyed that collaboration.
2:50: , A bit hard to really connect to on a deeper level, but definitely very easy to connect to.
3:01: , when it comes to achieving results.

View file

@ -0,0 +1,333 @@
00:00 Ommeren Pieter van (SB): Early morning for you? Or did you travel flying yesterday?
00:00 Jeroen Haverkorn van Rijsewijk: No, actually I went with a train yesterday afternoon. It was very relaxing. Yeah, I was here at. I was in Berlin at 6:00. I thought. Give myself a bit of a break and prioritize health, and that was very good. Good decision, yeah.
00:19 Ommeren Pieter van (SB): So the train was on time and all cool.
00:23 Jeroen Haverkorn van Rijsewijk: Train was on time and it's direct train, right? So no, no stress. So yeah, yeah. Amid.
00:33 Ommeren Pieter van (SB): Hey, elite.
00:34 Jeroen Haverkorn van Rijsewijk: Good morning. Yeah, we're in English because of Patrick today, but.
00:41 Patrick Motsch: I see. Yes, it's the Dutch company today.
00:45 Jeroen Haverkorn van Rijsewijk: Yeah.
00:48 Patrick Motsch: This this I cannot offer. This is too difficult for me.
00:51 Jeroen Haverkorn van Rijsewijk: The the fool for us of the Netherlands.
00:55 Ommeren Pieter van (SB): I would say with AI rapidly developing, how long will it take before we could just speak your own language?
01:03 Jeroen Haverkorn van Rijsewijk: I think you already can. Actually, there's already. I think Google has something that you can just speak your own language and it will talk back.
01:10 Patrick Motsch: With the headsets you can real time to real time translation, yes.
01:15 Jeroen Haverkorn van Rijsewijk: Yeah.
01:17 Ommeren Pieter van (SB): All right. So we were just quickly checking in. On the on the morning and how everybody's doing. So how are you doing elite?
01:28 Wessels Boer Alied (SB-M): Yeah, I'm OK. I'm fine. Yeah, will be another busy week, so. But I'm fine.
01:52 Ommeren Pieter van (SB): Cool. Are you Patrick?
01:52 Patrick Motsch: I'm very good this morning. Wonderful day, not too hot.
01:52 Ommeren Pieter van (SB): Not too hot.
01:52 Wessels Boer Alied (SB-M): Where are you located, Patrick?
01:52 Patrick Motsch: In near Zurich, in the how far area to the mountains, we had some really nice days latest days and now I'm happy to have a little bit rain. It's it sounds strange, but at the moment I'm happy when I have to work in the office.
02:04 Wessels Boer Alied (SB-M): OK.
02:06 Ommeren Pieter van (SB): Are you yelling?
02:08 Jeroen Haverkorn van Rijsewijk: Yeah, I'm good. As you can see, I'm in the waterfall office.
02:12 Ommeren Pieter van (SB): Brilliant office.
02:14 Jeroen Haverkorn van Rijsewijk: Yeah, the Britain offers. I'm. I'm sitting in the room where normally at a Fabian or someone else is sitting. When I meet them virtually. So that's nice. I met Fabian also just now back back from holiday, so I told them a bit about. How we kicked off last Friday, if you're happy. But yeah, good to good to be here. Bit bit bittersweet because it's it's back at work, which is only one and nice, but we have we had such a nice summer vacation with so many nice family memories that yesterday there were tears when I left. And and and also with me. I was like stuck so bad to be away from family. But in a very good way. So happy to to be here. Yeah.
02:55 Ommeren Pieter van (SB): Cool. And I'm also happy that I will also introduce the the program. Good weekend, very busy weekend and also with football matches in the morning. So Saturday morning, 8:00 on the IT was quite early. But a bit good weekend and also did some surfing yesterday again which was also nice. I did a course during summer and now practiced another while another one yesterday. So it was nice. And now we're back to work. And we're here for the for the tech vision initiative. And I will immediately kick it off. Maybe already shared some things with you elite, but I think we, we we started from the from the angle of of these age where we see a great unit with great people, a lot of great things happening but also a lot of challenges and opportunities that we're facing. And if you look at strategy, we're quite often questioned about it. I'm not looking from the DSH perspective. When it comes to AI. How to incorporate AI? How can we accelerate automation in the system landscape? What do we want with plug in charge? What are the bigger themes? We should invest in should we buy? Should we build? Same things for hardware for connecting charge. When do we want to do it? When what are the boundary conditions? Strategic supplier management. How does that look? So there's a lot of questions and we launched this initiative. As a collaborative effort to to define and accelerate that vision or the Technology Strategy. And we're here with H3 company, so famil familiar face Patrick, new face to support us in this journey. And we start top from top. Basically, we start from the top. To to basically. Also refrain from details at the start. So we have interviews scheduled this week. With basically you or S. No directors funny and yes from it. And Tobias from procurement and after that we will really define and kick off the program. Then I would like to hand over to you.
05:08 Jeroen Haverkorn van Rijsewijk: Yeah. Wonderful. Is that enough for as an intro for you anit?
05:13 Wessels Boer Alied (SB-M): I think so, yeah.
05:16 Jeroen Haverkorn van Rijsewijk: OK, good. Yeah. So. Indeed. Some time ago and Peter and Fabio and approached me to to support this initiative and already since the beginning of this year or actually end of last year. I'm in the process of setting up an or a company called H3 Company which helps people, organizations and also people within organizations to. Yeah, to deal with what is now upon us. Due to the push from AI. This initiative is broader than AI. It's it's technology as a whole and it also encompasses supporting the DSH team to to develop their own signature in, in, in, in the business unit. So with me on in this in this context, very happy to to welcome Patrick. Patrick is very good at much better than me at describing his own expertise. But I can already share you. It is an absolute expert when it comes to digital transformation. Also building and running data centers, including the human side, so teams within data centers, etc etc. Building them from the ground. So that's something that I've never done, of course. So so bring in leadership culture and team development and and the and the and the real hardcore data and analytics. Expertise and experience from from Patrick. Makes the team. For today, and we're also. Supported by by my business partner from H3 Company who Peter already met. But Patrick over to you. Would you? Would you like to introduce yourself to Alex? She's she knows already too much about Peter and about me, so that would be very boring, I'm sure.
07:15 Patrick Motsch: OK. That's good. So thank you very much that you can do this call. I'm originally born in Geneva. I come from the French part of Switzerland. Now I live near Zurich, half area upstairs to the mountains in a wonderful area with my family, three kids and wonderful wife, and I learned in the last call. Also, my kids are wonderful because last time they said so I have purchased. I don't say this. My digital journey started about 20-6 years ago. Oh, I first made the civil engineer. I also made architecture in in Switzerland in 80. Huh. And then suddenly I was combined with communication and it and this entertained by what I said before designing implementing data centres. But more and more, this went away from technology. It was already there, people, business to have the right teams in the right places. It was a timing topic to having eighty months such a data centre. Ready. It is quite tough. And finally, then, this AI technology raising more and more the last four years I was changing again. So back from infrastructure back from it still in the backhead, but the people and organisations to support them to integrate this AI, which finally is, I would say 5% AI, 95% is integration work with teams, with people on this journey.
08:43 Jeroen Haverkorn van Rijsewijk: Yeah. Thanks Patrick.
08:45 Wessels Boer Alied (SB-M): Can I take those? Do you want me to take over? Do you want me to take?
08:49 Jeroen Haverkorn van Rijsewijk: Sorry. Yeah, yeah, yeah. Before, before you do that, just a note that this meeting is being recorded by GDPR compliant. You European server based AI note taker and yeah if you want you can also of course get the link to the to the interview. But the the idea is that this stays within the four of us and Peter, Patrick and me used, let's say, the outcomes in the highlights. Of this interview as inputs for for for the next steps, which Peter will. Tell you at the end of the interview. Cool. Yes, please. Please take over if it's OK, yeah.
09:32 Wessels Boer Alied (SB-M): And last week I learned that I can object against it, right? I took a course in, but I'm not going to. I'm not going to but.
09:41 Jeroen Haverkorn van Rijsewijk: Absolutely.
09:42 Wessels Boer Alied (SB-M): Yeah. Yeah, but I'm I will. My name is Elizabeth. I think I'm the person with the the least knowledge on tech or on the digital, but I guess that also has a positive side as long as I still understand it, then I think everybody will understand it in our department. I'm the director of SN. ONL. So after Peter left, I took over a year ago. And what else? I live in Amsterdam. I'm happily married. I have two children. And yeah, I'm now just starting to work with copilot and I have been sometime the asset for asset management, asset management, the manager for short while before I took on this job. So from that perspective. I do have some knowledge on what's going on in the team. And yeah, I'm really looking forward to this meeting. So very curious. The topics that you are going to raise, and I also think that there's lots of room to improve. Internally. So I'm really glad with this initiative.
10:57 Patrick Motsch: Thank you, Alex.
10:59 Jeroen Haverkorn van Rijsewijk: Oh, wonderful, wonderful. So also wonderful kids. We assume at least right for the just for the notes. Yeah. Yeah. Not only happily married, but also happily parent.
11:10 Wessels Boer Alied (SB-M): At the moments where they are lovely, they are lovely. Yeah, that's true. Most of the time they are.
11:16 Jeroen Haverkorn van Rijsewijk: We can shake hands. Cool. Well, maybe just to to to continue where you left off, which is indeed lots of things to to improve, so. If it's OK with you and we now get into the, we ask you a few questions and Peter, please feel invited to chime in, right, whenever something spontaneous comes up. I will ask the first bunch of questions and Patrick will take over and and and and I will take notes and and then we aim to yeah to be done. A few minutes before 10. So you're not sitting on the hot coals. If that's an English saying, I don't think so. But you know what I mean. Maybe let's start with the collaboration with with DSH from your perspective. Right. So. Maybe you can. Yeah. And of course, I'm Peter and me were a bit pre informed, but maybe just for with one sentence, give a bit of context what the nature of that collaboration is for, for Patrick and how satisfied how satisfied your current Dr. with the services and products provided by. DSH. And also the just the call, yeah. OK.
12:30 Wessels Boer Alied (SB-M): Yeah. So from the parts of hardware, I think. The specialists are in central team, so whenever there's a tender or something else where they need input from the hardware team, they will approach them and also when it comes to all kinds of firmware updates, running these and testing new firmware. So we really see them as our. Firmware specialist and also our specialist on the hardware and also. Our specialist in terms of issues that, let's say, the technical people within our local organization cannot solve. So this is how we regard them in terms of, yeah, what kind of work do they take home from a hardware perspective? And on the digital side, I I honestly have to admit that I'm not really aware. I know that they work with sprints. I know that there are teams. I know that in the Top Model ideally. MCO is giving them the cues on what they do and I think in practice. So we highly depend on all kinds of systems like share also in operations. We flag what I see happening is that we flag often. What's not working? Well then this is taken in and then it becomes a bit of a black box. Well, yeah, what happens to fix? That's more or less it in a nutshell.
14:04 Jeroen Haverkorn van Rijsewijk: And so is that. Are you then satisfied or not? Or parts you are and other parts you are less. Or how how would you? Say that.
14:15 Wessels Boer Alied (SB-M): I think that's so. So a lot of things are not delivered in time. And that that's that's a really serious issue because. Yeah, that means that a lot of also manual labour needs to be done continuously. And in some respects, we are really fast growing. So we have more and more people using our charge cards. That's increasing the workloads, but it's not. And from what I understand from the operations and there's lots of room to to to optimize things, making it more efficient and that's currently not done yet.
14:57 Jeroen Haverkorn van Rijsewijk: And does that apply for digital or also for hardware? Well.
15:11 Wessels Boer Alied (SB-M): What's the if?
15:12 Jeroen Haverkorn van Rijsewijk: That things are not delivered on time etc etc. What you just said?
15:16 Wessels Boer Alied (SB-M): Hmm. Now, that's not my experience, but so I think the cooperation itself is quite good. I think there's bad communication could sometimes be improved, so I think an example maybe that also Peter saw on the e-mail yesterday is or maybe last week is that we don't always fully understand each other so.
15:42 Jeroen Haverkorn van Rijsewijk: OK. With digital or with hardware or both.
15:47 Wessels Boer Alied (SB-M): Yeah, we've, we've hardware.
15:47 Jeroen Haverkorn van Rijsewijk: With hardware. OK, OK. Thanks. Or maybe on that note, what what you know where and how do you feel the collaboration between SNL and L and DSH? How can it be elevated to to next level? What would be what would unlock that?
16:07 Wessels Boer Alied (SB-M): Yeah. I think to to have more clarity on who's working on what and when and how to cooperate with each other and and when I was the manager, we we did. Make like an overview of of all the positions that we have and what people are working on. So we try to start with that. I also think that on the level of meetings we've had pretty clear on operational, tactical strategical level, who's participating.
16:33 Jeroen Haverkorn van Rijsewijk: Mm-hmm.
16:34 Wessels Boer Alied (SB-M): So a lot is also going. Well, but I think and that's maybe also a challenge for the hardware team, but it's not up to me to to, to answer. That's more maybe a question from my side. I think that the asset management team in NL. Working quite well. We have the highest upside, so there are. To some extent also. They depend on the central team, but they're also capable of doing. Things themselves and take pride in that because they are delivering a good job. So. And of course that then gives a bit of tension. If somebody says, hey, you need to do this or that and then you think, hey, yeah, but I'm running my business quite well, so. These kinds of tensions. So I think clarity on who does what and how do we cooperate that that will help. And I think it's also a bit of back office front office. So of course, we like all kinds of things to be in place for our customers or to win tenders.
17:48 Jeroen Haverkorn van Rijsewijk: Yeah.
17:48 Wessels Boer Alied (SB-M): Yeah, from a different perspective, that's maybe not ideal because you need to manage them more. Hardware supplies just to give an example. And it's it's all. It's all fair. So the local perspective is in some way is true, but also the central perspective is true. But then? It's really about understanding each other. That's that. Yeah, that both. Be there at the same time.
18:12 Jeroen Haverkorn van Rijsewijk: Yeah. And I imagine that it also helps. But that's just an assumption I'm testing with you on the elevator collaboration. It would help for things to be more that you can depend more on on what is being delivered when, and that there's less of a black box. Even though I understand that that black box also includes MCO for a large part. But yeah, how do you see that?
18:41 Wessels Boer Alied (SB-M): Get the black box becomes less. Yes, I think in general, if you can be quite transparent on where you are and that's not sometimes regarded a bit as control. But I think if if the transparency is there then you are really on a high professional level.
19:01 Jeroen Haverkorn van Rijsewijk: Yeah. OK. Thanks.
19:03 Wessels Boer Alied (SB-M): So yeah, that's something I fully agree upon.
19:06 Jeroen Haverkorn van Rijsewijk: Yeah. OK. Then switching to more the tech vision and let's say. Our collective, which includes you, our thoughts on the framework, so this initiative aims to develop, implement and maintain the tech vision for the BU. How would you define a tech vision? And especially because? You are. You regard yourself not as a techie. I'm I'm interested to to learn your perspective.
19:38 Wessels Boer Alied (SB-M): This is a difficult question for me to answer tech vision.
19:42 Jeroen Haverkorn van Rijsewijk: It's, and therefore it's also very easy would be my, yeah.
19:50 Wessels Boer Alied (SB-M): I think it needs to be clear what our strategy is there. What kind of approach do we take?
19:56 Jeroen Haverkorn van Rijsewijk: Yep, Yep.
19:57 Wessels Boer Alied (SB-M): And and then there's probably a couple of choices to make in this strategy. Here. So do you want to be really flexible or do you want to be? Say no. Every once everything to be managed perfectly. But that means we need to make choices. Difficult choices. Listen to local demands. Or is it? Is this is a hardware. This telling local teams what to do.
20:35 Jeroen Haverkorn van Rijsewijk: Yeah.
20:36 Wessels Boer Alied (SB-M): And I think you need to understand, of course, what what, where is this landscape going to? I think you already mentioned AI, but these kinds of things and and also the needs of the customer. I think more and more emphasis. Has been in the past years in tenders on asset management. So how is this run? So the demands will only increase, so it will become more difficult and also saying if the uptake is already. Quite high in the Netherlands. It means you need to put a lot of effort and maybe also money in in adding one additional percent. And is that where we really are? Or. And then also these different KPI's per countries is a bit complex in itself so. From that perspective, it's it's it's it's more difficult in the Netherlands because we are already quite high. We all have the same central budget, but we need to increase to an even higher level where locally they are on a on a lower level. I think it's probably more easy there to to to get some gates. But I'm not. I. I don't know. That's just from.
21:57 Jeroen Haverkorn van Rijsewijk: Yep. Yeah, very good. Yeah. Yeah. Thanks. And I'll just share what it's work in progress, but I'll share how we how we think about what should be. And it's just for you to kind of look at. It's very high level. It's so high level that, you know, in a way, you can't really be. You can't really miss it, right? But this is our starting premises with things that it's tech vision should include. So you already mentioned strategy, so that's definitely part of part of that vision. It also means strategic posture. So what kind of? Yeah. Are you like a front runner, are you? Are you more defensive? Etcetera, etcetera. There's also kind of how, yeah. How do we show up and how do we see ourselves? Right, which which also defines how we show up and where we put our attention. Leadership obviously at the at the center we lead this very important part is also culture. What? What? Patrick said. Also the the people side of things and then how to make it operational? So there's a lot of parts of that also. Is it operational? So that's why there's also a large part of that in what we call the operating model. And of course, all of this depends heavily on on data and and nowadays it's data and AI. So this is how we how we see that any any obvious things are not here for you for now.
23:36 Wessels Boer Alied (SB-M): No, thank you, Sir.
23:39 Jeroen Haverkorn van Rijsewijk: OK, good then. Yeah, like I said, we're using this as a kind of a prototype going into further exploration, but happy to happy to hear that. Next question would be, yeah, what? What initiatives or or trends or things are relevant for us to know from within snow in the Netherlands within? This this context.
24:06 Wessels Boer Alied (SB-M): Yeah, I already mentioned that we have growing demands from our customers. So more and more, they want us to do more on how we manage assets. So they want more reporting. They want us to be more proactive. These kinds of things. What was your question again? What is?
24:32 Jeroen Haverkorn van Rijsewijk: What initiatives or trends or things are relevant for us to know within this context from from within? Then there let's.
24:41 Wessels Boer Alied (SB-M): Yeah, but I was also thinking looking at what you just showed. So in terms of the organization, I think maybe it's not culture, but it's maybe organization. Is that one of the observation that I have is that we also need to run a lot of projects, whereas the central team has a lot of experts and you're not necessarily a good project manager when you're an expert and and and and we don't distinguish between these. Things internally. So we think, OK, you're the expert.
25:08 Jeroen Haverkorn van Rijsewijk: Ah, OK.
25:09 Wessels Boer Alied (SB-M): So you're in Leeds, but that doesn't necessarily make them a good project manager. So if we need to onboard, for instance, new hardware, who's then managing these projects and these? These are also things that need to be clear.
25:24 Jeroen Haverkorn van Rijsewijk: Yeah.
25:27 Wessels Boer Alied (SB-M): Maybe just a loose remark, but.
25:31 Jeroen Haverkorn van Rijsewijk: Yeah. Yeah, good point. Yeah.
25:38 Wessels Boer Alied (SB-M): What trends did you say right?
25:41 Jeroen Haverkorn van Rijsewijk: Yeah, and what initiatives? Maybe there's already some digitization things going on or automation of business processes or?
25:48 Wessels Boer Alied (SB-M): As with this asset management information system, that's something I really believe in that that should be there. I also think that competitors are ahead of us.
25:56 Jeroen Haverkorn van Rijsewijk: OK.
25:57 Wessels Boer Alied (SB-M): That's what we also know. So in so in that sense, it's interesting to to ask people about LMS when they did the hack because that gave them an inside rise on how it was run by competitors and then they saw, hey, the competitor is doing some things far more efficient.
26:12 Jeroen Haverkorn van Rijsewijk: OK.
26:14 Wessels Boer Alied (SB-M): So for instance, the maintenance part. Partners get an automatic queue when something is wrong and then they need to go to charging station and I think this is also the purpose with the asset management information system and I think that that in general I think our system. So people like Boston will say we have all the information. Yeah, that's true. And we know tons of things. So when I was the manager of the asset management team. I also asked OK how many things can you see in the technical guide told me like, yeah, I can see like 8000. Cute on things that are not how they should be, but then it's like a bit like being a doctor. OK. If somebody has like, 20 complaints, where do you start? Or do you just think go away? You're a bit of a hypo.
27:03 Jeroen Haverkorn van Rijsewijk: Yeah, yeah.
27:05 Wessels Boer Alied (SB-M): Crite but but but so you need to see. OK, this is really serious. This is this person. This is needs to end it. And this is a really big batch. I don't know, but I don't think that this is automated yet and this is also something. Of course, if the system. As so much information on what's not how it should be, how how do we follow up upon that in a structured and as far as possible automated way. So for large parts, but I think it's also something we talked upon before Peterhead for a large part, maybe you. Can have automatic queues, so just to restart and it will solve it. And maybe there are also big batches with simple things that we. Can filter or maybe. Some things have to raise immediate red flags, like who? Hey, this is like a new issue that we don't know. This it also needs to be seen and understood by the central team. I don't know, but I don't think this is how we currently deal with this information. So we have the idea that it needs to be understood by the by the maintenance partner, but I I probably we can do way more, right?
28:15 Jeroen Haverkorn van Rijsewijk: Yeah, yeah. So that would be also my last question and then handing over to Patrick, So what? What is your vision on for, let's say, NL's role in? Yeah. What we call the the business units, digital future, if you wanna give it, give it some words.
28:36 Wessels Boer Alied (SB-M): Our rules that we are we, we are the end user, I say. And we we should also be able. I think it's it's probably never finished right. So it's like this plan to check act. Somebody's going to be the owner of this or hey, you are probably going to check this vision again in in one year, etc etc. So. You probably need to have people to to to. To challenge it. Repeatedly and then also say OK what? What things are not in place that should be there and it's not only the asset management team is also then the tender team and the operations team in terms of digital. So I think operations is really depends a lot on the digital team. I would, I would think. To do their work in in the most efficient manner.
29:36 Jeroen Haverkorn van Rijsewijk: Thanks. Patrick handing over to you.
29:40 Ommeren Pieter van (SB): So the topic you just mentioned I think is highly relevant on the. So for Patrick, this is probably new, but all those stations, so they are connected, right? They're they're sending tons of information to our system all the time about statuses. What errors about behavior, and I think today this generates charge points there about temperature charging. Modules in the charging station, whether or not they are working, and so they're sending tons of information. Currently, the team is translating that into actions for operations, but you can imagine with thousands of stations or this also generates a lot of work and that currently needs to be interpreted. I think a lot of a lot manually, right? Elite. So I think this is this is where I see, especially in our AI part of this program, a lot of an important part. How do we how we're going to automise this also in combination of users reporting something? So we have so much knowledge on the back in the back of our courses. System landscape so much probably we already know before the customer's calling us, but today we either wait before for the customer to call or we we, as DSH, expect the S&O to look into all those rows of information and then yeah, do something with it. I think here's.
31:04 Wessels Boer Alied (SB-M): And the central team has no time. That's what I understand more or less, right, that they're not really, unless it's really something that that the local team is not able to to to resolve. But I think it's also my impression that they are really busy. With the firmware new updates. Choosing new hardware, testing new hardware. It's. I don't think they have really time to follow up on this.
31:32 Ommeren Pieter van (SB): No. And then my last point and then we go back to the interview to you again. But imagine we would. Increase our asset base by 10 tenfold, right? So 10 times as much than we would have, let's say 400,000 stations. I think you would need to have a full floor of people here to manage that. And I think this is this is where I would would want us in the tech vision initiative to look look into because I fully believe.
31:59 Jeroen Haverkorn van Rijsewijk: Sir, can you repeat that? Sorry, sorry, sorry. Can you repeat that? Sorry, Peter.
32:03 Ommeren Pieter van (SB): So so if we would, if we would have a much bigger asset base, we would need to have a lot of people here in each team to manage all those messages, errors and things where I believe there is a crucial part in this technology initiative to look into. Automation and AI to solve this for us 90% in combination in combination with customer interaction because on the one hand and then I will stop because it's of course your interview elite, but I think it's relevant. So on the one hand, there's information that is generating in our IT landscape, right? A station sending an error, for instance, and there's customers interacting with us either through WhatsApp or sending something in the in the app. Something is not working, but I think 90% should be solved automatically by the system from those two streams.
32:54 Patrick Motsch: It's very crucial point that you are with assets linked to the staffing count currently.
33:02 Ommeren Pieter van (SB): Yeah.
33:06 Patrick Motsch: But I take over. Where you see the current and future challenges for your business unit and for the business units and for the Netherlands that you drive now your current and future challenges that you see?
33:24 Wessels Boer Alied (SB-M): Hmm.
33:25 Patrick Motsch: So I give some examples. Things like time to market, limited financials and humans, things like this to have some short lists that you can tell.
33:38 Wessels Boer Alied (SB-M): Good to see you. How far are you? I think one of the issues that that we that we have is that. That the market is a bit shaky at the moment. So on the one hand you want a hardware suppliers to be you want them to be there forever. So for you can also have. WhatsApp on the daily spare parts for a really long time in the future. On the other hand, you want of course to do to be competitive, to be innovative. So preferred supply strategy is not ideal. So maybe you need to have more, but then it becomes more difficult to manage. So I think that's one of the challenges. To balance that out in the right way and also having different markets where we are active. I think that one of the challenges is that we have. We are growing, like Peter said. So you can wonder if the way we are working, if that's really how we can can go on in the future. I'm also worried about safety in all honesty. So are we giving that sufficient attention? So last year we had an issue and it's still not really properly resolved, but it boils down to the point where where the whole market is seeing that maybe the the full protection is not ideal the way it is, but it's more really a hardware issue. But then if you have such a big base also. Repairing this is a risk in itself, so probably it will be phased out and and it's also not possible to bear these kinds of costs, because if you need to retrofit it, it will. It will just kill the business case of every, each and everyone in the market. So it's it's such a huge problem if you have a serious hardware issue. It will be such a huge problem that it can simply not be addressed. Because it will. Yeah. Cost too much money. Yeah, I think it's really hard to from from. To answer this question.
36:05 Patrick Motsch: We don't need each pizza, but it's it's OK for the for the. I think the topics that you address first is that you have first in mind. They are more relevant, but can you address also looking to the future when you look what happens internationally, the regulations, the environment, what do you think, what risks will raise?
36:26 Wessels Boer Alied (SB-M): So in terms of in terms of this departments?
36:30 Patrick Motsch: Department and also the trend, the business unit. What do you think? Feeling experience.
36:43 Wessels Boer Alied (SB-M): I think the market will be more and more regulated, but but if it's so, I have a background in regulatory affairs. In in normally also always have a reasonable time to to implement changes, but you need to be flexible in that sense. So a lot of stock, for instance, that's that's highly risky if if you if you see that there are regulatory changes coming. So where you do need to have let's say a payment terminal or whatever. If you're then stuck with a really big old batch of hardware, yeah, that's not ideal of course. Yeah, I think.
37:31 Patrick Motsch: OK. It's OK if we don't all test, we continue. Based on your experience, how should we engage the Netherlands team to ensure that they are aligned with and supporting our business transformation goals that you just want to set? What can we learn how to integrate?
37:55 Wessels Boer Alied (SB-M): I think they have a lot of operational knowledge and from this one can learn a lot so. And I think they they have probably. Yeah, they have the biggest batch of assets. We have really big concessions, so we have really big contracts where we, let's say corporate with 80 municipalities and need to install thousands of charges. So with really big clients, so we operate on a large. Skill, I would say compared to, say, the older markets currently. Of course we are different in the sense that we do a lot of AC or the majority of what we have is AC, where the other markets focus on DC. And so we would like to grow in DC. But we are a front runner and and. The market leader, when it comes to AC in the Netherlands.
38:53 Patrick Motsch: OK. And how you think we should engage the Netherland teams that all can profit from this experience? This know how this one step being ahead? How? How we could engage these resources?
39:09 Wessels Boer Alied (SB-M): In this project that you're currently running.
39:12 Patrick Motsch: In the vision that we do and also for the whole organization to profit from from where we are already good. Any ideas? The creative question.
39:26 Wessels Boer Alied (SB-M): Yeah. I think I would like an exchange, so let somebody of the hardware team maybe do the work. Work a month or two within the local teams to really understand and see where they are day-to-day facing, I think a really better understanding so and also for the digital team. Work, work a day or two in operations and see what they come across to know to get this understanding because we have a lot of translators, we have process managers, they need to translate everything to the to the tone and then from the tone it needs to it. Like when you have this Wisp game and I'm saying and we go round. Before it ends up with DHH, there's a lot of things that get lost so. If you don't want things to get lost in translation. You can of course do classical things like having meetings and discussions, and it's all fine, but I think then it also would be helpful just to yeah to to really work in a local team or have some exchanges and maybe also the other way around, so would also. Be interesting for somebody in in the local team, maybe to run a project or whatever in that, in a central team.
40:48 Patrick Motsch: Very good. So to be more specific on on this point, what unique local opportunities you see that we could profit also in our in our DSH vision is there's some topic that you say, hey, guys here can really profit from us. For our vision.
41:17 Wessels Boer Alied (SB-M): In what sense? Profits. Yeah, it's it's such a broad question I.
41:21 Patrick Motsch: What do you what do you do? Very good. Better than the others that you say. Hey this we should share.
41:27 Wessels Boer Alied (SB-M): Rip sign. It's a really clear KPI and I think we are really good at it because we really on top of it. So it's the way we manage our maintenance partners. It's the way we we. Yeah, take action upon what we see. And it of course also gives Rick Shinne in our local team. But because we're not doing everything, of course we also make choices. So sometimes people can be complaining a lot about some charges that are not working. But they take a pretty rational view and say, OK, we focus on the biggest badges that we can solve the easiest. Even if that means that, let's say a charging that is already not broken for a long periods will not get attention, and maybe because it's it's only one case.
42:20 Patrick Motsch: Let me allow one deep dive. How you decide where to take focus? Is there a system or is it experience? What is? What is the driver?
42:32 Wessels Boer Alied (SB-M): In the mid, so they try to digest it, but I think they now do it themselves. Ideally that's it's it's done. The system does it for them.
42:45 Patrick Motsch: Thank you.
42:46 Wessels Boer Alied (SB-M): And I think it's also experienced they know what's going on and yeah.
42:55 Patrick Motsch: Right. So finally, let's dive. Let's go back from dive. What is good and should be kept and what should we change and summarize?
43:08 Wessels Boer Alied (SB-M): My impression is that that the teams are really knowledgeable. I think that for the hardware team, I think it's a lot about the cooperation and and. About making it easier to decide on what to act upon. So I think the responsibilities and rules should be come more clear and and then also saying hey, we have a lot of projects, how do we deal with that? Because I don't think there's really a project manager's really in in both, so not locally, but also not centrally. So I think that's the issue. And from a digital perspective? I think it's really important to deliver on time and manage expectations. And also have under real understanding of what's going on locally. So it it seems that there are far far away. Sometimes I guess. But that's not really I'm really now.
44:13 Patrick Motsch: The headlines. It's it's. It's great for us to have the headlines here.
44:19 Wessels Boer Alied (SB-M): It's a bit like this, but so maybe it's not a full picture, but OK. But I think that in itself the hardware team doesn't feel really far away from me. I do feel that there's sometimes, and it's also it's also interesting to see how big a difference individuals make here. So some are really great in cooperations and others. It's. So that's also something that's in there. So it's not always connected to structure. It's also connected to the profile of people that we have in. I think the team would benefit from really strong communicators.
45:01 Patrick Motsch: It is a great point at the end to say.
45:05 Wessels Boer Alied (SB-M): Or somebody with project management skills, you know somebody that's gluing things together and be a bit like the oil man in between.
45:12 Patrick Motsch: Yes. Yeah. Great point is I like for the end. So last question, did we miss anything? When you look back what we ask you that you would say, hey, this also would like to tell you what would be important that you reflect when you make another decision and you go on.
45:32 Wessels Boer Alied (SB-M): Uh. Yeah, I think it's hard to. It's really from the scratch, right? So it's easier to to if there's some like a blueprint already to for me to respond upon, but. But yeah, let me think about.
45:54 Patrick Motsch: Your opinion, your I fully understand. I fully agree. By the way, it was also discussion to give a script before or just to ask, but what we think also what we know, what you see, what you experienced. This is most valuable that we can get.
46:07 Wessels Boer Alied (SB-M): Yeah. Uh, no, I don't. I don't have anything to add. Yeah, I think you should really talk to somebody like in my team and people like Bob. So that would be my recommendation.
46:20 Patrick Motsch: You have this name Sharon because I don't have this. You know the people.
46:23 Wessels Boer Alied (SB-M): And also of course, when it comes to digital talk to. But you probably already have a long list right of names that you in our organization that you would like to talk to.
46:36 Patrick Motsch: We already have.
46:37 Wessels Boer Alied (SB-M): Yeah, and also.
46:39 Ommeren Pieter van (SB): Could be could generate, of course, yeah.
46:41 Wessels Boer Alied (SB-M): Yeah. And also Jasper from operations. And. Yeah. So yeah. Houston.
46:52 Jeroen Haverkorn van Rijsewijk: For, for, for now, we're keeping it small because we are preparing the kickoff. But in the phase one, which Peter will also share and definitely there are many, many people we we can think of talking to, but we also want to do so in alignment with with you and and your peers.
47:11 Wessels Boer Alied (SB-M): The only thing I haven't really touched upon is where we can automize things. But I think that there's one thing before it's also the data quality. That's a big issue, right? So a lot of data. So if you if you would like to know more. And and also. The idea that we have with how many systems we are working, what's our system landscape looks like. So for instance, for this public business, Houston Ham and I has looked into it. Because some cues just don't reach us. They get lost somewhere and it's because our system is connected to the system of the diesel. So the grid operator, but from to municipalities, from tooling, that's the municipalities used to do this processes. What else? Contract management system. So there's tons of systems with a lot of information flow, and they're also. So. So we sometimes maybe focus a lot on our own systems, but do have high efficient processes. We also need to interact with a lot of different systems, not only our maintenance partner but so. But I think this is known.
48:34 Ommeren Pieter van (SB): Maybe one last question from my side, is there any?
48:39 Jeroen Haverkorn van Rijsewijk: Yeah. Sorry, Peter. Peter, sorry. You said data quality is an issue. To know more about this and then I was like, I'm going to write this down. But then you didn't say it. Select.
48:49 Wessels Boer Alied (SB-M): Yeah. Talk to Houston hammeray. And he also has made like, an overview of all the systems that they interact. And I think there's 80 flows of information just for this one tender concession.
49:02 Jeroen Haverkorn van Rijsewijk: Yeah. Thanks. Thanks.
49:05 Wessels Boer Alied (SB-M): And not everything is a happy flow. So that's often what goes wrong in when we develop things for our operations that we think in terms of happy flows. But then what happens to everything where somehow things are not in a happy flow and they just fall out of our sides? And then we literally lose track of of charging stations that are in development?
49:30 Jeroen Haverkorn van Rijsewijk: Yeah. Thanks. Thanks. Sorry Peter. Thanks.
49:34 Ommeren Pieter van (SB): No, no, no problem, no problem. And we still have some minutes left. So I was thinking maybe so as part of the vision, it could be that we also need to make a few choices here and there, right? For instance, on buy versus build or on giving direction on the I we want to work with all all potential suppliers in the world. Oh, no, no, no. We want to work with selective part of suppliers. I mean, it could be a strategic choice. What kind of strategic choices do you see for us to make? Do you see more strategic choices for us to make?
50:13 Wessels Boer Alied (SB-M): Yeah. I think if if if we see that our performance is not so great. In Digibility, in terms of delivering in time. Yet then then you could also consider maybe going externally, right? So we think our back end is is pretty OK because that's what Accenture says in the past. But but. At the pace in which this market grows is really fast, so we cannot just hang on to this Accenture. Conclusion for let's say two years. That's quite. Others could be ahead of us in that time. And how do we make sure so all our competitors are looking into externals? So and we are, we are yet having. In which extent do we do we really get the complete overview because we are really focusing on our. Right. We are really internally focused. We don't have contracts with them, so we can also not judge their performance. I'm not saying it's better, but we we need to acknowledge that we don't know, right?
51:23 Ommeren Pieter van (SB): Mm.
51:23 Wessels Boer Alied (SB-M): We think that our internal system is the best. But, but that's probably an assumption that needs to regularly be checked and reviewed again.
51:35 Jeroen Haverkorn van Rijsewijk: And you're you mean specifically the deliveries of the digital team or yeah, OK, fine.
51:47 Patrick Motsch: Thank you very much.
51:50 Wessels Boer Alied (SB-M): And they and and people are located far away, right? So that's also. I think we are struggling with how to manage these teams as well because like I know probably most of the people in the central hardware team. I. I hardly know people in the digital team a couple, but, and maybe that's my my fault. But I think that also a lot of them are really far away.
52:20 Ommeren Pieter van (SB): Yeah.
52:21 Jeroen Haverkorn van Rijsewijk: It did geographically, also. Yeah.
52:24 Wessels Boer Alied (SB-M): Yeah. And then also their understanding really of the business, so, so when we had this MLA project, I was discussing with one of them things. What we are doing in the Netherlands and he was in he wanted. So he was really like, yeah, how much energy does it sell? And I said, well, our customers are, is the governments, they they don't care about, they don't have commercial interests. They more have they they want. It to work properly so the uptime for them is important. But if you if you miss out on these fundamental things, then you're not building the system at a display in the right manner. Just to give an example. So he he never heard of AC and what how it's working probably because he's always talking to different people, which is quite remarkable if you think that most assets are currently. Revenues, especially at that time, even even more are in the Netherlands. So he completely missed out on the picture.
53:34 Patrick Motsch: Probably give this cup back to you, Peter Pan.
53:37 Ommeren Pieter van (SB): Yeah, yeah. And I will round off. So as I said, thanks a lot for the spontaneous first round and I get it. It's a bit of improvising, but there will be. There will be a whole program, so there's much more opportunity to to chip in if you want later on. So thanks a lot. So we will do this as as mentioned, this first round of interviews with with director, with a few directors within the unit with it and and procurement and based on all those interviews, we will put together a program for a kick off. This kickoff will be with a selected group. And based on based on that, we will kick off a program where we will involve much more, much more stakeholders. But how exactly is not yet known? Yeah, so basically this is a first round of interviews and then thanks a lot for all the for all the input.
54:27 Wessels Boer Alied (SB-M): Yeah, I hope it helps.
54:29 Patrick Motsch: Thank you, Alex. Evan it.
54:32 Jeroen Haverkorn van Rijsewijk: Yeah, maybe to add 3 words, Peter, is that OK? So it it's in a, it's a, it was an intentional choice to have this round of off the bat conversations also because we are let's say we we want to connect to real things, not just to our concept. Of how things are. So that's very valuable to talk like this to you, alit. And to to Fani and to. Hamrick, and to Anna Marie and to Fabian. And to and to Tobias and then the kickoff select group that we now have is is Peter Fabian Jetska from father for it and Tobias from procurement. So just to also demystify who's that select group? Yeah, cool.
55:22 Ommeren Pieter van (SB): All right.
55:24 Wessels Boer Alied (SB-M): Yeah, I'm, I'm thinking. I I really didn't prepare maybe for this session sufficiently, but let me rethink it now that we talked. OK, so. OK.
55:37 Jeroen Haverkorn van Rijsewijk: We're not going anywhere, and if you want to have another, if you want to have, for example, another 30 minutes with one of us or something, that's that's perfectly possible. And and like we said, don't stress about it because this is actually intentional. But yeah, by design. And we are iterating this this this. It's an iterative Co creative approach, so very, very great. If if other things come to mind please please share. To me, this was already very helpful. Yeah, we'll see.
56:08 Wessels Boer Alied (SB-M): OK.
56:09 Patrick Motsch: Me too.
56:11 Ommeren Pieter van (SB): Thanks a lot and have a nice day all.
56:13 Wessels Boer Alied (SB-M): You too.
56:14 Patrick Motsch: Have a nice day all.

View file

@ -0,0 +1,80 @@
STAKEHOLDER INTERVIEW ALIED
Date: 1 Sep 2025
Attendees: Alied, Pieter, Patrick, Jeroen
Agenda (60”):
Framing & introductions (10” max.)
Interview
Next steps & wrap-up (5”)
Potential AI use cases highlighted in pink.
Notes:
2. Collaboration with DSH
How satisfied are you currently with services and products provided by DSH?
HW:, firmware, issues with it: Specialist in central team → to approach them
Digital: Not aware of sprints, teams, structures → we depend on the systems to work, we have contact for issue to fix
HW: I do not know, cooperation good, communication can be improved → not fully understanding each other
Digital: A lot of things not delivered in time = serious issue → we are fast growing → more people using charge cards → automation not yet done
Where and how can the collaboration between your team and DSH be elevated to a next level?
Know structures & positions & cooperation model → overview & sync meetings per level
Also issues regarding backoffice/frontoffice to arrange better → agreement and alignment of workflow, who does what to raise efficiency
Asset mgmt team in NL working well, highest upsell; depend of central team, but also able to solve problems themselves
I see progress in reducing blackbox by transparency
3. Tech vision & framework
This initiative aims to develop, implement and maintain the tech vision for BU E-mobility. How would you define a tech vision?
Needs to be clear, what is our strategy and approach. Choices to be clear
To be flexible, or to be able to manage everything perfectly, or to listen to local demands, or is it defined centrally?
To understand where landscape is going to with products, customers, using AI. Demand will increase, so also to think about where to invest for sales deals, complexity will raise with teams like NL, which are already on a high level. To identify low and high levels to FOCUS
We use a framework to cover all relevant aspects. What do you feel is missing if anything?
SHOW THE STEERING WHEEL SEE SLIDE 3
Topics there, that i would need
What initiatives / trends / things are relevant for us to know from within S&O NL within this context?
Growing demands from customers → do more on asset management, more reporting, more corrective actions
Org: We need to run a lot of projects with centralized teams, so experts not to be project managers - not necessary a good idea (profile, roles)
Competitors are ahead in of automation of asset management (incl getting cues on maintenance), efficiency → to ask them, to learn from them
Have a prioritization mechanism
How strongly is digital transformation anchored in NL strategy, and what's your vision for NLs role in the BUs digital future?
We need to have people to challenge current processes and organisation, this plan/check/run to question again and again to enhance
To reinvent every day work how to do
CPs are sending tonnes of info to the BU, and currently team translates this into actions for ops team. Here AI can help A LOT with automizing and prioritizing.
If we have a bigger asset base, we need more people. But I believe this tech vision initiative in combo with customer experience, we can make a huge difference with AI.
4. NL
Where do you see the current and future challenges for the BU and for NL (time-to-market; limited financial or human resources; increasing risks; regulatory requirements, etc.)?
Market is a bit shaky: you want enough spare parts yet at the same time stay competitive (not being in exclusive partnerships)
We are growing → Is our WoW sustainable when we grow bigger?
Safety → Are we giving that sufficient attention?
Where do you see the biggest challenges or success factors for successful tech vision implementation?
Future → Market will be more and more regulated. Normally you have a reasonable time to implement changes. But a lot of stock is a risk here. (Alied has a background in regulatory affairs)
How can NLs data analytics provide insights that drive better business decisions across the organization?
NL has a lot of operational knowledge from which this initiative can benefit a lot:
We have a lot of big concessions, operating on a large scale compared to Germany / Sweden.
We do a lot of AC, where other markets are more experienced in DC
Based on your experience, how should we engage NL teams to ensure they're aligned with and supporting our business transformation goals?
I would like an exchange: have someone from the hardware team to be a part of the NL team a day or two. And vice versa.
What's your current degree of process automation, and which processes would create the most value if digitized?
ALREADY ANSWERED
What unique local requirements or opportunities do you see that could support DSH vision?
Up-time: We are good at it because we are really on top of it. It is in the way we manage our maintenance partners, and how we take action on what we see.
Sometimes people complain a lot about CPs that arent working, but they take a pragmatic approach, focussing on what has biggest impact / value
What is the biggest driver for these decisions?
It is data-driven (from the system) plus experience
What is good and should not be changed? What should be changed?
My impression is that teams are really knowledgeable. Roles & resp should become more clear.
Digital: Deliver on time, transparency and prove to have more understanding of how things look locally
Hardware: Does not feel far away from me. AND it is also interesting to see the diff that specific people make. Great communicators are typically easy to work with.
5. Conclusion (5”)
Do you have anything else to add in this context? Anything we missed?
At a later stage talk to people like Rikus, Bob, Jasper, Justin
Data quality is an issue. To know more about this talk to Justin (NL Ops, in team of Jasper)
What does our system landscape look like, also with our direct stakeholders (municipalities, maintenance partners, etc.)? Some cues dont reach us, because of an elaborate network of legacy systems tied together.
PIETER: It might need that we may need to make (strategic) choices as part of this initiative. What choices do you see that we may need to make?
If delivery on time is not up to par, we / you may need to choose to outsource. Rather than following Accentures advice from 2 years ago. Our competitors seem to choose to outsource (impression). We dont know, we think our internal system is the best → specifically when it comes to the delivery of the digital team.
Example: MLA project I was in conversation with an expert from digital - q was how much energy does it sell. But gov does not have interest in that , as up-time is the only thing they care about. He never heard about AC and how it really works

View file

@ -0,0 +1,28 @@
0:00: Finally joined the Fa organization right out of university, , as a, as a trainee.
0:10: , she's still, , I think, I think in this case she's, she's been very successful in that sense.
0:17: So she's a very young director.
0:20: , I imagine somewhere early 30s.
0:24: Now reporting or or so reporting to Fabian and I think her department has about 30, so 30 employees.
0:33: , she has a marketing.
0:38: So proposition management unit, , process management unit, and a customer service or central back office I should say, , unit.
0:48: , funny is, , conceptually very strong.
0:54: She used to, , report to, , Peter's predecessor before she she became director of marketing and commercial operations.
1:07: , yeah, I've been, ever since we first started working together, there's been a very special connection between funny and me.
1:15: It just sometimes happens when you have a client where there's really an, , yeah, a deeper, , deeper bond in a way, , and, and, and you kind of make each other greater than you already are, let's say that that that's .
1:32: , yeah, and we're funny that that really, , is the case.
1:37: So, yeah, yeah, I apparently, at least that's what she tells me, bring out the best in her and vice versa, and then we, we've seen each other grow over the last years since the beginning of 2023, .
1:53: And so, , I'm currently also supporting her, so actually running a workshop tomorrow and the day after, , supporting her team to make a step change.
2:06: .
2:07: Yeah, coached her team last year as well, and and the one on one coach journey last year with her as well.
2:14: So there's , yeah, there's a warm, very warm relationship, her.
2:21: , biggest challenge at this moment is process management.
2:24: She has just replaced a, yeah, an underperforming or, yeah, underperforming, , , manager, process management, , and so it's interesting to see what happens now with the, with the, with a new, more experienced.
2:41: Manager coming in, , who started work, well, just, just before the summer vacation or, or during the summer vacation in, in his new role.
2:52: So it's not really getting, getting to grips with with with his new area.
2:59: I am anticipating that there will be lots of opportunity in the process management area when it comes to the collaboration with with digital services and hardware.
3:12: There's a they're kind of in the in in the in this current operating model, Funny's department and Peter's department really need to be like a tandem.
3:27: So basically Fun's department does the prioritization of which and and the yeah the synthesizing and prior prioritization of which business requests to work on and then Peter's department executes, so there will be a lot of talk yet tomorrow on, on the collaboration between marketing commercial or sorry.
3:58: , so MCO.
4:00: , marketing and commercial operations and digital services and hardware.
4:05: Alright, hope that was helpful.
4:08: Let me know.

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,89 @@
STAKEHOLDER INTERVIEW FANNY
Date: 1 Sep 2025
Attendees: Fanny, Pieter, Patrick, Jeroen
Agenda (60”):
Framing & introductions (10” max.)
Interview
Next staps & wrap-up (5”)
Notes:
Collaboration with DSH
How satisfied are you currently with services and products provided by DSH?
Services: Digital services criticised - low budget for what it needs. (led the digital team before)
We were front runners 10 y ago, but now not there anymore in these days. A lot of legacy to carry. We became slow and get problems to keep our role in the market
Where and how can the collaboration between your team and DSH be elevated to a next level?
Collaboration: Ownership & capability - supplier is not just to lay back. Also to take LEADERSHIP, to define a subject - to play an active role. Here is a big opportunity - (in discussion). E.g. late status information about a product not ready
People are all good, but GLUEING together is the topic
3. Tech vision & framework
This initiative aims to develop, implement and maintain the tech vision for BU E-mobility. How would you define a tech vision?
I want to have out of a tech vision:
A picture of enlarging tech, and how i can contribute
How to implement tech, and WHAT to do, so how to ACT - -> To break it down, not just high level!
We use a framework to cover all relevant aspects. What do you feel is missing if anything? SHOW THE STEERING WHEEL SEE SLIDE 3
We speak about a tech vision → but also vision how to manage AI. It is so much more than our products. Products only 20% - it touches everything!
[CHALLENGE ACCEPTED]: Not AI on the bottom of the chart…. It is “everywhere”
Make it to touch the base
How can this technology enable us
What initiatives / trends / things are relevant for us to know from within MCO within this context?
Ops: Process documentation → TASK: Pieter to share
AI: To use how to solve problems easier
We have no usage on our journey, data not structured; to use data and workflows
Current issue: Less vehicles sold, more stations built… this effect is critical → dumping prices, aggressive campaigns → vicious circle
How strongly is digital transformation anchored in MCO strategy, and what's your vision for MCOs role in the BUs digital future?
Operation lifecycl.
MCO
Where do you see the current and future challenges for the BU and for MCO (time-to-market; limited financial or human resources; increasing risks; regulatory requirements, etc.)?
Usage is the main challenge
EXPAND: First we need to expand value-wise → mainly usage, and later expand value pools
EXCEL: More to do with internal operations (Pieter has the list). We concluded that we do a lot of manual tasks to day that customers can do themselves, and we need to support customers in that, also more preventative.
Where do you see the biggest challenges or success factors for successful tech vision implementation?
Usage is and will continue to be most critical
We can reduce cost, but if we dont generate income we dont have a business
Regulatory: We depend on subsidies for EV driving. Also, infrastructure costs (hardware, software) seem to be increasing
In places, we may be running the risk of being too dependent on too few suppliers. EV infrastructure is now a nice-to-have
How do you use customer data and analytics to improve targeting, personalization, and campaign effectiveness?
We use both internal research expertise (from Ivos team) and consultancy. Next to that we have a large amount of data ourselves
What's your current degree of process automation, and which MCO processes would create the most value if digitized?
Compared to Vattenfall and the current state industry / in general: We are “somewhere in between”. Our core process seems to be ok.
Example: Placing CPs in the context of concessions, billing is automated (charge sessions rated and invoiced). 2 million sessions/month are all invoiced in a fully automated way
Where we are not so good: We have many distributed assets. How to manage all these in an efficient centralised way
Can be improved: Degree of self-service, dunning process, bad data quality leads to not being able to capture the money, contract management for CPs (savings opportunity of 300K)
Is it better to have centralized asset management?
We are operating 70K CPs in NL, Sweden and Germany. It is an art to be able to manage tech assets in a distributed way. It is not in the DNA of Vattenfall. At the same time margins are thinning
How do you differentiate our offerings in the market, and what channels do you use to reach and engage customers throughout their journey?
We mainly use traditional channels: Meta, Google, LinkedIn. Sometimes through our partners (like Max Hamburgers, Netto - with Netto it is not so much a match ito branding), less so
Differentiation:
We do the placement in urban concessions better than others, we do what we say and dont overpromise. We largely deliver on time and within budget
In other segments, we dont do so much but leverage our trusted Vattenfall brand
Quality is not (yet/anymore) a differentiating factor
How do you collect and act on customer feedback, and would it be possible for you to give us inputs on your strategies for digital channels?
Until now this is very scattered. We now have 1 person who is collecting who is doing what where
Digital channels: On LinkedIn we run campaigns. On Google we do Google maps (listing charging stations), including selected paid geo-targeted campaigns. Meta - not sure. Microsoft - nothing currently.
Not using our InCharge app due to technical reasons
Direct comms: InCharge newsletters, Vattenfalls newsletter
What is good and should not be changed? What should be changed?
Change:
Adopt strategies to drive people to use our stations
Easiness with which we do process improvements. Technical as well
Aligned energy. Not only “puppy energy”, but balanced with senior grounded energy that allows us to consolidate. We are in a diff market state now, we are not a startup anymore
Not change:
International approach - Central setup
Serving our owner with the quality that they require (sometimes boring, but also very clear)
5. Conclusion (5”)
Do you have anything else to add in this context? Anything we missed?
I appreciate strategies, visions, roadmaps that are tangible → WHAT WILL WE ACTUALLY DO

Binary file not shown.

BIN
offerten/_src/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -0,0 +1,25 @@
// Automatische Kapitel-Nummerierung
document.addEventListener('DOMContentLoaded', function() {
let chapterCounter = 0;
let sectionCounter = 0;
let subsectionCounter = 0;
// Alle Überschriften finden und nummerieren
const headings = document.querySelectorAll('.heading-level-1, .heading-level-2, .heading-level-3');
headings.forEach(heading => {
if (heading.classList.contains('heading-level-1')) {
chapterCounter++;
sectionCounter = 0;
subsectionCounter = 0;
heading.innerHTML = chapterCounter + ' ' + heading.innerHTML;
} else if (heading.classList.contains('heading-level-2')) {
sectionCounter++;
subsectionCounter = 0;
heading.innerHTML = chapterCounter + '.' + sectionCounter + ' ' + heading.innerHTML;
} else if (heading.classList.contains('heading-level-3')) {
subsectionCounter++;
heading.innerHTML = chapterCounter + '.' + sectionCounter + '.' + subsectionCounter + ' ' + heading.innerHTML;
}
});
});

View file

@ -0,0 +1,93 @@
/**
* Page Counter for Footer Updates
* Sets CSS variables for accurate page counting in footers
*/
class PageCounter {
constructor() {
this.totalPages = 16; // Default fallback
}
/**
* Initialize the page counter
*/
async init() {
// Wait for TOC generator to be ready
if (window.tocGenerator) {
// Get total pages from TOC generator
this.totalPages = window.tocGenerator.getTotalPages();
} else {
// Try to load from JSON file directly
await this.loadPageNumbers();
}
// Set CSS variable for footers
this.updateCSSVariables();
console.log(`✅ Page counter initialized: ${this.totalPages} total pages`);
}
/**
* Load page numbers from JSON file
*/
async loadPageNumbers() {
try {
const response = await fetch('../page_numbers.json');
if (response.ok) {
const pageNumbers = await response.json();
this.totalPages = Math.max(...Object.values(pageNumbers));
console.log(`📄 Loaded total pages: ${this.totalPages}`);
}
} catch (error) {
console.warn('⚠️ Could not load page numbers, using default:', error);
}
}
/**
* Update CSS variables for footer page counting
*/
updateCSSVariables() {
console.log(`🔧 Setting CSS variable --total-pages to ${this.totalPages}`);
// Set CSS custom property for total pages
document.documentElement.style.setProperty('--total-pages', this.totalPages);
// Also update any existing footer elements
const footers = document.querySelectorAll('.page-footer');
footers.forEach(footer => {
const pageNumberElement = footer.querySelector('.footer-page-number');
if (pageNumberElement) {
pageNumberElement.textContent = `${this.totalPages}`;
}
});
console.log('✅ CSS variables updated');
}
/**
* Get total page count
*/
getTotalPages() {
return this.totalPages;
}
/**
* Refresh page count
*/
async refresh() {
await this.loadPageNumbers();
this.updateCSSVariables();
}
}
// Initialize when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
console.log('🚀 Page Counter: DOM loaded, waiting for TOC generator...');
// Wait a bit for TOC generator to initialize
setTimeout(async () => {
console.log('🔄 Page Counter: Starting initialization...');
window.pageCounter = new PageCounter();
await window.pageCounter.init();
}, 500);
});

890
offerten/_src/styles.css Normal file
View file

@ -0,0 +1,890 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* Verbesserte CSS-Counter für automatische Nummerierung */
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background: white;
color: #333;
line-height: 1.6;
margin: 0;
padding: 0;
counter-reset: page-counter chapter-counter section-counter subsection-counter;
}
/* Print page layout rules */
@page {
size: A4;
margin: 25mm 20mm 30mm 20mm; /* Top, Right, Bottom, Left margins */
}
.page {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
background: white;
position: relative;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
margin-bottom: 20px;
overflow: visible;
}
/* First page: No footer, force page break */
.page:first-child {
page-break-after: always;
}
/* Content page: Let content flow naturally across printed pages */
.page:not(:first-child) {
page-break-after: auto;
}
/* Page 1: No header, no footer - completely clean */
.page:first-child::before {
display: none;
}
.page:first-child .page-footer {
display: none;
}
/* Ensure footer is visible on all content pages (pages 2+) */
.page:not(:first-child) .page-footer {
display: block;
}
/* Logo section for first page */
.logo-section {
text-align: right;
padding: 20px 0;
margin-bottom: 20px;
}
.logo {
max-width: 200px;
height: auto;
}
/* Contact information styling */
.contact-info {
margin-top: 60px;
}
.contact-bars {
display: flex;
margin-bottom: 20px;
}
.grey-bar {
width: 80px;
height: 4px;
background-color: #808080;
}
.golden-bar {
flex: 1;
height: 4px;
background-color: #D4AF37;
}
.contact-grid {
display: flex;
justify-content: space-between;
font-size: 14px;
color: #808080;
line-height: 1.6;
}
.contact-left p,
.contact-right p {
margin: 0;
font-family: Arial, sans-serif;
}
/* CSS footers for flowing text - appear on every printed page */
@page {
@bottom-center {
content: "KI-Lead Management System Energie360° | Seite " counter(page);
border-top: 2px solid #D4AF37;
padding: 10px 0;
font-size: 9px;
color: #333;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
font-weight: 400;
line-height: 1.4;
}
}
/* First page: No footer */
@page :first {
@bottom-center {
content: "";
}
}
/* Remove all fixed positioning and green styling */
.page-header {
display: none;
}
/* Adjust main content to account for fixed header and footer */
.page .main-content {
margin-top: 20px;
margin-bottom: 20px;
}
/* All old footer styles removed - now using CSS @page rules */
/* Page numbering and content now handled by CSS @page rules */
.main-content {
padding: 40px 40px 60px 40px;
position: relative;
overflow: visible;
}
.title-area {
text-align: center;
margin-bottom: 60px;
}
.main-title {
font-size: 32px;
font-weight: bold;
color: #172B46;
margin-bottom: 20px;
}
.subtitle {
font-size: 24px;
color: #172B46;
margin-bottom: 30px;
}
.separator {
width: 33%;
height: 2px;
background: #B39D14;
margin: 0 auto 40px auto;
}
.document-details {
text-align: left;
margin-bottom: 60px;
}
.document-details p {
margin-bottom: 10px;
font-size: 16px;
color: #333;
}
/* Inhaltsverzeichnis Styling */
.toc-title {
font-size: 28px;
font-weight: bold;
color: #172B46;
margin-bottom: 40px;
text-align: center;
}
.toc-entry {
margin-bottom: 8px;
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 4px 0;
transition: background-color 0.2s ease;
border-radius: 4px;
width: 100%;
}
.toc-entry:hover {
background-color: #f8f9fa;
padding-left: 10px;
padding-right: 10px;
}
.toc-entry .toc-text {
flex: 1;
color: #333;
text-decoration: none;
min-width: 0; /* Allow text to shrink if needed */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: 10px; /* Space between text and page number */
}
.toc-entry .dots {
flex: 0 0 20px;
margin: 0 10px;
/* Fixed width for spacing, giving more room for text */
}
/* Alternative: Remove dotted line entirely */
.toc-entry.no-dots .dots {
display: none;
}
.toc-entry .toc-page {
font-weight: bold;
color: #B39D14;
min-width: 30px;
text-align: right;
flex-shrink: 0; /* Prevent page number from shrinking */
}
.toc-level-1 {
font-weight: bold;
font-size: 18px;
color: #172B46;
border-left: 3px solid #B39D14;
padding-left: 15px;
}
.toc-level-2 {
margin-left: 20px;
font-size: 16px;
color: #333;
border-left: 2px solid #dee2e6;
padding-left: 15px;
}
.toc-level-3 {
margin-left: 40px;
font-size: 14px;
color: #666;
border-left: 1px solid #f1f3f4;
padding-left: 15px;
}
/* Content Page Styling with automatic numbering */
.content-heading {
font-weight: bold;
color: #172B46;
margin-bottom: 20px;
}
/* Kapitel-Überschriften Styling */
.heading-level-1 {
font-size: 20px;
margin-top: 40px;
margin-bottom: 25px;
page-break-after: avoid;
}
/* Abschnitts-Überschriften Styling */
.heading-level-2 {
font-size: 18px;
margin-top: 30px;
margin-bottom: 20px;
page-break-after: avoid;
}
/* Unterabschnitts-Überschriften Styling */
.heading-level-3 {
font-size: 16px;
margin-top: 25px;
margin-bottom: 15px;
page-break-after: avoid;
}
.content-text {
margin-bottom: 20px;
font-size: 14px;
line-height: 1.6;
text-align: justify;
}
.content-list {
margin: 20px 0 20px 20px;
}
.content-list li {
margin-bottom: 10px;
font-size: 14px;
line-height: 1.5;
text-align: justify;
}
/* Entferne doppelte Listenzeichen - verwende nur HTML-Listen */
.bullet-list {
list-style-type: none;
}
.bullet-list li {
list-style: none;
position: relative;
padding-left: 1.5em;
margin-bottom: 8px;
text-align: left !important;
}
.bullet-list li::before {
content: "•";
color: #B39D14;
font-weight: bold;
position: absolute;
left: 0;
top: 0;
width: 1em;
}
/* Remove conflicting bullet styles from terms-list */
.terms-list {
list-style-type: none;
}
.terms-list li:before {
content: none; /* Remove the bullet */
}
.numbered-list {
list-style-type: none;
counter-reset: list-counter;
}
.numbered-list li {
counter-increment: list-counter;
position: relative;
padding-left: 2em;
margin-bottom: 8px;
text-align: left;
}
.numbered-list li::before {
content: counter(list-counter) ".";
color: #B39D14;
font-weight: bold;
position: absolute;
left: 0;
top: 0;
width: 1.5em;
}
/* Phase Cards Styling */
.phase-section {
margin-bottom: 50px;
page-break-inside: avoid;
}
.phase-card {
background: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 8px;
padding: 25px;
margin-bottom: 25px;
page-break-inside: avoid;
}
.phase-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.phase-name {
font-size: 18px;
font-weight: bold;
color: #172B46;
flex: 1;
margin-right: 20px;
}
.phase-cost {
background: white;
padding: 15px;
border-radius: 6px;
border: 1px solid #dee2e6;
text-align: center;
min-width: 150px;
flex-shrink: 0;
}
.cost-amount {
font-size: 20px;
font-weight: bold;
color: #B39D14;
margin-bottom: 5px;
}
.cost-label {
font-size: 12px;
color: #666;
}
.phase-details {
background: #e8f5f2;
padding: 25px;
border-radius: 6px;
border-left: 3px solid #B39D14;
}
.phase-details h5 {
color: #172B46;
margin-bottom: 20px;
font-size: 16px;
}
.phase-details li {
margin-bottom: 10px;
color: #333;
line-height: 1.6;
font-size: 14px;
text-align: justify;
}
/* Total Overview Styling */
.total-section {
margin-top: 50px;
margin-bottom: 50px;
}
.total-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 25px;
margin: 25px 0;
}
.total-card {
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
border-left: 4px solid #B39D14;
page-break-inside: avoid;
}
.total-card h4 {
color: #172B46;
margin-bottom: 25px;
font-size: 18px;
}
.cost-summary {
background: white;
padding: 25px;
border-radius: 6px;
border: 1px solid #dee2e6;
}
.cost-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 0;
border-bottom: 1px solid #f1f3f4;
}
.cost-row:last-child {
border-bottom: none;
}
.cost-row.total-row {
border-top: 2px solid #B39D14;
border-bottom: none;
font-weight: bold;
font-size: 18px;
color: #172B46;
padding-top: 25px;
}
/* Info Boxes Styling */
.info-box {
background: #e8f5f2;
padding: 25px;
border-radius: 6px;
border-left: 3px solid #B39D14;
margin: 30px 0;
page-break-inside: avoid;
}
.info-box h4 {
color: #172B46;
margin-bottom: 20px;
}
.info-box ul {
margin: 0;
padding-left: 20px;
}
.info-box li {
margin-bottom: 10px;
color: #333;
line-height: 1.6;
font-size: 14px;
text-align: justify;
}
/* Contact Information Styling */
.contact-section {
margin: 40px 0;
}
.contact-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 25px;
margin: 25px 0;
}
.contact-card {
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
border-left: 4px solid #B39D14;
page-break-inside: avoid;
}
.contact-card h4 {
color: #172B46;
margin-bottom: 20px;
font-size: 16px;
}
.contact-details {
background: white;
padding: 20px;
border-radius: 6px;
border: 1px solid #dee2e6;
}
.contact-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid #f1f3f4;
}
.contact-row:last-child {
border-bottom: none;
}
/* Terms and Conditions Styling */
.terms-section {
margin: 40px 0;
}
.terms-card {
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
border-left: 4px solid #B39D14;
margin-bottom: 25px;
page-break-inside: avoid;
}
.terms-card h4 {
color: #172B46;
margin-bottom: 20px;
font-size: 16px;
}
.terms-list {
background: white;
padding: 20px;
border-radius: 6px;
border: 1px solid #dee2e6;
}
.terms-list li {
margin-bottom: 12px;
padding-left: 25px;
position: relative;
line-height: 1.6;
text-align: justify;
}
/* Removed duplicate rule - bullets now handled by bullet-list class */
/* Signature Section Styling */
.signature-section {
margin: 50px 0;
page-break-inside: avoid;
}
.signature-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 50px;
margin: 30px 0;
}
.signature-card {
background: #f8f9fa;
padding: 30px;
border-radius: 8px;
border-left: 4px solid #B39D14;
min-height: 220px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.signature-card h4 {
color: #172B46;
margin-bottom: 25px;
font-size: 18px;
text-align: center;
}
.signature-area {
background: white;
border: 1px solid #dee2e6;
border-radius: 6px;
padding: 25px;
margin: 20px 0;
min-height: 80px;
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-style: italic;
}
.signature-details {
background: white;
padding: 20px;
border-radius: 6px;
border: 1px solid #dee2e6;
margin-top: 20px;
}
.signature-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid #f1f3f4;
}
.signature-row:last-child {
border-bottom: none;
}
/* Timeline Styling */
.timeline {
position: relative;
padding: 30px 0;
}
.timeline-item {
display: flex;
margin-bottom: 40px;
position: relative;
page-break-inside: avoid;
}
.timeline-marker {
width: 40px;
height: 40px;
background: #B39D14;
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
flex-shrink: 0;
margin-right: 25px;
}
.timeline-content {
flex: 1;
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
}
.timeline-content h4 {
color: #172B46;
margin-bottom: 20px;
font-size: 18px;
}
/* AI-Human Split Styling */
.ai-human-split {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 25px;
margin-bottom: 25px;
}
.ai-section, .human-section {
background: #f8f9fa;
padding: 20px;
border-radius: 6px;
border-left: 3px solid;
}
.ai-section {
border-left-color: #B39D14;
}
.human-section {
border-left-color: #172B46;
}
.ai-section h5, .human-section h5 {
color: #172B46;
margin-bottom: 15px;
font-size: 14px;
}
.ai-section ul, .human-section ul {
margin: 0;
padding-left: 20px;
}
.ai-section li, .human-section li {
font-size: 13px;
margin-bottom: 8px;
color: #495057;
line-height: 1.5;
text-align: justify;
}
/* Grid Layout for Cards */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 25px;
margin: 25px 0;
}
.card {
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
border-left: 4px solid #B39D14;
page-break-inside: avoid;
}
.card h4 {
color: #172B46;
margin-bottom: 20px;
font-size: 16px;
}
.card p, .card ul {
color: #495057;
line-height: 1.6;
font-size: 14px;
}
.card ul {
margin-left: 20px;
margin-top: 15px;
}
.card li {
margin-bottom: 10px;
text-align: justify;
}
/* Professional Print Styles */
@media print {
.page {
page-break-after: always;
margin: 0;
padding: 20px;
}
body {
background: white;
}
.signature-section {
page-break-inside: avoid;
}
.phase-card {
page-break-inside: avoid;
}
.total-card {
page-break-inside: avoid;
}
.info-box {
page-break-inside: avoid;
}
.contact-card {
page-break-inside: avoid;
}
.terms-card {
page-break-inside: avoid;
}
.timeline-item {
page-break-inside: avoid;
}
.card {
page-break-inside: avoid;
}
/* Ensure proper page breaks */
.page:last-child {
page-break-after: avoid;
}
/* Better text rendering for print */
* {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
.logo-section {
margin-top: 0;
}
/* Ensure footer appears on every printed page */
.page-footer {
position: fixed;
bottom: 20px;
left: 20px;
right: 20px;
background: white;
border-top: 2px solid #D4AF37;
padding: 10px 0;
z-index: 1000;
}
/* First page should not show footer */
.page:first-child .page-footer {
display: none;
}
}
/* Responsive Design */
@media (max-width: 768px) {
.ai-human-split {
grid-template-columns: 1fr;
gap: 15px;
}
.grid {
grid-template-columns: 1fr;
gap: 15px;
}
.timeline-item {
flex-direction: column;
}
.timeline-marker {
margin-right: 0;
margin-bottom: 15px;
align-self: flex-start;
}
}

View file

@ -0,0 +1,356 @@
/**
* Automated Table of Contents Generator
* Scans document for headings and generates TOC with REAL page numbers from PDF
*/
class TOCGenerator {
constructor() {
this.tocContainer = null;
this.headings = [];
this.pageNumbers = {};
this.totalPages = 0;
}
/**
* Initialize the TOC generator
*/
async init() {
console.log('🚀 TOC Generator initializing...');
// Find the TOC container
this.tocContainer = document.querySelector('.toc-auto');
if (!this.tocContainer) {
console.error('❌ TOC container not found. Looking for .toc-auto class.');
return;
}
console.log('✅ TOC container found:', this.tocContainer);
// Load real page numbers from PDF analysis
await this.loadPageNumbers();
// Generate TOC
this.generateTOC();
// Add event listener for dynamic updates
this.setupDynamicUpdates();
console.log('✅ TOC Generator initialized successfully');
}
/**
* Load real page numbers from the JSON file generated by PDF analysis
*/
async loadPageNumbers() {
try {
// Try to load page numbers from the JSON file
const response = await fetch('../page_numbers.json');
if (response.ok) {
this.pageNumbers = await response.json();
console.log('✅ Loaded real page numbers from PDF analysis');
// Calculate total pages from the highest page number
this.totalPages = Math.max(...Object.values(this.pageNumbers));
console.log(`📊 Total pages from PDF analysis: ${this.totalPages}`);
// Update CSS variable immediately
if (this.totalPages) {
document.documentElement.style.setProperty('--total-pages', this.totalPages);
console.log(`🎨 CSS variable --total-pages set to: ${this.totalPages}`);
} else {
console.error('❌ Cannot set CSS variable: totalPages is null');
}
} else {
console.error('❌ Page numbers file not found or empty');
this.pageNumbers = {};
this.totalPages = null; // No hardcoded value!
}
} catch (error) {
console.error('❌ ERROR: Cannot load page numbers from JSON file!');
console.error(' This usually means:');
console.error(' 1. The HTML file is opened directly (file://) instead of through a web server');
console.error(' 2. The page_numbers.json file is missing or corrupted');
console.error(' 3. CORS policy is blocking the request');
console.error(' Solution: Run the HTML through a local web server or fix the JSON file path');
console.error(' Original error:', error);
// Show error in TOC container instead of hardcoded values
this.tocContainer.innerHTML = `
<div style="color: red; padding: 20px; border: 2px solid red; background: #ffe6e6;">
<h2> Fehler beim Laden der Seitennummern</h2>
<p><strong>Problem:</strong> Die Datei page_numbers.json kann nicht geladen werden.</p>
<p><strong>Mögliche Ursachen:</strong></p>
<ul>
<li>HTML-Datei wird direkt geöffnet (file://) statt über Webserver</li>
<li>page_numbers.json fehlt oder ist beschädigt</li>
<li>CORS-Richtlinie blockiert den Zugriff</li>
</ul>
<p><strong>Lösung:</strong> Führen Sie main.py aus, um PDF zu generieren und zu analysieren.</p>
</div>
`;
this.pageNumbers = {};
this.totalPages = null; // No hardcoded value!
// Still try to generate TOC with estimated numbers
console.log('🔄 Attempting to generate TOC with estimated numbers...');
this.generateTOC();
}
}
/**
* Generate the complete TOC
*/
generateTOC() {
console.log('🔄 Generating TOC...');
// Clear existing content
this.tocContainer.innerHTML = '<h1 class="toc-title">Inhaltsverzeichnis</h1>';
// Find all headings with specific classes
this.headings = [];
// Try different selectors to find headings
const headingSelectors = [
'h1.content-heading.heading-level-1',
'h2.content-heading.heading-level-2',
'h3.content-heading.heading-level-3',
'h1.heading-level-1',
'h2.heading-level-2',
'h3.heading-level-3',
'h1.content-heading',
'h2.content-heading',
'h3.content-heading'
];
console.log('🔍 Looking for headings with selectors:', headingSelectors);
let foundAny = false;
headingSelectors.forEach(selector => {
const elements = document.querySelectorAll(selector);
console.log(`📋 Found ${elements.length} elements for selector: ${selector}`);
if (elements.length > 0) {
foundAny = true;
}
elements.forEach(element => {
// Get the text content WITH the numbering
const text = element.textContent.trim();
const level = element.classList.contains('heading-level-1') ? 1 :
element.classList.contains('heading-level-2') ? 2 : 3;
console.log(`📝 Heading: "${text}" (Level ${level})`);
// Only add if we don't already have this text
if (!this.headings.some(h => h.text === text)) {
this.headings.push({
element: element,
text: text,
level: level,
page: this.estimatePageNumber(element)
});
}
});
});
if (!foundAny) {
console.log('⚠️ No headings found with any selector. Trying generic h1, h2, h3...');
const genericHeadings = document.querySelectorAll('h1, h2, h3');
console.log(`📋 Found ${genericHeadings.length} generic headings`);
genericHeadings.forEach((element, index) => {
const text = element.textContent.trim();
const level = element.tagName === 'H1' ? 1 : element.tagName === 'H2' ? 2 : 3;
console.log(`📝 Generic Heading: "${text}" (Level ${level})`);
this.headings.push({
element: element,
text: text,
level: level,
page: 3 + Math.floor(index / 2) // Simple page estimation
});
});
}
console.log(`📊 Total headings found: ${this.headings.length}`);
// Sort headings by their position in the document
this.headings.sort((a, b) => {
const posA = a.element.getBoundingClientRect().top;
const posB = b.element.getBoundingClientRect().top;
return posA - posB;
});
// Generate TOC entries
this.headings.forEach(heading => {
const entry = this.createTOCEntry(heading);
this.tocContainer.appendChild(entry);
});
// Update total pages based on actual content
if (this.headings.length > 0) {
const maxPage = Math.max(...this.headings.map(h => h.page));
this.totalPages = maxPage;
console.log(`📊 Total pages calculated: ${this.totalPages}`);
// Update CSS variable for footers
document.documentElement.style.setProperty('--total-pages', this.totalPages);
// Update footer text to show total pages
this.updateFooterText();
}
console.log('✅ TOC generation complete');
}
/* Removed getRealPageNumber function - using direct estimation instead */
/**
* Estimate page number (fallback method)
*/
estimatePageNumber(element) {
try {
if (!element) return 3;
const rect = element.getBoundingClientRect();
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const absoluteTop = rect.top + scrollTop;
// A4 page height in pixels (assuming 96 DPI)
// A4 = 210mm x 297mm, 1 inch = 25.4mm, 1 inch = 96 pixels
const pageHeightPixels = (297 * 96) / 25.4; // ~1123 pixels per page
// Account for margins and spacing - use actual content height
const effectivePageHeight = pageHeightPixels - 150; // More realistic margin
// Calculate page number (start from page 3 since pages 1-2 are title and TOC)
let pageNumber = Math.floor(absoluteTop / effectivePageHeight) + 3;
// Don't clamp - let it go to actual page count
console.log(`📄 Element "${element.textContent.trim()}" at position ${absoluteTop}px = page ${pageNumber}`);
return pageNumber;
} catch (error) {
console.warn('Error estimating page number:', error);
return 3; // Default fallback
}
}
/**
* Create a TOC entry element
*/
createTOCEntry(heading) {
const entry = document.createElement('div');
entry.className = `toc-entry toc-level-${heading.level}`;
// Create the text content
const textSpan = document.createElement('span');
textSpan.className = 'toc-text';
textSpan.textContent = heading.text;
// Create the dots area (now just spacing)
const dotsSpan = document.createElement('span');
dotsSpan.className = 'dots';
// Create the page number
const pageSpan = document.createElement('span');
pageSpan.className = 'toc-page';
pageSpan.textContent = heading.page;
// Assemble the entry
entry.appendChild(textSpan);
entry.appendChild(dotsSpan);
entry.appendChild(pageSpan);
// Add click functionality to jump to heading
entry.addEventListener('click', () => {
heading.element.scrollIntoView({ behavior: 'smooth' });
});
return entry;
}
/**
* Setup dynamic updates
*/
setupDynamicUpdates() {
// Refresh TOC when window is resized
window.addEventListener('resize', () => {
setTimeout(() => this.refresh(), 100);
});
// Refresh TOC when content changes
const observer = new MutationObserver(() => {
this.refresh();
});
// Observe the main content area
const mainContent = document.querySelector('.main-content');
if (mainContent) {
observer.observe(mainContent, {
childList: true,
subtree: true,
characterData: true
});
}
}
/**
* Refresh the TOC
*/
async refresh() {
await this.loadPageNumbers();
this.generateTOC();
}
/**
* Estimate page number based on element position
*/
estimatePageNumber(element) {
const pageHeightPixels = 1123; // A4 height in pixels at 96 DPI
const absoluteTop = element.offsetTop;
const estimatedPage = Math.floor(absoluteTop / pageHeightPixels) + 1;
console.log(`📍 Element "${element.textContent.trim()}" at position ${absoluteTop}px -> estimated page ${estimatedPage}`);
return estimatedPage;
}
/**
* Get total page count for footer updates
*/
getTotalPages() {
return this.totalPages;
}
}
// Initialize when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
console.log('🚀 TOC Generator: DOM loaded, starting...');
// Wait for numbering script to finish
setTimeout(() => {
console.log('🔄 TOC Generator: Creating instance...');
window.tocGenerator = new TOCGenerator();
window.tocGenerator.init();
}, 100);
});
// Also try immediate execution as fallback
console.log('📜 TOC Generator script loaded');
// Simple test - if this shows up, JavaScript is working
document.addEventListener('DOMContentLoaded', function() {
console.log('🧪 SIMPLE TEST: JavaScript is working!');
// Test if we can find the TOC container
const tocContainer = document.querySelector('.toc-auto');
if (tocContainer) {
console.log('✅ Found TOC container:', tocContainer);
// Don't overwrite the TOC content - just log that we found it
} else {
console.log('❌ TOC container NOT found');
}
});

View file

@ -407,179 +407,7 @@
}
}
/* Offerte Tab Styles */
.offerte-phase {
background: #f8f9fa;
border-radius: 8px;
padding: 25px;
margin: 20px 0;
border-left: 4px solid #00a88e;
}
.phase-summary {
margin-bottom: 20px;
}
.phase-summary h4 {
color: #00594c;
margin-bottom: 15px;
font-size: 18px;
}
.cost-breakdown {
background: white;
padding: 20px;
border-radius: 6px;
border: 1px solid #dee2e6;
}
.cost-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid #f1f3f4;
}
.cost-item:last-child {
border-bottom: none;
}
.cost-item.total {
border-top: 2px solid #00a88e;
border-bottom: none;
font-weight: bold;
font-size: 16px;
color: #00594c;
}
.cost-item .label {
color: #495057;
}
.cost-item .value {
color: #00594c;
font-weight: 600;
}
.phase-details {
background: #e8f5f2;
padding: 20px;
border-radius: 6px;
border-left: 3px solid #00a88e;
}
.phase-details h5 {
color: #00594c;
margin-bottom: 15px;
font-size: 16px;
}
.phase-details ul {
margin: 0;
padding-left: 20px;
}
.phase-details li {
margin-bottom: 8px;
color: #495057;
line-height: 1.5;
}
.total-overview {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 25px;
margin: 30px 0;
}
.total-costs, .payment-terms, .additional-info {
background: #f8f9fa;
padding: 25px;
border-radius: 8px;
border-left: 4px solid #00a88e;
}
.total-costs h4, .payment-terms h4, .additional-info h4 {
color: #00594c;
margin-bottom: 20px;
font-size: 18px;
}
.cost-summary {
background: white;
padding: 20px;
border-radius: 6px;
border: 1px solid #dee2e6;
}
.cost-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #f1f3f4;
}
.cost-row:last-child {
border-bottom: none;
}
.cost-row.total-row {
border-top: 2px solid #00a88e;
border-bottom: none;
font-weight: bold;
font-size: 18px;
color: #00594c;
padding-top: 20px;
}
.payment-terms ul, .additional-info ul {
margin: 0;
padding-left: 20px;
}
.payment-terms li, .additional-info li {
margin-bottom: 10px;
color: #495057;
line-height: 1.5;
}
@media (max-width: 768px) {
.total-overview {
grid-template-columns: 1fr;
gap: 20px;
}
.cost-item, .cost-row {
flex-direction: column;
align-items: flex-start;
gap: 5px;
}
}
/* Customer Tasks Styles */
.customer-tasks h5 {
color: #00594c;
margin: 15px 0 10px 0;
font-size: 14px;
border-bottom: 1px solid #dee2e6;
padding-bottom: 5px;
}
.customer-tasks h5:first-child {
margin-top: 0;
}
.customer-tasks ul {
margin: 10px 0 15px 20px;
}
.customer-tasks li {
margin-bottom: 6px;
color: #495057;
line-height: 1.4;
}
</style>
</head>
<body>
@ -595,13 +423,25 @@
<button class="tab-button" onclick="switchTab(event, 'process')">Geschäftsprozess</button>
<button class="tab-button" onclick="switchTab(event, 'interfaces')">Interfaces & Touchpoints</button>
<button class="tab-button" onclick="switchTab(event, 'roadmap')">Implementierungs-Roadmap</button>
<button class="tab-button" onclick="switchTab(event, 'offerte')">Offerte</button>
<button class="tab-button" onclick="switchTab(event, 'support')">Unterstützungsbereiche</button>
</div>
<div id="overview" class="tab-content active">
<h2>Projektübersicht</h2>
<div class="card">
<h4>Wichtigste Erkenntnisse aus der Besprechung (20. August 2025)</h4>
<ul>
<li><strong>Pilot-Ansatz:</strong> Start mit 5 Verkäufern, Skalierung auf 30 nach Erfolg</li>
<li><strong>Zeitrahmen:</strong> Ziel: Fertigstellung 2025, Budget 2026 bereits geplant</li>
<li><strong>Bestehende Systeme:</strong> Company GPT, Azure ML, Postgres-Datenbank verfügbar</li>
<li><strong>Compliance-Fokus:</strong> DSGVO, LinkedIn-Nutzungsbedingungen, Datenschutz</li>
<li><strong>Modularer Aufbau:</strong> Lego-ähnliche Struktur für flexible Anpassungen</li>
<li><strong>Integration:</strong> PowerOn Platform als Workflow-Engine mit bestehenden Systemen</li>
</ul>
</div>
<div class="card">
<h4>Ausgangslage</h4>
<p>Energie360° transformiert sich zum Anbieter ausschliesslich erneuerbarer Energie bis 2040. Der Geschäftsbereich "Lösungen" fokussiert auf integrale Energielösungen und Contracting für Neubauprojekte.</p>
@ -613,10 +453,11 @@
<div class="card">
<h4>Personal & Kapazität</h4>
<ul>
<li><strong>5 Verkaufspersonen</strong> bearbeiten Leads</li>
<li><strong>5 Verkaufspersonen</strong> bearbeiten Leads (Pilot-Team)</li>
<li><strong>100 Leads pro Jahr</strong> werden bearbeitet</li>
<li><strong>2 Stunden pro Lead</strong> bis zur Qualifikation</li>
<li><strong>Manuelle Prozesse</strong> dominieren den Workflow</li>
<li><strong>30 Verkäufer</strong> insgesamt in der Firma</li>
</ul>
</div>
@ -625,6 +466,7 @@
<ul>
<li><strong>Hauptquelle: Baublatt</strong> (eher spät im Projektzyklus)</li>
<li>Manuelle Recherche auf SIMAP und espazium</li>
<li>LinkedIn als wichtige Quelle für Architekten-Projekte</li>
<li>Reaktive Bearbeitung statt proaktiver Früherkennung</li>
<li>Begrenzte Marktabdeckung durch Zeitmangel</li>
</ul>
@ -637,6 +479,7 @@
<li>Keine systematische Qualifikation und Priorisierung</li>
<li>Fehlende Integration zwischen Datenquellen</li>
<li>Begrenzte Skalierbarkeit der Lead-Generierung</li>
<li>Risiko von Duplikaten bei manueller Bearbeitung</li>
</ul>
</div>
</div>
@ -680,7 +523,7 @@
<div class="phase-grid">
<div class="phase-card">
<h4>Scout-Agent</h4>
<p>Automatisierte Suche auf SIMAP, Baublatt, espazium</p>
<p>Automatisierte Suche auf SIMAP, Baublatt, espazium, LinkedIn</p>
</div>
<div class="phase-card">
<h4>Enricher-Agent</h4>
@ -701,13 +544,22 @@
<h2>Customer Journey - Energie360° Perspektive</h2>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-content">
<h4>Hinweis</h4>
<p><strong>Status heute:</strong> Manuelle Recherche, reaktive Bearbeitung</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">1</div>
<div class="timeline-content">
<h4>Lead Discovery</h4>
<p><strong>Status heute:</strong> Manuelle Recherche, reaktive Bearbeitung</p>
<p><strong>Mit KI-System:</strong> Automatisierte Früherkennung in SIA Phase 2-3</p>
<p><strong>Output:</strong> Qualifizierte Lead-Liste mit Scoring</p>
<p><strong>Touchpoint:</strong> User Interface zur Erfassung/Anpassung/Upload Suchkriterien; Review Output; Dashboard</p>
<p><strong>KI-Automation:</strong> Automatisierte Früherkennung in SIA Phase 2-3, Erkennung von Doubletten</p>
<p><strong>Output:</strong> Qualifizierte Lead-Liste mit erstem Scoring</p>
<p><strong>Häufigkeit:</strong> Aktualisierung alle 3 Stunden</p>
<p><strong>Datenquellen:</strong> Baublatt, SIMAP, espazium, LinkedIn (mit Compliance)</p>
</div>
</div>
@ -715,33 +567,69 @@
<div class="timeline-marker">2</div>
<div class="timeline-content">
<h4>Lead Enrichment</h4>
<p><strong>Automatisiert:</strong> Projektdaten, Stakeholder, Fernwärme-Check</p>
<p><strong>Zeit:</strong> Von Stunden auf Minuten reduziert</p>
<p><strong>Qualität:</strong> Strukturierte, vollständige Datensätze</p>
<p><strong>Touchpoint:</strong> User Interface zur Erfassung/Anpassung/Upload Suchkriterien; Review Output; Dashboard</p>
<p><strong>KI-Automation:</strong> Leads ergänzen um Projektdaten, Stakeholder, Fernwärme-Check</p>
<p><strong>Häufigkeit:</strong> Aktualisierung alle 3 Stunden</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">3</div>
<div class="timeline-content">
<h4>Lead Qualification</h4>
<p><strong>Kriterien:</strong> Projektgrösse, Fernwärme-Status, Bauphase</p>
<p><strong>Priorisierung:</strong> Automatisches Scoring und Ranking</p>
<p><strong>Integration:</strong> Direkte Übergabe an Vertriebsteam</p>
<h4>Lead Qualification, Scoring und Anreicherung Kontaktdaten</h4>
<p><strong>Touchpoint:</strong> User Interface zur Erfassung/Anpassung/Upload Qualifikations- und Scoring Kriterien; Review Output; Dashboard</p>
<p><strong>KI-Automation:</strong> Automatische Priorisierung durch Scoring und Ranking gegenüber definierten Kriterien; Anreicherung von Kontaktinfos der Leads mit Status «qualifiziert»</p>
<p><strong>Häufigkeit:</strong> Aktualisierung alle 3 Stunden</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">4</div>
<div class="timeline-content">
<h4>Vertriebsprozess</h4>
<p><strong>Timing:</strong> Kontaktaufnahme in optimaler Projektphase</p>
<p><strong>Ansatz:</strong> Datengestützte Ansprache mit relevanten Lösungen</p>
<p><strong>Tracking:</strong> Lückenlose Dokumentation im CRM</p>
<h4>Übergabe an Vertriebsprozess</h4>
<p><strong>Touchpoint:</strong> User Interface zum Review Leadsliste; Dashboard «KI-gestütztes Lead Management System»; Dashboard</p>
<p><strong>KI-Automation:</strong> Ergänzung Lead um mögliche E360 Produkte oder Services; Vorschlag für nächste Aktion des Vertriebsteams; Automatische Zuweisung nach Regionen/Teams; Workload-Balancing zwischen Vertriebsmitarbeitern</p>
<p><strong>Output:</strong> Lead-Liste updated mit Übergabedatum an CRM</p>
</div>
</div>
</div>
<h3>Sales Execution & Follow-up im Vertriebsprozess</h3>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-marker">5</div>
<div class="timeline-content">
<h4>Sales Execution & Follow-up</h4>
<p><strong>Touchpoint:</strong> CRM System und Dashboard</p>
<p><strong>KI-Automation:</strong> Automatisierte Status Tracking und Reminder-System, Optimierte Kommunikationsstrategien, Lead-Scoring Updates basierend auf Interaktionen, Automatische Wiedervorlage-Planung</p>
<p><strong>Output:</strong> Aktive verwaltete Lead-Liste in CRM System</p>
</div>
</div>
</div>
<h3>Nutzen für Vertriebsprozess durch KI Automatisierung</h3>
<div class="grid">
<div class="card">
<h4>Daten Research, Anreicherung und Erstqualifikation</h4>
<ul>
<li>Von Stunden auf Minuten reduziert</li>
<li>Häufigkeit: Laufende Aktualisierung mehrmals am Tag, jeden Tag</li>
<li>Verbesserte Qualität: Strukturierte, vollständige Datensätze</li>
</ul>
</div>
<div class="card">
<h4>Timing und Ansatz</h4>
<ul>
<li>Timing: Kontaktaufnahme in optimaler Projektphase</li>
<li>Ansatz: Datengestützte Ansprache mit relevanten Lösungen</li>
<li>Tracking: Lückenlose Dokumentation im CRM</li>
</ul>
</div>
</div>
<h3>Mehrwert für Vertriebsteam</h3>
<div class="metrics-grid">
@ -772,7 +660,7 @@
<p>Der Lead Management Prozess von Energie360° ist ein strukturierter, iterativer Prozess, der durch KI-gestützte Automatisierung und menschliche Expertise optimiert wird. Jeder Prozessschritt hat definierte KPIs und klare Verantwortlichkeiten.</p>
</div>
<h3>Vergleich: Heute vs. Mit KI-System</h3>
<h3>Vergleich: Heute vs. Unterstützung durch KI-System</h3>
<div class="grid">
<div class="card">
@ -781,10 +669,11 @@
<div class="current-state">
<h5>🔴 Heute</h5>
<ul>
<li><strong>5 Verkaufspersonen</strong></li>
<li><strong>5 Verkaufspersonen</strong> (Pilot-Team)</li>
<li><strong>100 Leads pro Jahr</strong></li>
<li><strong>2 Stunden pro Lead</strong> bis Qualifikation</li>
<li>Manuelle Bearbeitung dominiert</li>
<li>Risiko von Duplikaten</li>
</ul>
</div>
<div class="future-state">
@ -794,6 +683,7 @@
<li><strong>500+ Leads pro Jahr</strong> (5x Steigerung)</li>
<li><strong>0.5 Stunden pro Lead</strong> bis Qualifikation</li>
<li>KI-gestützte Automatisierung</li>
<li>Automatische Deduplizierung</li>
</ul>
</div>
</div>
@ -860,7 +750,7 @@
<div class="ai-section">
<h5>🤖 KI-Unterstützung (80%)</h5>
<ul>
<li>Automatisierte Überwachung von SIMAP, Baublatt, espazium</li>
<li>Automatisierte Überwachung von SIMAP, Baublatt, espazium, LinkedIn</li>
<li>Früherkennung in SIA Phase 2-3</li>
<li>Automatische Filterung nach Projektgröße (>50 WE oder >50'000 m²)</li>
<li>Deduplizierung und Qualitätsprüfung</li>
@ -930,7 +820,7 @@
<div class="timeline-item">
<div class="timeline-marker">3</div>
<div class="timeline-content">
<h4>Lead Qualification & Scoring</h4>
<h4>Lead Qualification, Scoring & Kontakanreicherung</h4>
<div class="process-details">
<div class="ai-human-split">
<div class="ai-section">
@ -941,6 +831,7 @@
<li>Fernwärme-Potential Bewertung</li>
<li>Wettbewerbsanalyse und Marktpositionierung</li>
<li>Automatische Kategorisierung nach Region/Team</li>
<li>Kontaktanreicherung der Leads mit Status «qualifiziert»</li>
</ul>
</div>
<div class="human-section">
@ -969,7 +860,7 @@
<div class="timeline-item">
<div class="timeline-marker">4</div>
<div class="timeline-content">
<h4>Sales Handover & Assignment</h4>
<h4>Übergabe an Vertriebsteam</h4>
<div class="process-details">
<div class="ai-human-split">
<div class="ai-section">
@ -978,7 +869,7 @@
<li>Automatische Zuweisung nach Regionen/Teams</li>
<li>Workload-Balancing zwischen Vertriebsmitarbeitern</li>
<li>Automatische Lead-Import in CRM-Systeme</li>
<li>Status-Synchronisation und Tracking</li>
</ul>
</div>
<div class="human-section">
@ -1013,6 +904,7 @@
<div class="ai-section">
<h5>🤖 KI-Unterstützung (40%)</h5>
<ul>
<li>Status-Synchronisation und Tracking</li>
<li>Automatisierte Reminder-Systeme</li>
<li>Optimierte Kommunikationsstrategien</li>
<li>Lead-Scoring Updates basierend auf Interaktionen</li>
@ -1071,7 +963,7 @@
<div class="card">
<h4>Marketing Team (Lead Generation)</h4>
<ul>
<li>Überwachung der KI-Scouts</li>
<li>Überwachung der KI-Discovery</li>
<li>Qualitätskontrolle der generierten Leads</li>
<li>Optimierung der Scoring-Kriterien</li>
<li>Reporting und Performance-Monitoring</li>
@ -1115,8 +1007,10 @@
<div class="card">
<h4>Phase 1: MVP (2-3 Monate)</h4>
<ul>
<li><strong>Fokus:</strong> Baublatt + 2-3 weitere Quellen</li>
<li><strong>Scoring:</strong> Einfacher Algorithmus (SIA Phase, Budget, Region)</li>
<li><strong>Discovery:</strong> Baublatt + 2-3 weitere Quellen</li>
<li><strong>Enrichment:</strong> Anreicherung um erste Projektdaten</li>
<li><strong>Qualification & Scoring:</strong> Einfacher Algorithmus (SIA Phase, Budget, Region)</li>
<li><strong>Kontaktdatenanreicherung:</strong> Anreicherung der Leads mit Status «qualifiziert»</li>
<li><strong>Ziel:</strong> 50-100 qualifizierte Leads pro Monat</li>
<li><strong>Qualität:</strong> 70% der Leads erfüllen Mindestkriterien</li>
</ul>
@ -1125,8 +1019,10 @@
<div class="card">
<h4>Phase 2: Erweiterung (Monate 4-6)</h4>
<ul>
<li><strong>Fokus:</strong> LinkedIn, Baublatt Premium, SIA</li>
<li><strong>Scoring:</strong> Machine Learning Optimierung</li>
<li><strong>Discovery:</strong> LinkedIn, Baublatt Premium, SIA</li>
<li><strong>Enrichment:</strong> Anreicherung um alle Projektdaten</li>
<li><strong>Qualification & Scoring:</strong> Machine Learning Optimierung</li>
<li><strong>Kontaktdatenanreicherung:</strong> Verbesserung der Anreicherung der Leads mit Status «qualifiziert»</li>
<li><strong>Ziel:</strong> 100-200 Leads pro Monat</li>
<li><strong>Qualität:</strong> 80% der Leads erfüllen Mindestkriterien</li>
</ul>
@ -1135,8 +1031,9 @@
<div class="card">
<h4>Phase 3: Vollintegration (Monate 7-9)</h4>
<ul>
<li><strong>Fokus:</strong> Vollständige Automatisierung</li>
<li><strong>Scoring:</strong> Erweiterte KI-Modelle</li>
<li><strong>Discovery:</strong> Optimierung aus Learning</li>
<li><strong>Enrichment:</strong> Optimierung der Anreicherung der Projektdaten</li>
<li><strong>Qualification & Scoring:</strong> Erweiterte KI-Modelle</li>
<li><strong>Ziel:</strong> 200+ Leads pro Monat</li>
<li><strong>Qualität:</strong> 85% der Leads erfüllen Mindestkriterien</li>
</ul>
@ -1178,6 +1075,17 @@
<div id="interfaces" class="tab-content">
<h2>User Interfaces & Touchpoints</h2>
<div class="card">
<h4>Technische Integration & Compliance</h4>
<ul>
<li><strong>Bestehende Systeme:</strong> Company GPT, Azure ML, Postgres-Datenbank</li>
<li><strong>PowerOn Platform:</strong> Workflow-Engine mit KI-Services</li>
<li><strong>Compliance:</strong> DSGVO-konforme Anonymisierung, LinkedIn-Nutzungsbedingungen</li>
<li><strong>Datenquellen:</strong> Baublatt, SIMAP, espazium, LinkedIn (mit API-Limits)</li>
<li><strong>Modularität:</strong> Lego-ähnlicher Aufbau für flexible Anpassungen</li>
</ul>
</div>
<div class="interface-demo">
<h4>1. Dashboard - Zentrale Übersicht</h4>
<div class="demo-screen">
@ -1209,6 +1117,15 @@
</div>
</div>
<div class="interface-demo">
<h4>2.1 User Interface für Listen und Listeneinträge</h4>
<div class="demo-screen">
<div class="demo-label">Wichtiger Hinweis</div>
<p><strong>Benötigt:</strong> User Interface, mit welchem der User die Listen oder Listeneinträge anschauen und bearbeiten kann</p>
<p><strong>Siehe auch:</strong> Touchpoints bei Customer Journey</p>
</div>
</div>
<div class="interface-demo">
<h4>3. CRM Integration</h4>
<div class="demo-screen">
@ -1248,10 +1165,13 @@
<h4>Phase 1: MVP (2-3 Monate)</h4>
<div class="duration">Wochen 1-12</div>
<ul>
<li><strong>Lead Discovery:</strong> Baublatt + 2-3 weitere Quellen</li>
<li><strong>Basis Scoring:</strong> Einfacher Algorithmus (SIA Phase, Budget, Region)</li>
<li><strong>Lead Discovery:</strong> Baublatt + 2-3 weitere Quellen</li>
<li><strong>Enrichment:</strong> Anreicherung um erste Projektdaten</li>
<li><strong>Basis Scoring:</strong> Einfacher Algorithmus (SIA Phase, Budget, Region)</li>
<li><strong>Kontaktdatenanreicherung:</strong> Anreicherung der Leads mit Status «qualifiziert»</li>
<li><strong>Dashboard:</strong> Grundfunktionen für Sales Team</li>
<li><strong>CRM:</strong> HubSpot Integration (Basis)</li>
<li><strong>Integration:</strong> Company GPT, Azure ML, Postgres</li>
<li><strong>Ziel:</strong> 50-100 qualifizierte Leads pro Monat</li>
</ul>
<p><strong>Deliverable:</strong> Funktionsfähiges System mit 50-100 Leads/Monat</p>
@ -1261,10 +1181,11 @@
<h4>Phase 2: Erweiterung (Monate 4-6)</h4>
<div class="duration">Wochen 13-24</div>
<ul>
<li><strong>Erweiterte Quellen:</strong> LinkedIn, Baublatt Premium, SIA</li>
<li><strong>Lead Discovery:</strong> Erweiterte Quellen wie LinkedIn, Baublatt Premium, SIA</li>
<li><strong>Enrichment:</strong> Anreicherung um alle Projektdaten</li>
<li><strong>Scoring Optimierung:</strong> Machine Learning Modelle</li>
<li><strong>Dashboard:</strong> Erweiterte Analytics & Reports</li>
<li><strong>KI-Agenten:</strong> Scout, Enricher, Scorer</li>
<li><strong>Kontaktdatenanreicherung:</strong> Verbesserung der Anreicherung der Leads mit Status «qualifiziert»</li>
<li><strong>Ziel:</strong> 100-200 Leads pro Monat</li>
</ul>
<p><strong>Deliverable:</strong> Vollständiges System mit erweiterten Quellen</p>
@ -1329,303 +1250,7 @@
</div>
</div>
<div id="offerte" class="tab-content">
<h2>ValueOn Offerte - KI-Lead Management System</h2>
<div class="card">
<h4>Offerte Übersicht</h4>
<p>Diese Offerte von ValueOn für Energie360° ist in 4 Phasen unterteilt, die jeweils unabhängig bestellt werden können. Jede Phase beinhaltet die entsprechenden Projektmanagement-Anteile und kann separat abgerechnet werden.</p>
<p><strong>Wichtiger Hinweis:</strong> Dies ist eine Schätzung des Mengengerüstes, wie wir das Projekt zusammen ausführen könnten. Der konkrete Aufgabensplit zwischen Kunde (Energie360°) und ValueOn ist noch zu klären und kann je nach Verfügbarkeit und Präferenzen angepasst werden.</p>
<p><strong>Tagessätze ValueOn (exkl. MWSt):</strong></p>
<ul>
<li><strong>ValueOn Experte:</strong> CHF 2'150.- pro Tag</li>
<li><strong>ValueOn PowerOn Development Team:</strong> CHF 950.- pro Tag</li>
</ul>
</div>
<h3>Phase 1: MVP (2-3 Monate)</h3>
<div class="offerte-phase">
<div class="phase-summary">
<h4>📋 Phase 1: MVP - Funktionsfähiges System</h4>
<div class="cost-breakdown">
<div class="cost-item">
<span class="label">ValueOn Experte:</span>
<span class="value">4 Tage × CHF 2'150 = CHF 8'600</span>
</div>
<div class="cost-item">
<span class="label">ValueOn PowerOn Development Team:</span>
<span class="value">65 Tage × CHF 950 = CHF 61'750</span>
</div>
<div class="cost-item total">
<span class="label">Gesamt Phase 1:</span>
<span class="value">CHF 70'350</span>
</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Lead Discovery Setup:</strong> Scout-Agent für Baublatt + 2-3 weitere Quellen</li>
<li><strong>Basis Scoring Algorithmus:</strong> Einfacher Scoring (SIA Phase, Budget, Region)</li>
<li><strong>Dashboard Grundfunktionen:</strong> Grundlegende Features für Sales Team</li>
<li><strong>HubSpot CRM Integration:</strong> Basis-Integration für Lead-Export</li>
<li><strong>Testing & Validation:</strong> Testen mit 50-100 realen Leads</li>
<li><strong>Projektmanagement:</strong> 2 Monate × 1 Tag/Monat = 2 Tage</li>
</ul>
<p><strong>Deliverable:</strong> Funktionsfähiges MVP-System mit 50-100 Leads/Monat</p>
</div>
</div>
<h3>Phase 2: Erweiterung (Monate 4-6)</h3>
<div class="offerte-phase">
<div class="phase-summary">
<h4>📋 Phase 2: Erweiterung - Vollständiges System</h4>
<div class="cost-breakdown">
<div class="cost-item">
<span class="label">ValueOn Experte:</span>
<span class="value">4 Tage × CHF 2'150 = CHF 8'600</span>
</div>
<div class="cost-item">
<span class="label">ValueOn PowerOn Development Team:</span>
<span class="value">75 Tage × CHF 950 = CHF 71'250</span>
</div>
<div class="cost-item total">
<span class="label">Gesamt Phase 2:</span>
<span class="value">CHF 79'850</span>
</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Erweiterte Datenquellen:</strong> LinkedIn, Baublatt Premium, SIA</li>
<li><strong>Scoring Optimierung:</strong> ML-basierte Scoring-Modelle</li>
<li><strong>Dashboard Analytics:</strong> Erweiterte Analytics & Reports</li>
<li><strong>KI-Agenten Integration:</strong> Scout, Enricher, Scorer Agenten</li>
<li><strong>Performance Testing:</strong> Testen mit 100-200 Leads/Monat</li>
<li><strong>Projektmanagement:</strong> 3 Monate × 1 Tag/Monat = 3 Tage</li>
</ul>
<p><strong>Deliverable:</strong> Vollständiges System mit erweiterten Quellen</p>
</div>
</div>
<h3>Phase 3: Vollintegration (Monate 7-9)</h3>
<div class="offerte-phase">
<div class="phase-summary">
<h4>📋 Phase 3: Vollintegration - Produktionsreife Lösung</h4>
<div class="cost-breakdown">
<div class="cost-item">
<span class="label">ValueOn Experte:</span>
<span class="value">6 Tage × CHF 2'150 = CHF 12'900</span>
</div>
<div class="cost-item">
<span class="label">ValueOn PowerOn Development Team:</span>
<span class="value">75 Tage × CHF 950 = CHF 71'250</span>
</div>
<div class="cost-item total">
<span class="label">Gesamt Phase 3:</span>
<span class="value">CHF 84'150</span>
</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Workflow Engine:</strong> Vollständige Automatisierung der Workflows</li>
<li><strong>Stakeholder-Agent:</strong> Vollständige Integration</li>
<li><strong>Power BI Integration:</strong> Erweiterte Reports & Analytics</li>
<li><strong>Teams Integration:</strong> Vollständige Microsoft Teams Integration</li>
<li><strong>End-to-End Testing:</strong> Testen der vollständigen Integration</li>
<li><strong>Projektmanagement:</strong> 3 Monate × 1 Tag/Monat = 3 Tage</li>
</ul>
<p><strong>Deliverable:</strong> Integrierte Lösung im Produktivbetrieb</p>
</div>
</div>
<h3>Phase 4: Skalierung (Monate 10-12)</h3>
<div class="offerte-phase">
<div class="phase-summary">
<h4>📋 Phase 4: Skalierung - Expansion & Optimierung</h4>
<div class="cost-breakdown">
<div class="cost-item">
<span class="label">ValueOn Experte:</span>
<span class="value">6 Tage × CHF 2'150 = CHF 12'900</span>
</div>
<div class="cost-item">
<span class="label">ValueOn PowerOn Development Team:</span>
<span class="value">80 Tage × CHF 950 = CHF 76'000</span>
</div>
<div class="cost-item total">
<span class="label">Gesamt Phase 4:</span>
<span class="value">CHF 88'900</span>
</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Performance Optimierung:</strong> Optimierung für größere Volumen</li>
<li><strong>Predictive Analytics:</strong> Erweiterte Vorhersagemodelle</li>
<li><strong>Regionale Skalierung:</strong> Vorbereitung für Expansion</li>
<li><strong>KI-Optimierung:</strong> Kontinuierliche Verbesserung der KI-Modelle</li>
<li><strong>Dokumentation & Training:</strong> Vollständige Dokumentation und Team-Training</li>
<li><strong>Projektmanagement:</strong> 3 Monate × 1 Tag/Monat = 3 Tage</li>
</ul>
<p><strong>Deliverable:</strong> Skalierbare Lösung für Expansion</p>
</div>
</div>
<h3>Mitwirkungspflicht des Kunden (Energie360°)</h3>
<div class="card">
<h4>Wichtiger Hinweis zur Aufgabenteilung</h4>
<p>Die folgenden Kundenaufgaben basieren auf der detaillierten Aufwandsschätzung und sind von Energie360° sicherzustellen. ValueOn hat die Projektmanagement-Kosten bereits inkludiert. Energie360° kann auch Leistungen an ValueOn übertragen, falls gewünscht.</p>
</div>
<div class="grid">
<div class="card">
<h4>Phase 1: MVP (2-3 Monate)</h4>
<div class="customer-tasks">
<h5>Kundenaufgaben (30 Personentage):</h5>
<ul>
<li><strong>Lead Discovery Setup:</strong> 5 Tage (Fachliche Inputs, Anforderungen)</li>
<li><strong>Basis Scoring Algorithmus:</strong> 5 Tage (Geschäftsregeln, Scoring-Kriterien)</li>
<li><strong>Dashboard Grundfunktionen:</strong> 5 Tage (UI/UX Anforderungen, Workflow-Definition)</li>
<li><strong>HubSpot CRM Integration:</strong> 5 Tage (CRM-Konfiguration, Datenmapping)</li>
<li><strong>Testing & Validation:</strong> 10 Tage (Endnutzer-Tests, Validierung der Leads)</li>
</ul>
<h5>Übertragbare Aufgaben (an ValueOn):</h5>
<ul>
<li>Zusätzliche Testing-Unterstützung (5-10 Tage)</li>
<li>Endnutzer-Training (5 Tage)</li>
<li>Erweiterte Dokumentation (5 Tage)</li>
</ul>
</div>
</div>
<div class="card">
<h4>Phase 2: Erweiterung (Monate 4-6)</h4>
<div class="customer-tasks">
<h5>Kundenaufgaben (30 Personentage):</h5>
<ul>
<li><strong>Erweiterte Datenquellen:</strong> 5 Tage (Zugangsdaten, API-Keys, Anforderungen)</li>
<li><strong>Scoring Optimierung:</strong> 5 Tage (ML-Training, Validierung, Feedback)</li>
<li><strong>Dashboard Analytics:</strong> 5 Tage (Reporting-Anforderungen, KPIs)</li>
<li><strong>KI-Agenten Integration:</strong> 5 Tage (Workflow-Definition, Geschäftsregeln)</li>
<li><strong>Performance Testing:</strong> 10 Tage (Erweiterte Tests, Skalierungstests)</li>
</ul>
<h5>Übertragbare Aufgaben (an ValueOn):</h5>
<ul>
<li>Zusätzliche Testing-Unterstützung (5-10 Tage)</li>
<li>Erweiterte Dokumentation (5 Tage)</li>
<li>Performance-Optimierung (5 Tage)</li>
</ul>
</div>
</div>
<div class="card">
<h4>Phase 3: Vollintegration (Monate 7-9)</h4>
<div class="customer-tasks">
<h5>Kundenaufgaben (35 Personentage):</h5>
<ul>
<li><strong>Workflow Engine:</strong> 5 Tage (Geschäftsprozesse, Automatisierungsregeln)</li>
<li><strong>Stakeholder-Agent:</strong> 5 Tage (Stakeholder-Kriterien, Kontaktstrategien)</li>
<li><strong>Power BI Integration:</strong> 5 Tage (Reporting-Anforderungen, Dashboard-Design)</li>
<li><strong>Teams Integration:</strong> 5 Tage (Teams-Konfiguration, Workflow-Integration)</li>
<li><strong>End-to-End Testing:</strong> 15 Tage (Vollständige Systemtests, Go-Live Tests)</li>
</ul>
<h5>Übertragbare Aufgaben (an ValueOn):</h5>
<ul>
<li>Zusätzliche Testing-Unterstützung (10-15 Tage)</li>
<li>Go-Live Support (10 Tage)</li>
<li>Erweiterte Dokumentation (10 Tage)</li>
</ul>
</div>
</div>
<div class="card">
<h4>Phase 4: Skalierung (Monate 10-12)</h4>
<div class="customer-tasks">
<h5>Kundenaufgaben (40 Personentage):</h5>
<ul>
<li><strong>Performance Optimierung:</strong> 5 Tage (Performance-Anforderungen, Skalierungskriterien)</li>
<li><strong>Predictive Analytics:</strong> 5 Tage (Analytics-Anforderungen, Vorhersagemodelle)</li>
<li><strong>Regionale Skalierung:</strong> 15 Tage (Regionale Expansion, Marktanalyse)</li>
<li><strong>KI-Optimierung:</strong> 5 Tage (KI-Modell-Feedback, Optimierungskriterien)</li>
<li><strong>Dokumentation & Training:</strong> 10 Tage (Team-Training, Dokumentations-Review)</li>
</ul>
<h5>Übertragbare Aufgaben (an ValueOn):</h5>
<ul>
<li>Zusätzliche Skalierungsplanung (10-15 Tage)</li>
<li>Erweiterte Dokumentation (10 Tage)</li>
<li>Team-Training (10 Tage)</li>
</ul>
</div>
</div>
</div>
<div class="card">
<h4>Flexibilität bei der Aufgabenteilung</h4>
<p><strong>Option 1:</strong> Energie360° übernimmt alle Kundenaufgaben gemäß der Aufwandsschätzung</p>
<p><strong>Option 2:</strong> Energie360° überträgt zusätzliche Aufgaben an ValueOn (erhöht die ValueOn-Kosten entsprechend)</p>
<p><strong>Option 3:</strong> Gemischter Ansatz je nach Phase und Verfügbarkeit</p>
<p><em>Die konkrete Aufgabenteilung wird in einem separaten Workshop definiert und kann je nach Projektfortschritt angepasst werden.</em></p>
</div>
<h3>Gesamtübersicht & Zahlungsmodalitäten</h3>
<div class="total-overview">
<div class="total-costs">
<h4>💰 Gesamtkosten ValueOn</h4>
<div class="cost-summary">
<div class="cost-row">
<span>Phase 1 (MVP):</span>
<span>CHF 70'350</span>
</div>
<div class="cost-row">
<span>Phase 2 (Erweiterung):</span>
<span>CHF 79'850</span>
</div>
<div class="cost-row">
<span>Phase 3 (Vollintegration):</span>
<span>CHF 84'150</span>
</div>
<div class="cost-row">
<span>Phase 4 (Skalierung):</span>
<span>CHF 88'900</span>
</div>
<div class="cost-row total-row">
<span><strong>Gesamt ValueOn:</strong></span>
<span><strong>CHF 323'250</strong></span>
</div>
</div>
</div>
<div class="payment-terms">
<h4>💳 Zahlungsmodalitäten</h4>
<ul>
<li><strong>Phase 1:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Phase 2:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Phase 3:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Phase 4:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Projektmanagement:</strong> Monatlich in Rechnung gestellt</li>
</ul>
</div>
<div class="additional-info">
<h4> Zusätzliche Informationen</h4>
<ul>
<li><strong>Gültigkeit:</strong> Diese Offerte ist 3 Monate gültig</li>
<li><strong>Start:</strong> Jede Phase kann unabhängig gestartet werden</li>
<li><strong>Dauer:</strong> Jede Phase dauert 2-3 Monate</li>
<li><strong>Team:</strong> Dediziertes ValueOn-Team für das gesamte Projekt</li>
<li><strong>Support:</strong> 3 Monate Support nach Abschluss jeder Phase inklusive</li>
</ul>
</div>
</div>
</div>
<div id="support" class="tab-content">
<h2>Unterstützungsbereiche</h2>
@ -1719,6 +1344,11 @@
<h4>Flexible Skalierung</h4>
<p>Bedarfsgerechte Ressourcen je Projektphase. Von strategischer Beratung bis hands-on Development.</p>
</div>
<div class="card">
<h4>Integration mit bestehenden Systemen</h4>
<p>Leveraging von Company GPT, Azure ML und Postgres-Datenbank. Modulare Lösung, die sich in bestehende Infrastruktur einfügt.</p>
</div>
</div>
<h3>Investitionsschätzung</h3>
@ -1740,6 +1370,16 @@
<div class="label">Monate ROI</div>
</div>
</div>
<div class="card">
<h4>Zeitrahmen & Budget</h4>
<ul>
<li><strong>Ziel:</strong> Fertigstellung 2025 (Budget 2026 bereits geplant)</li>
<li><strong>Pilot-Phase:</strong> 5 Verkäufer als Testgruppe</li>
<li><strong>Skalierung:</strong> Auf 30 Verkäufer nach erfolgreichem Pilot</li>
<li><strong>Modularer Ansatz:</strong> Jede Phase kann unabhängig bestellt werden</li>
</ul>
</div>
</div>
</div>

View file

@ -0,0 +1,778 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Offerte für Implementierungskonzept Energie 360°</title>
<link rel="stylesheet" href="../_src/styles.css">
</head>
<body>
<!-- Seite 1: Titelblatt -->
<div class="page page-1">
<div class="logo-section">
<img src="../_src/logo.png" alt="ValueOn Logo" class="logo">
</div>
<div class="main-content">
<div class="title-area">
<h1 class="main-title">Offerte für Energie 360°</h1>
<h2 class="subtitle">KI-Lead Management System</h2>
<div class="separator"></div>
</div>
<div class="document-details">
<p><strong>Ort, Datum:</strong> Zürich, 27.08.2025</p>
</div>
<div class="contact-info">
<div class="contact-bars">
<div class="grey-bar"></div>
<div class="golden-bar"></div>
</div>
<div class="contact-grid">
<div class="contact-left">
<p>ValueOn AG</p>
<p>Am Stadtrand 11</p>
<p>8600 Dübendorf</p>
</div>
<div class="contact-right">
<p>T +41 44 943 70 40</p>
<p>info@valueon.ch</p>
<p>www.valueon.ch</p>
</div>
</div>
</div>
</div>
</div>
<!-- Fließtext beginnt hier - keine manuellen Seitenumbrüche mehr -->
<div class="page page-content">
<div class="main-content">
<h1 class="content-heading heading-level-1">Offerte Übersicht</h1>
<div class="content-text">
Diese Offerte von ValueOn für Energie360° ist in 4 Phasen unterteilt, die jeweils unabhängig bestellt werden können.
</div>
<h2 class="content-heading heading-level-2">Struktur der Offerte</h2>
<div class="content-text">
Die Offerte strukturiert sich in drei Bereiche:
</div>
<ul class="content-list bullet-list">
<li><strong>Klärung der Anforderungen:</strong> Customer Journey, User Interface und Lösungsarchitektur</li>
<li><strong>Realisierung der Lösung:</strong> Verwendung von Standard-Komponenten der PowerON AI Plattform (Baukasten)</li>
<li><strong>Kundenspezifische Entwicklungen:</strong> Kundenspezifische Optimierungen, Integrationen, Dokumentation und Training</li>
</ul>
<h2 class="content-heading heading-level-2">Detaillierte Lösungsbeschreibung</h2>
<div class="content-text">
<strong>Implementierungskonzept für Energie360° - Geschäftsbereich Lösungen</strong>
</div>
<h3 class="content-heading heading-level-3">Customer Journey - Vollständiger Prozess</h3>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-marker">1</div>
<div class="timeline-content">
<h4>Lead Discovery & Sourcing</h4>
<div class="ai-human-split">
<div class="ai-section">
<h5>KI-Unterstützung (80%)</h5>
<ul>
<li>Automatisierte Überwachung aller Datenquellen</li>
<li>Früherkennung in SIA Phase 2-3</li>
<li>Intelligente Filterung nach Projektkriterien</li>
<li>Automatische Deduplizierung</li>
</ul>
</div>
<div class="human-section">
<h5>Menschliche Leistung (20%)</h5>
<ul>
<li>Überprüfung der KI-Ergebnisse</li>
<li>Manuelle Recherche bei speziellen Projekten</li>
<li>Qualitätskontrolle der automatisierten Daten</li>
</ul>
</div>
</div>
<p><strong>Output:</strong> Qualifizierte Lead-Liste mit erstem Scoring</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">2</div>
<div class="timeline-content">
<h4>Lead Enrichment & Research</h4>
<div class="ai-human-split">
<div class="ai-section">
<h5>KI-Unterstützung (70%)</h5>
<ul>
<li>Automatische Anreicherung mit Projektdetails</li>
<li>Fernwärme-Perimeter Mapping</li>
<li>Stakeholder-Identifikation aus öffentlichen Quellen</li>
<li>Technische Spezifikationen Extraktion</li>
</ul>
</div>
<div class="human-section">
<h5>Menschliche Leistung (30%)</h5>
<ul>
<li>Vertiefte Recherche bei komplexen Projekten</li>
<li>Netzwerk-basierte Kontaktaufnahme</li>
<li>Qualitätsbewertung der angereicherten Daten</li>
</ul>
</div>
</div>
<p><strong>Output:</strong> Vollständig angereicherte Lead-Daten</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">3</div>
<div class="timeline-content">
<h4>Lead Qualification & Scoring</h4>
<div class="ai-human-split">
<div class="ai-section">
<h5>KI-Unterstützung (85%)</h5>
<ul>
<li>Automatisches Scoring nach definierten Kriterien</li>
<li>Priorisierung basierend auf Projektgröße und Phase</li>
<li>Fernwärme-Potential Bewertung</li>
<li>Wettbewerbsanalyse und Marktpositionierung</li>
<li>Kontaktanreicherung der Leads mit Status «qualifiziert»</li>
</ul>
</div>
<div class="human-section">
<h5>Menschliche Leistung (15%)</h5>
<ul>
<li>Überprüfung der Scoring-Ergebnisse</li>
<li>Strategische Anpassung der Bewertungskriterien</li>
<li>Manuelle Priorisierung bei Grenzfällen</li>
</ul>
</div>
</div>
<p><strong>Output:</strong> Priorisierte Lead-Liste mit Scoring</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">4</div>
<div class="timeline-content">
<h4>Übergabe an Vertriebsteam</h4>
<div class="ai-human-split">
<div class="ai-section">
<h5>KI-Unterstützung (60%)</h5>
<ul>
<li>Automatische Zuweisung nach Regionen/Teams</li>
<li>Workload-Balancing zwischen Vertriebsmitarbeitern</li>
<li>Automatische Lead-Import in CRM-Systeme</li>
<li>Vorschlag für nächste Aktion des Vertriebsteams</li>
</ul>
</div>
<div class="human-section">
<h5>Menschliche Leistung (40%)</h5>
<ul>
<li>Überprüfung der automatischen Zuweisungen</li>
<li>Manuelle Anpassung bei speziellen Anforderungen</li>
<li>Qualitätskontrolle vor Vertriebsübergabe</li>
</ul>
</div>
</div>
<p><strong>Output:</strong> Lead-Liste mit Übergabedatum an CRM</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker">5</div>
<div class="timeline-content">
<h4>Sales Execution & Follow-up</h4>
<div class="ai-human-split">
<div class="ai-section">
<h5>KI-Unterstützung (40%)</h5>
<ul>
<li>Status-Synchronisation und Tracking</li>
<li>Automatisierte Reminder-Systeme</li>
<li>Optimierte Kommunikationsstrategien</li>
<li>Lead-Scoring Updates basierend auf Interaktionen</li>
<li>Automatische Wiedervorlage-Planung</li>
</ul>
</div>
<div class="human-section">
<h5>Menschliche Leistung (60%)</h5>
<ul>
<li>Persönliche Kontaktaufnahme mit Entscheidungsträgern</li>
<li>Vertriebsgespräche und Präsentationen</li>
<li>Strategische Verhandlungen</li>
<li>Beziehungsaufbau und -pflege</li>
</ul>
</div>
</div>
<p><strong>Output:</strong> Aktive verwaltete Lead-Liste in CRM System</p>
</div>
</div>
</div>
<h3 class="content-heading heading-level-3">Kernkomponenten des KI-Systems</h3>
<div class="grid">
<div class="card">
<h4>Scout-Agent (Lead Discovery)</h4>
<ul>
<li><strong>Automatisierte Überwachung:</strong> SIMAP, Baublatt, espazium, LinkedIn</li>
<li><strong>Früherkennung:</strong> SIA Phase 2-3 (3-6 Monate vor Wettbewerb)</li>
<li><strong>Intelligente Filterung:</strong> >50 WE oder >50'000 m² Projektgröße</li>
<li><strong>Deduplizierung:</strong> Automatische Erkennung von Doubletten</li>
<li><strong>Update-Frequenz:</strong> Alle 3 Stunden</li>
</ul>
</div>
<div class="card">
<h4>Enricher-Agent (Lead Enrichment)</h4>
<ul>
<li><strong>Projektdaten:</strong> Vollständige Anreicherung mit technischen Details</li>
<li><strong>Stakeholder-Identifikation:</strong> Entscheidungsträger und Kontaktdaten</li>
<li><strong>Fernwärme-Check:</strong> Automatische Perimeter-Analyse</li>
<li><strong>Update-Frequenz:</strong> Alle 3 Stunden</li>
</ul>
</div>
<div class="card">
<h4>Scorer-Agent (Lead Qualification)</h4>
<ul>
<li><strong>Automatisches Scoring:</strong> Nach definierten Kriterien (SIA Phase, Budget, Region)</li>
<li><strong>Priorisierung:</strong> Ranking basierend auf Projektchancen</li>
<li><strong>Fernwärme-Potential:</strong> Bewertung der Anschlussmöglichkeiten</li>
<li><strong>Wettbewerbsanalyse:</strong> Marktpositionierung und Chancen</li>
<li><strong>Update-Frequenz:</strong> Alle 3 Stunden</li>
</ul>
</div>
<div class="card">
<h4>Stakeholder-Agent (Kontaktmanagement)</h4>
<ul>
<li><strong>Entscheidungsträger:</strong> Identifikation der relevanten Kontakte</li>
<li><strong>Kontaktdaten:</strong> E-Mail, Telefon, LinkedIn-Profile</li>
<li><strong>Kontaktdatenanreicherung:</strong> Status "qualifiziert" für Leads</li>
<li><strong>Organisationsstruktur:</strong> Hierarchie und Verantwortlichkeiten</li>
<li><strong>Netzwerk-Analyse:</strong> Beziehungen zwischen Stakeholdern</li>
<li><strong>Update-Frequenz:</strong> Kontinuierlich</li>
</ul>
</div>
</div>
<h3 class="content-heading heading-level-3">Nutzen für Vertriebsprozess durch KI-Automatisierung</h3>
<div class="grid">
<div class="card">
<h4>Daten Research, Anreicherung und Erstqualifikation</h4>
<ul>
<li><strong>Zeitersparnis:</strong> Von Stunden auf Minuten reduziert</li>
<li><strong>Häufigkeit:</strong> Laufende Aktualisierung mehrmals am Tag, jeden Tag</li>
<li><strong>Verbesserte Qualität:</strong> Strukturierte, vollständige Datensätze</li>
<li><strong>Timing:</strong> Kontaktaufnahme in optimaler Projektphase</li>
</ul>
</div>
<div class="card">
<h4>Ansatz und Tracking</h4>
<ul>
<li><strong>Ansatz:</strong> Datengestützte Ansprache mit relevanten Lösungen</li>
<li><strong>Tracking:</strong> Lückenlose Dokumentation im CRM</li>
<li><strong>Priorisierung:</strong> Fokus auf qualifizierte Leads</li>
<li><strong>Skalierbarkeit:</strong> 5x mehr Leads ohne Personalaufbau</li>
</ul>
</div>
</div>
<h3 class="content-heading heading-level-3">User Interfaces & Touchpoints</h3>
<div class="grid">
<div class="card">
<h4>Dashboard - Zentrale Übersicht</h4>
<ul>
<li><strong>Lead-Pipeline Visualisierung</strong> mit Status-Tracking</li>
<li><strong>Filterbare Projektliste</strong> mit Scoring und Priorisierung</li>
<li><strong>Kartenansicht</strong> für geografische Verteilung</li>
<li><strong>Quick Actions</strong> für Statusänderungen</li>
<li><strong>Integration:</strong> Single Sign-On mit Energie360° Systemen</li>
</ul>
</div>
<div class="card">
<h4>Conversational Interface - KI-Assistent</h4>
<ul>
<li><strong>Chat-Interface</strong> in Dashboard oder MS Teams</li>
<li><strong>Natursprachliche Abfragen:</strong> "Zeige mir alle Projekte >100 WE in Phase 3"</li>
<li><strong>Intelligente Antworten:</strong> Basierend auf aktuellen Daten</li>
<li><strong>Report-Generierung:</strong> Automatische Erstellung von Berichten</li>
</ul>
</div>
<div class="card">
<h4>User Interface für Listen und Listeneinträge</h4>
<ul>
<li><strong>Bearbeitbare Listen:</strong> Anzeige und Bearbeitung von Lead-Einträgen</li>
<li><strong>Inline-Editing:</strong> Direkte Bearbeitung von Lead-Informationen</li>
<li><strong>Bulk-Operationen:</strong> Mehrere Leads gleichzeitig bearbeiten</li>
<li><strong>Suchfunktionen:</strong> Erweiterte Filter und Sortierung</li>
</ul>
</div>
<div class="card">
<h4>CRM Integration</h4>
<ul>
<li><strong>Automatischer Lead-Import</strong> mit vollständigen Metadaten</li>
<li><strong>Bidirektionale Synchronisation</strong> zwischen Systemen</li>
<li><strong>Status-Tracking</strong> und Aktivitäten-Monitoring</li>
<li><strong>Unterstützte Systeme:</strong> HubSpot, Salesforce, Microsoft Dynamics</li>
</ul>
</div>
</div>
<h3 class="content-heading heading-level-3">Technische Integration & Compliance</h3>
<div class="grid">
<div class="card">
<h4>Bestehende Systeme</h4>
<ul>
<li><strong>Company GPT:</strong> Integration für Dokumentenanalyse</li>
<li><strong>Azure ML:</strong> Machine Learning Services</li>
<li><strong>Postgres-Datenbank:</strong> Bestehende Dateninfrastruktur</li>
<li><strong>PowerOn Platform:</strong> Workflow-Engine mit KI-Services</li>
</ul>
</div>
<div class="card">
<h4>Compliance & Datenschutz</h4>
<ul>
<li><strong>DSGVO-konform:</strong> Anonymisierung und Datenschutz</li>
<li><strong>LinkedIn-Nutzungsbedingungen:</strong> API-Limits und Compliance</li>
<li><strong>Datenquellen:</strong> Baublatt, SIMAP, espazium, LinkedIn</li>
<li><strong>Modularität:</strong> Lego-ähnlicher Aufbau für flexible Anpassungen</li>
</ul>
</div>
</div>
<h3 class="content-heading heading-level-3">Organisatorische Verantwortlichkeiten</h3>
<div class="grid">
<div class="card">
<h4>Marketing Team (Lead Generation)</h4>
<ul>
<li>Überwachung der KI-Discovery</li>
<li>Qualitätskontrolle der generierten Leads</li>
<li>Optimierung der Scoring-Kriterien</li>
<li>Reporting und Performance-Monitoring</li>
</ul>
</div>
<div class="card">
<h4>Sales Development (Lead Qualification)</h4>
<ul>
<li>Manuelle Überprüfung der KI-Bewertungen</li>
<li>Vertiefte Recherche bei komplexen Projekten</li>
<li>Strategische Bewertung der Projektchancen</li>
<li>Übergabe an Account Manager</li>
</ul>
</div>
<div class="card">
<h4>Account Manager (Sales Execution)</h4>
<ul>
<li>Persönliche Kontaktaufnahme</li>
<li>Vertriebsgespräche und Präsentationen</li>
<li>Vertragsabschluss und -verhandlung</li>
<li>Kundenbeziehungspflege</li>
</ul>
</div>
<div class="card">
<h4>IT/Data Team (System Support)</h4>
<ul>
<li>KI-System Wartung und Optimierung</li>
<li>CRM-Integration und -Support</li>
<li>Datenqualitäts-Monitoring</li>
<li>Performance-Optimierung</li>
</ul>
</div>
</div>
<h3 class="content-heading heading-level-3">Kundenseitige Mitwirkung (FTE)</h3>
<div class="grid">
<div class="card">
<h4>Während der Entwicklung</h4>
<ul>
<li><strong>Product Owner:</strong> 0.5 FTE für Anforderungsdefinition und Feedback</li>
<li><strong>Domain-Experten:</strong> 0.3 FTE für fachliche Beratung</li>
<li><strong>Vertriebsvertreter:</strong> 0.2 FTE für Prozessvalidierung</li>
<li><strong>Gesamt:</strong> 1.0 FTE auf Kundenseite</li>
</ul>
</div>
<div class="card">
<h4>Laufender Betrieb</h4>
<ul>
<li><strong>1st Level Support:</strong> 0.5 FTE</li>
<li><strong>Prozessverantwortlicher:</strong> 0.2 FTE für kontinuierliche Optimierung</li>
<li><strong>Gesamt:</strong> 0.7 FTE</li>
<li><strong>ValueOn:</strong>
<ul>
<li>Service und Support zusammen zu definieren</li>
<li>Lizenzkosten: Base Fee CHF 1'500 / Monate für Nutzung PowerOn Plattform</li>
</ul>
</li>
</ul>
</div>
</div>
<h2 class="content-heading heading-level-2">Projektphasen</h2>
<h3 class="content-heading heading-level-3">Phase 1: MVP (2-3 Monate)</h3>
<div class="phase-section">
<div class="phase-card">
<div class="phase-header">
<div class="phase-name">Phase 1: MVP - Funktionsfähiges System</div>
<div class="phase-cost">
<div class="cost-amount">CHF 33'000</div>
<div class="cost-label">Kosten ohne Darstellung der Aufwendungen</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Lead Discovery Setup:</strong> Scout-Agent für Baublatt + 2-3 weitere Quellen</li>
<li><strong>Enrichment:</strong> Anreicherung um erste Projektdaten</li>
<li><strong>Basis Scoring Algorithmus:</strong> Einfacher Scoring (SIA Phase, Budget, Region)</li>
<li><strong>Kontaktdatenanreicherung:</strong> Anreicherung der Leads mit Status «qualifiziert»</li>
<li><strong>Dashboard Grundfunktionen:</strong> Grundlegende Features für Sales Team</li>
<li><strong>HubSpot CRM Integration:</strong> Basis-Integration für Lead-Export</li>
<li><strong>Testing & Validation:</strong> Testen mit 50-100 realen Leads</li>
<li><strong>Projektmanagement:</strong> Koordination und Kommunikation</li>
<li><strong>Dokumentation:</strong> Benutzerdokumentation erstellen</li>
</ul>
<p><strong>Deliverable:</strong> Funktionsfähiges MVP-System mit 50-100 Leads/Monat</p>
</div>
</div>
</div>
<h3 class="content-heading heading-level-3">Phase 2: Erweiterung (Monate 4-6)</h3>
<div class="phase-section">
<div class="phase-card">
<div class="phase-header">
<div class="phase-name">Phase 2: Erweiterung - Vollständiges System</div>
<div class="phase-cost">
<div class="cost-amount">CHF 28'500</div>
<div class="cost-label">Kosten ohne Darstellung der Aufwendungen</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Lead Discovery:</strong> Erweiterte Quellen wie LinkedIn, Baublatt Premium, SIA</li>
<li><strong>Enrichment:</strong> Anreicherung um alle Projektdaten</li>
<li><strong>Scoring Optimierung:</strong> ML-basierte Scoring-Modelle</li>
<li><strong>Dashboard Analytics:</strong> Erweiterte Analytics & Reports</li>
<li><strong>Kontaktdatenanreicherung:</strong> Verbesserung der Anreicherung der Leads mit Status «qualifiziert»</li>
<li><strong>Performance Testing:</strong> Testen mit 100-200 Leads/Monat</li>
<li><strong>Projektmanagement:</strong> Koordination und Kommunikation</li>
<li><strong>Dokumentation:</strong> Benutzerdokumentation anpassen</li>
</ul>
<p><strong>Deliverable:</strong> Vollständiges System mit erweiterten Quellen</p>
</div>
</div>
</div>
<h3 class="content-heading heading-level-3">Phase 3: Vollintegration (Monate 7-9)</h3>
<div class="phase-section">
<div class="phase-card">
<div class="phase-header">
<div class="phase-name">Phase 3: Vollintegration - Produktionsreife Lösung</div>
<div class="phase-cost">
<div class="cost-amount">CHF 50'500</div>
<div class="cost-label">Kosten ohne Darstellung der Aufwendungen</div>
</div>
</div>
<div class="phase-details">
<h5>Inkludierte Leistungen:</h5>
<ul>
<li><strong>Workflow Engine:</strong> Vollständige Automatisierung der Workflows</li>
<li><strong>Stakeholder-Agent:</strong> Vollständige Integration</li>
<li><strong>Power BI Integration:</strong> Erweiterte Reports & Analytics</li>
<li><strong>Teams Integration:</strong> Vollständige Microsoft Teams Integration</li>
<li><strong>End-to-End Testing:</strong> Testen der vollständigen Integration</li>
<li><strong>Projektmanagement:</strong> Koordination und Kommunikation</li>
<li><strong>Dokumentation:</strong> Benutzerdokumentation anpassen</li>
</ul>
<p><strong>Deliverable:</strong> Integrierte Lösung im Produktivbetrieb</p>
</div>
</div>
</div>
<h3 class="content-heading heading-level-3">Phase 4: Skalierung (Monate 10-12)</h3>
<div class="phase-section">
<div class="phase-card">
<div class="phase-header">
<div class="phase-name">Phase 4: Skalierung - Expansion & Optimierung</div>
<div class="phase-cost">
<div class="cost-amount">Nach Ermessen</div>
<div class="cost-label">Basierend auf Erfahrungen</div>
</div>
</div>
<div class="phase-details">
<h5>Mögliche Themen:</h5>
<ul>
<li><strong>Auflistung:</strong> Neue Anforderungen und Optimierungen</li>
<li><strong>Zusammenarbeit:</strong> Umsetzung von Anforderungen in monatliche Sprints</li>
<li><strong>Qualifizierung:</strong> Anforderungen werden jeweils qualifiziert und offeriert</li>
<li><strong>Performance Optimierung:</strong> Optimierung für größere Volumen</li>
<li><strong>Predictive Analytics:</strong> Erweiterte Vorhersagemodelle</li>
<li><strong>Regionale Skalierung:</strong> Vorbereitung für Expansion</li>
<li><strong>KI-Optimierung:</strong> Kontinuierliche Verbesserung der KI-Modelle</li>
</ul>
<p><strong>Deliverable:</strong> Skalierbare Lösung für Expansion</p>
</div>
</div>
</div>
<h1 class="content-heading heading-level-1">Gesamtübersicht & Zahlungsmodalitäten</h1>
<div class="total-section">
<div class="total-grid">
<div class="total-card">
<h4>Gesamtkosten Realisierung der Lösung</h4>
<div class="cost-summary">
<div class="cost-row">
<span>Phase 1 (MVP):</span>
<span>CHF 33'000</span>
</div>
<div class="cost-row">
<span>Phase 2 (Erweiterung):</span>
<span>CHF 28'500</span>
</div>
<div class="cost-row">
<span>Phase 3 (Vollintegration):</span>
<span>CHF 50'500</span>
</div>
<div class="cost-row">
<span>Phase 4 (Skalierung):</span>
<span>Nach Ermessen</span>
</div>
<div class="cost-row total-row">
<span><strong>Gesamt Realisierung:</strong></span>
<span><strong>CHF 112'000</strong></span>
</div>
</div>
</div>
<div class="total-card">
<h4>Zahlungsmodalitäten</h4>
<ul class="content-list bullet-list">
<li><strong>Phase 1:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Phase 2:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Phase 3:</strong> 50% bei Auftrag, 50% bei Abnahme</li>
<li><strong>Phase 4:</strong> Nach Freigabe der Kosten</li>
<li><strong>Projektmanagement:</strong> Ist integraler Bestandteil</li>
</ul>
</div>
<div class="total-card">
<h4>Zusätzliche Informationen</h4>
<ul class="content-list bullet-list">
<li><strong>Gültigkeit:</strong> Diese Offerte ist 10 Tage gültig</li>
<li><strong>Start:</strong> Jede Phase kann unabhängig gestartet werden</li>
<li><strong>Dauer:</strong> Jede Phase dauert 2-3 Monate</li>
<li><strong>Team:</strong> Dediziertes ValueOn-Team für das gesamte Projekt</li>
</ul>
</div>
</div>
</div>
<h1 class="content-heading heading-level-1">Zusammenarbeitsmodell</h1>
<div class="content-text">
Das Projekt wird in 4-Wochen Sprints mit klaren Deliverables umgesetzt. Enge Zusammenarbeit mit dem Product Owner von Energie360° und regelmässige Investitionsschätzung sind integraler Bestandteil.
</div>
<h1 class="content-heading heading-level-1">Investitionsschätzung</h1>
<div class="content-text">
<strong>Zeitrahmen:</strong> 16-20 Wochen bis Go-Live, 41 Wochen bis zur vollständigen Integration. Ziel: Produktiver Einsatz bis Ende Jahr, Vollintegration bis Mai 2026.
</div>
<div class="content-text">
<strong>Ressourcen:</strong> 3-4 FTE während Entwicklung, 0.5 FTE laufender Betrieb. ROI: 6-9 Monate.
</div>
<div class="content-text">
<strong>Tagessätze ValueOn (exkl. MWSt):</strong> ValueOn Experte: CHF 2'150.- pro Tag, ValueOn PowerOn Development Team: CHF 950.- pro Tag.
</div>
<h1 class="content-heading heading-level-1">Kontaktdaten</h1>
<div class="contact-section">
<div class="contact-grid">
<div class="contact-card">
<h4>Vertrags- und Rechnungsadresse</h4>
<div class="contact-details">
<div class="contact-row">
<span><strong>Kunde:</strong></span>
<span>Energie360°</span>
</div>
<div class="contact-row">
<span><strong>Adresse:</strong></span>
<span>Aargauerstrasse 182 · Postfach 805 · 8010 Zürich</span>
</div>
<div class="contact-row">
<span><strong>Kontaktperson:</strong></span>
<span>Clemens Högger</span>
</div>
<div class="contact-row">
<span><strong>E-Mail:</strong></span>
<span>clemens.hoegger@energie360.ch</span>
</div>
</div>
<p style="margin-top: 15px; font-size: 12px; color: #666;"><em>Die Rechnungsstellung erfolgt per eMail</em></p>
</div>
<div class="contact-card">
<h4>Kontaktpersonen ValueOn</h4>
<div class="contact-details">
<div class="contact-row">
<span><strong>Projektleitung:</strong></span>
<span>Dominic Largo</span>
</div>
<div class="contact-row">
<span><strong>E-Mail:</strong></span>
<span>d.largo@valueon.ch</span>
</div>
<div class="contact-row">
<span><strong>Technische Leitung:</strong></span>
<span>Andreas Friedli</span>
</div>
<div class="contact-row">
<span><strong>E-Mail:</strong></span>
<span>a.friedli@valueon.ch</span>
</div>
</div>
</div>
</div>
</div>
<h1 class="content-heading heading-level-1">Rahmenbedingungen & Konditionen</h1>
<div class="terms-section">
<div class="terms-card">
<h4>Auftragsdauer</h4>
<ul class="terms-list">
<li>Der Auftrag startet am <strong>01.09.2025</strong> und endet am <strong>31.05.2026</strong>.</li>
<li>Eine eventuelle Auftragsverlängerung erfolgt durch eine schriftliche Vereinbarung zwischen den beiden Parteien mit Bezug auf dieses Dienstleistungsangebot.</li>
<li>Bei Auftragsende wird ein Interview mit dem Kunden durchgeführt und ein Referenz Statement abgeholt.</li>
</ul>
</div>
<div class="terms-card">
<h4>Rahmenbedingungen</h4>
<ul class="terms-list">
<li>Der Auftraggeber stellt sicher, dass der Berater von ValueOn die nötige Positionierung und die Kompetenz erhält, in der Organisation und in dessen Umfeld zu wirken.</li>
<li>Der Auftraggeber stellt den Kontakt zu Entscheidungsträger und andere Organisationseinheiten sicher.</li>
<li>Die Weitergabe einzelner Aufgaben an fachkundige Dritte bedarf der Zustimmung des Kunden.</li>
<li>ValueOn kann nicht verantwortlich gemacht werden für Verzögerungen ausgelöst durch höhere Gewalt oder Widerstände in der Organisation des Auftraggebers.</li>
<li>Die Leistungserbringung geschieht teilweise in den Räumen des Auftraggebers und teilweise ausgelagert.</li>
</ul>
</div>
<div class="terms-card">
<h4>Messung der Zielerreichung</h4>
<ul class="terms-list">
<li>Im Anschluss an das Mandat wird die Zielerreichung durch ein Customer Survey überprüft.</li>
</ul>
</div>
<div class="terms-card">
<h4>Verrechnung</h4>
<ul class="terms-list" style="text-align: left;">
<li>Für die Beratungs-Leistungen wird ein Pauschalpreis verrechnet, wie oben in der Offerte beschrieben.</li>
</ul>
</div>
<div class="terms-card">
<h4>Spesen und Nebenkosten</h4>
<ul class="terms-list">
<li>Für die Arbeitserbringung in der Schweiz werden keine Spesen erhoben.</li>
<li>Für die Arbeitserbringung im Ausland werden die effektiven Kosten verrechnet.</li>
</ul>
</div>
<div class="terms-card">
<h4>Konditionen</h4>
<ul class="terms-list">
<li>Es gelten die beiliegenden Allgemeinen Geschäftsbedingungen (AGB) von ValueOn.</li>
<li>Zahlung <strong>10 Tage</strong> nach Rechnungsstellung.</li>
<li>Die Gültigkeit der Offerte beträgt <strong>10 Tage</strong> ab Ausstellungsdatum.</li>
</ul>
</div>
</div>
<div class="signature-section">
<h1 class="content-heading heading-level-1">Unterschriften</h1>
<div class="signature-grid">
<div class="signature-card">
<h4>Kunde</h4>
<div class="signature-area">Unterschrift</div>
<div class="signature-details">
<div class="signature-row">
<span><strong>Ort, Datum:</strong></span>
<span>_________________</span>
</div>
<div class="signature-row">
<span><strong>Name:</strong></span>
<span>_________________</span>
</div>
<div class="signature-row">
<span><strong>Titel:</strong></span>
<span>_________________</span>
</div>
</div>
</div>
<div class="signature-card">
<h4>ValueOn</h4>
<div class="signature-area">Unterschrift</div>
<div class="signature-details">
<div class="signature-row">
<span><strong>Ort, Datum:</strong></span>
<span>_________________</span>
</div>
<div class="signature-row">
<span><strong>Name:</strong></span>
<span>_________________</span>
</div>
<div class="signature-row">
<span><strong>Titel:</strong></span>
<span>_________________</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="../_src/numbering.js"></script>
</body>
</html>

Binary file not shown.

View file

@ -0,0 +1,853 @@
#!/usr/bin/env python3
"""
Complete PDF Generation Script
1. Opens HTML in headless browser
2. Waits for JavaScript to complete (TOC + footer)
3. Extracts complete HTML with TOC and footer
4. Generates PDF from final HTML
Usage:
python generate_complete_pdf.py # Auto-cleanup temp files
python generate_complete_pdf.py --keep-temp # Keep temp files for debugging
"""
import os
import sys
import time
import subprocess
import platform
import json
from pathlib import Path
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
def find_chrome_executable():
"""Find Chrome executable based on platform"""
if platform.system() == "Windows":
possible_paths = [
r"C:\Program Files\Google\Chrome\Application\chrome.exe",
r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
r"C:\Users\{}\AppData\Local\Google\Chrome\Application\chrome.exe".format(os.getenv('USERNAME')),
]
elif platform.system() == "Darwin": # macOS
possible_paths = [
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
]
else: # Linux
possible_paths = [
"/usr/bin/google-chrome",
"/usr/bin/chromium-browser",
"/usr/bin/chromium",
]
for path in possible_paths:
if os.path.exists(path):
return path
# Try to find in PATH
try:
result = subprocess.run(['which', 'google-chrome'], capture_output=True, text=True)
if result.returncode == 0:
return result.stdout.strip()
except:
pass
return None
def setup_chrome_options():
"""Setup Chrome options for headless operation"""
chrome_options = Options()
chrome_options.add_argument("--headless=new") # Use new headless mode
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-web-security")
chrome_options.add_argument("--allow-running-insecure-content")
chrome_options.add_argument("--disable-features=VizDisplayCompositor")
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
return chrome_options
def wait_for_toc_completion(driver, timeout=30):
"""Wait for TOC generation to complete"""
print("⏳ Waiting for TOC generation to complete...")
try:
# Wait for TOC title to appear (not "Lade Inhaltsverzeichnis...")
WebDriverWait(driver, timeout).until(
lambda d: d.find_element(By.CLASS_NAME, "toc-title").text == "Inhaltsverzeichnis"
)
# Wait for TOC entries to appear
WebDriverWait(driver, timeout).until(
lambda d: len(d.find_elements(By.CLASS_NAME, "toc-entry")) > 0
)
# Wait a bit more for all entries to load
time.sleep(2)
print("✅ TOC generation completed!")
return True
except TimeoutException:
print("❌ Timeout waiting for TOC generation")
return False
except Exception as e:
print(f"⚠️ Error during TOC wait: {e}")
return False
def check_driver_health(driver):
"""Check if Chrome driver is still healthy and responsive"""
try:
# Try to get current URL to check if driver is responsive
current_url = driver.current_url
return True
except Exception as e:
print(f"⚠️ Driver health check failed: {e}")
return False
def wait_for_page_counter_completion(driver, timeout=30):
"""Wait for page counter to complete and update footer"""
print("⏳ Waiting for page counter to complete...")
try:
# Wait for footer to show actual page count (not CSS variable)
WebDriverWait(driver, timeout).until(
lambda d: "var(--total-pages" not in d.page_source
)
# Wait a bit more for footer to stabilize
time.sleep(2)
print("✅ Page counter completed!")
return True
except TimeoutException:
print("❌ Timeout waiting for page counter")
return False
def analyze_pdf_page_numbers(pdf_path):
"""Analyze PDF to extract real page numbers for sections"""
print(f"📊 Analyzing PDF: {pdf_path}")
try:
# Use PyMuPDF to analyze the PDF
import fitz # PyMuPDF
doc = fitz.open(pdf_path)
total_pages = len(doc)
print(f"📄 Total pages in PDF: {total_pages}")
# Define the sections to look for (both with and without numbering)
sections = [
# Main sections (level 1)
"Offerte Übersicht",
"Gesamtübersicht & Zahlungsmodalitäten",
"Zusammenarbeitsmodell",
"Investitionsschätzung",
"Kontaktdaten",
"Rahmenbedingungen & Konditionen",
"Unterschriften",
# Sub-sections (level 2)
"Struktur der Offerte",
"Detaillierte Lösungsbeschreibung",
"Projektphasen",
# Sub-sub-sections (level 3)
"Kernkomponenten des KI-Systems",
"Customer Journey - Vollständiger Prozess",
"Nutzen für Vertriebsprozess durch KI-Automatisierung",
"User Interfaces & Touchpoints",
"Technische Integration & Compliance",
"Organisatorische Verantwortlichkeiten",
"Kundenseitige Mitwirkung (FTE)",
"Phase 1: MVP (2-3 Monate)",
"Phase 2: Erweiterung (Monate 4-6)",
"Phase 3: Vollintegration (Monate 7-9)",
"Phase 4: Skalierung (Monate 10-12)"
]
page_numbers = {}
# Search for each section in the PDF with flexible matching
for section in sections:
found = False
for page_num in range(total_pages):
page = doc[page_num]
text = page.get_text()
# Try exact match first
if section in text:
page_numbers[section] = page_num + 1
print(f"📍 '{section}' found on page {page_num + 1}")
found = True
break
# Try partial match (for longer section names)
if len(section) > 10: # Only for longer sections
words = section.split()
if len(words) >= 3: # Only for sections with 3+ words
# Check if at least 2 key words are present
key_words = [word for word in words if len(word) > 3] # Skip short words
if len(key_words) >= 2:
matches = sum(1 for word in key_words if word in text)
if matches >= 2:
page_numbers[section] = page_num + 1
print(f"📍 '{section}' (partial match) found on page {page_num + 1}")
found = True
break
if not found:
print(f"⚠️ Section '{section}' not found in any page")
# Assign to page 1 as fallback
page_numbers[section] = 1
doc.close()
# Save page numbers to JSON
output_data = {
"total_pages": total_pages,
"page_numbers": page_numbers
}
json_path = Path("_tmp/page_numbers_updated.json")
json_path.parent.mkdir(parents=True, exist_ok=True)
with open(json_path, "w", encoding="utf-8") as f:
json.dump(output_data, f, indent=2, ensure_ascii=False)
print(f"✅ Page numbers saved to: {json_path}")
return output_data
except ImportError:
print("❌ PyMuPDF not available, using fallback method...")
return fallback_pdf_analysis(pdf_path)
except Exception as e:
print(f"❌ PDF analysis error: {e}")
return None
def fallback_pdf_analysis(pdf_path):
"""Fallback PDF analysis using Chrome headless"""
print("🔄 Using Chrome headless for PDF analysis...")
try:
# Use Chrome to extract text from PDF
chrome_path = find_chrome_executable()
if not chrome_path:
return None
# Convert PDF to HTML for analysis
html_path = pdf_path.replace(".pdf", "_text.html")
cmd = [
chrome_path,
"--headless",
"--no-sandbox",
"--disable-dev-shm-usage",
"--print-to-pdf-no-header",
f"file://{os.path.abspath(pdf_path)}"
]
# This is a simplified fallback - in practice, you'd want more sophisticated text extraction
print("⚠️ Fallback analysis limited - consider installing PyMuPDF")
return {"total_pages": 22, "page_numbers": {}} # Default values
except Exception as e:
print(f"❌ Fallback analysis failed: {e}")
return None
def wait_for_footer_update(driver, timeout=10):
"""Wait for footer to be updated with correct page count"""
print("⏳ Waiting for footer update...")
try:
# Check if footer shows correct page count (not "var(--total-pages, 16)")
WebDriverWait(driver, timeout).until(
lambda d: "var(--total-pages" not in d.page_source
)
print("✅ Footer updated!")
return True
except TimeoutException:
print("⚠️ Footer update timeout - continuing anyway")
return True
def extract_complete_html(driver, output_filename=None, tmp_dir=None):
"""Extract the complete HTML after JavaScript processing"""
if output_filename is None:
output_filename = "energie360-offerte-complete.html"
# Ensure tmp_dir exists
if tmp_dir:
tmp_dir.mkdir(parents=True, exist_ok=True)
output_path = tmp_dir / output_filename
else:
output_path = Path(output_filename)
print(f"📄 Extracting complete HTML to: {output_path}")
# Get the complete HTML
complete_html = driver.page_source
# Save the complete HTML for inspection
with open(output_path, "w", encoding="utf-8") as f:
f.write(complete_html)
print(f"✅ Complete HTML saved to: {output_path}")
return complete_html
def clean_and_number_headings_professionally(driver):
"""Clean existing numbering and add professional outline numbering to headings"""
print("🔧 Cleaning and adding professional outline numbering to headings...")
try:
js_code = """
(function() {
console.log('🔧 Cleaning and adding professional outline numbering...');
// Function to clean and add professional outline numbering
function cleanAndNumberHeadings() {
let level1Count = 0;
let level2Count = 0;
let level3Count = 0;
const headings = document.querySelectorAll('h1.content-heading, h2.content-heading, h3.content-heading');
headings.forEach(heading => {
const level = parseInt(heading.className.match(/heading-level-(\\d+)/)?.[1] || '1');
// Get the original text and clean it completely
let originalText = heading.textContent.trim();
// Remove ALL existing numbering patterns (1, 1.1, 1.1.1, etc.)
originalText = originalText.replace(/^\\d+(\\.\\d+)*\\s*/, '');
// Store the clean original text
heading.setAttribute('data-original-text', originalText);
// Add appropriate professional numbering
let numberedText = '';
if (level === 1) {
level1Count++;
level2Count = 0;
level3Count = 0;
numberedText = level1Count + ' ' + originalText;
} else if (level === 2) {
level2Count++;
level3Count = 0;
numberedText = level1Count + '.' + level2Count + ' ' + originalText;
} else if (level === 3) {
level3Count++;
numberedText = level1Count + '.' + level2Count + '.' + level3Count + ' ' + originalText;
}
// Update heading text with clean numbering
heading.textContent = numberedText;
heading.setAttribute('data-numbered-text', numberedText);
console.log(` Heading ${level}: "${originalText}" -> "${numberedText}"`);
});
console.log('✅ Professional outline numbering completed');
return true;
}
return cleanAndNumberHeadings();
})();
"""
# Execute the JavaScript
result = driver.execute_script(js_code)
# Wait a bit for the JavaScript to complete
time.sleep(1)
print("✅ Professional outline numbering added successfully")
return True
except Exception as e:
print(f"❌ Error adding professional outline numbering: {e}")
return False
def create_professional_toc_with_real_page_numbers(driver, page_numbers):
"""Create a professional TOC with correct page numbers and proper alignment"""
print("🔧 Creating professional TOC with real page numbers...")
try:
# Create JavaScript to build a professional TOC
js_code = """
(function() {
console.log('🔧 Creating professional TOC with real page numbers...');
// Get the page numbers data
const pageNumbers = %s;
// Function to find the best matching section for a heading text
function findBestSectionMatch(headingText) {
const cleanHeading = headingText.replace(/^\\d+(\\.\\d+)*\\s*/, '').trim();
console.log(`🔍 Looking for match for: "${cleanHeading}"`);
console.log(`📋 Available sections:`, Object.keys(pageNumbers.page_numbers));
// Try exact match first
for (let [section, page] of Object.entries(pageNumbers.page_numbers)) {
if (cleanHeading === section) {
console.log(` Exact match: "${section}" -> page ${page}`);
return { section, page };
}
}
// Try partial match (more flexible)
for (let [section, page] of Object.entries(pageNumbers.page_numbers)) {
const cleanSection = section.replace(/^\\d+(\\.\\d+)*\\s*/, '').trim();
// Check if either contains the other
if (cleanHeading.includes(cleanSection) || cleanSection.includes(cleanHeading)) {
console.log(` Partial match: "${cleanSection}" -> page ${page}`);
return { section, page };
}
}
// Try word-based matching for longer headings
if (cleanHeading.length > 10) {
const headingWords = cleanHeading.split(' ').filter(word => word.length > 3);
for (let [section, page] of Object.entries(pageNumbers.page_numbers)) {
const cleanSection = section.replace(/^\\d+(\\.\\d+)*\\s*/, '').trim();
const sectionWords = cleanSection.split(' ').filter(word => word.length > 3);
// Count matching words
const matches = headingWords.filter(word =>
sectionWords.some(sword =>
word.toLowerCase() === sword.toLowerCase() ||
word.toLowerCase().includes(sword.toLowerCase()) ||
sword.toLowerCase().includes(word.toLowerCase())
)
);
if (matches.length >= 2) {
console.log(` Word-based match: "${cleanSection}" -> page ${page} (${matches.length} words)`);
return { section, page };
}
}
}
console.warn(` No match found for: "${cleanHeading}"`);
return null;
}
// Function to create professional TOC
function createProfessionalTOC() {
// Find the TOC container
const tocContainer = document.querySelector('.toc-auto');
if (!tocContainer) {
console.error('❌ TOC container not found');
return false;
}
// Clear existing TOC completely
tocContainer.innerHTML = '';
// Create professional TOC title
const title = document.createElement('h1');
title.className = 'toc-title';
title.textContent = 'Inhaltsverzeichnis';
title.style.textAlign = 'center';
title.style.marginBottom = '2rem';
title.style.fontSize = '1.5rem';
title.style.fontWeight = 'bold';
title.style.color = '#2c3e50';
tocContainer.appendChild(title);
// Get all numbered headings
const headings = document.querySelectorAll('h1.content-heading, h2.content-heading, h3.content-heading');
if (headings.length === 0) {
console.error('❌ No content headings found');
return false;
}
console.log(`📋 Found ${headings.length} headings to process`);
headings.forEach((heading, index) => {
const headingText = heading.textContent.trim();
const level = parseInt(heading.className.match(/heading-level-(\\d+)/)?.[1] || '1');
// Find page number for this heading
const match = findBestSectionMatch(headingText);
const pageNumber = match ? match.page : 1; // Default to page 1 if no match
// Create TOC entry with professional styling
const entry = document.createElement('div');
entry.className = 'toc-entry';
entry.classList.add(`toc-level-${level}`);
// Set professional styling
entry.style.display = 'flex';
entry.style.justifyContent = 'space-between';
entry.style.alignItems = 'center';
entry.style.marginBottom = '0.5rem';
entry.style.cursor = 'pointer';
entry.style.transition = 'background-color 0.2s';
// Add hover effect
entry.addEventListener('mouseenter', () => {
entry.style.backgroundColor = '#f8f9fa';
});
entry.addEventListener('mouseleave', () => {
entry.style.backgroundColor = 'transparent';
});
// Create text container
const textContainer = document.createElement('div');
textContainer.style.flex = '1';
textContainer.style.display = 'flex';
textContainer.style.alignItems = 'center';
// Add level-based indentation
const indent = (level - 1) * 1.5;
textContainer.style.marginLeft = indent + 'rem';
// Create text span
const textSpan = document.createElement('span');
textSpan.className = 'toc-text';
textSpan.textContent = headingText;
textSpan.style.fontSize = level === 1 ? '1.1rem' : level === 2 ? '1rem' : '0.9rem';
textSpan.style.fontWeight = level === 1 ? 'bold' : 'normal';
textSpan.style.color = level === 1 ? '#2c3e50' : level === 2 ? '#34495e' : '#7f8c8d';
textContainer.appendChild(textSpan);
// Create right-aligned page number
const pageSpan = document.createElement('span');
pageSpan.className = 'toc-page';
pageSpan.textContent = pageNumber;
pageSpan.style.fontWeight = 'bold';
pageSpan.style.color = '#e74c3c';
pageSpan.style.minWidth = '2rem';
pageSpan.style.textAlign = 'right';
// Create dots (leader)
const dotsSpan = document.createElement('span');
dotsSpan.className = 'toc-dots';
dotsSpan.textContent = '.'.repeat(20);
dotsSpan.style.flex = '1';
dotsSpan.style.margin = '0 0.5rem';
dotsSpan.style.color = '#bdc3c7';
dotsSpan.style.overflow = 'hidden';
dotsSpan.style.whiteSpace = 'nowrap';
// Assemble entry
entry.appendChild(textContainer);
entry.appendChild(dotsSpan);
entry.appendChild(pageSpan);
// Add click functionality
entry.addEventListener('click', () => {
heading.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
});
// Add to TOC
tocContainer.appendChild(entry);
console.log(` TOC entry ${index + 1}: "${headingText}" -> page ${pageNumber} (level ${level})`);
});
console.log('✅ Professional TOC created successfully');
return true;
}
// Execute the function
return createProfessionalTOC();
})();
""" % json.dumps(page_numbers)
# Execute the JavaScript
result = driver.execute_script(js_code)
# Wait a bit for the JavaScript to complete
time.sleep(2)
print("✅ Professional TOC created successfully")
return True
except Exception as e:
print(f"❌ Error creating professional TOC: {e}")
return False
def generate_pdf_from_complete_html(html_file_path, output_filename=None):
"""Generate PDF from the complete HTML file"""
if output_filename is None:
output_filename = "energie360-offerte-complete.pdf"
print(f"🔄 Generating PDF: {output_filename}")
chrome_path = find_chrome_executable()
if not chrome_path:
print("❌ Chrome not found!")
return False
try:
# Ensure output filename has absolute path
output_abs_path = os.path.abspath(output_filename)
html_abs_path = os.path.abspath(html_file_path)
print(f"📁 Output will be saved to: {output_abs_path}")
print(f"📄 HTML source: {html_abs_path}")
# Use Chrome to generate PDF from the complete HTML
cmd = [
chrome_path,
"--headless",
"--no-sandbox",
"--disable-dev-shm-usage",
f"--print-to-pdf={output_abs_path}",
"--print-to-pdf-no-header",
f"file://{html_abs_path}"
]
print(f"🔧 Running command: {' '.join(cmd)}")
result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
if result.returncode == 0:
# Check if file was actually created
if os.path.exists(output_abs_path):
print(f"✅ PDF generated successfully: {output_filename}")
print(f"📁 File location: {output_abs_path}")
return True
else:
print(f"⚠️ PDF generation reported success but file not found: {output_filename}")
print(f"🔍 Current working directory: {os.getcwd()}")
print(f"🔍 Expected file location: {output_abs_path}")
print(f"📋 Chrome stdout: {result.stdout}")
print(f"📋 Chrome stderr: {result.stderr}")
return False
else:
print(f"❌ PDF generation failed with return code: {result.returncode}")
print(f"📋 Chrome stdout: {result.stdout}")
print(f"📋 Chrome stderr: {result.stderr}")
return False
except subprocess.TimeoutExpired:
print("❌ PDF generation timeout")
return False
except Exception as e:
print(f"❌ PDF generation error: {e}")
return False
def cleanup_old_files(tmp_dir, final_pdf_path):
"""Clean up old files before starting the process"""
print("🧹 Cleaning up old files...")
# Remove existing final PDF if it exists
if final_pdf_path.exists():
print(f"🗑️ Removing existing final PDF: {final_pdf_path}")
final_pdf_path.unlink()
# Clean up old temporary directory if it exists
if tmp_dir.exists():
print(f"🗑️ Cleaning up old temporary directory: {tmp_dir}")
import shutil
shutil.rmtree(tmp_dir)
print("✅ Cleanup completed")
def cleanup_temp_files(tmp_dir):
"""Clean up temporary files after successful completion"""
try:
if tmp_dir.exists():
import shutil
shutil.rmtree(tmp_dir)
print(f"✅ Temporary files cleaned up: {tmp_dir}")
else:
print(" No temporary files to clean up")
except Exception as e:
print(f"⚠️ Warning: Could not clean up temporary files: {e}")
print(f"💡 You can manually delete the folder: {tmp_dir}")
def main():
"""Main function"""
# Parse command line arguments
keep_temp = "--keep-temp" in sys.argv
if keep_temp:
print("📝 Note: Temporary files will be kept (--keep-temp flag detected)")
print("🚀 Starting Complete PDF Generation Process...")
# Check if HTML file exists
html_file = Path("energie360/energie360-offerte.html")
if not html_file.exists():
print(f"❌ HTML file not found: {html_file}")
return False
# Create temporary directory for all intermediate files
tmp_dir = Path("_tmp")
# Define output paths
source_dir = html_file.parent
final_pdf_path = source_dir / "energie360-offerte-final.pdf"
# Clean up old files
cleanup_old_files(tmp_dir, final_pdf_path)
# Create fresh temporary directory
tmp_dir.mkdir(exist_ok=True)
print(f"📁 Temporary files will be saved to: {tmp_dir.absolute()}")
print(f"📁 Temporary files include: HTML extracts, intermediate PDFs, and analysis data")
print(f"📁 Final PDF will be saved to: {final_pdf_path}")
# Setup Chrome options
chrome_options = setup_chrome_options()
# Find Chrome executable
chrome_path = find_chrome_executable()
if not chrome_path:
print("❌ Chrome not found! Please install Google Chrome.")
return False
print(f"✅ Chrome found at: {chrome_path}")
# Start Chrome driver with retry logic
driver = None
max_retries = 3
for attempt in range(max_retries):
try:
print(f"🔄 Attempt {attempt + 1}/{max_retries} to start Chrome driver...")
driver = webdriver.Chrome(options=chrome_options)
print("✅ Chrome driver started successfully")
break
except Exception as e:
print(f"❌ Attempt {attempt + 1} failed: {e}")
if attempt < max_retries - 1:
print("⏳ Waiting 2 seconds before retry...")
time.sleep(2)
else:
print("❌ All attempts to start Chrome driver failed")
return False
try:
# ===== FIRST PASS: Generate TOC with estimated page numbers =====
print("\n🔄 FIRST PASS: Generating TOC with estimated page numbers...")
# Open the HTML file
html_url = f"file://{os.path.abspath(html_file)}"
print(f"🌐 Opening HTML: {html_url}")
driver.get(html_url)
# Wait for page to load
time.sleep(3)
# Wait for TOC generation with estimated numbers
try:
if not check_driver_health(driver):
print("❌ Driver unhealthy after page load")
return False
if not wait_for_toc_completion(driver):
print("❌ First pass TOC generation failed")
return False
except Exception as e:
print(f"❌ Error during first pass TOC generation: {e}")
return False
print("✅ First pass TOC completed with estimated page numbers")
# ===== SECOND PASS: Extract HTML with estimated TOC and generate PDF =====
print("\n🔄 SECOND PASS: Extracting HTML with estimated TOC and generating PDF...")
# Check driver health before extraction
if not check_driver_health(driver):
print("❌ Driver unhealthy before HTML extraction")
return False
# Extract HTML with estimated TOC for analysis
print("📄 Extracting HTML with estimated TOC...")
estimated_html = extract_complete_html(driver, "energie360-offerte-estimated.html", tmp_dir)
# Generate PDF from HTML with estimated TOC
estimated_html_path = tmp_dir / "energie360-offerte-estimated.html"
estimated_pdf_path = tmp_dir / "energie360-offerte-estimated.pdf"
if not generate_pdf_from_complete_html(str(estimated_html_path), str(estimated_pdf_path)):
print("❌ PDF generation for analysis failed")
return False
# Analyze PDF to get real page numbers
print("📊 Analyzing PDF for real page numbers...")
# Use absolute path for PDF analysis
pdf_path = estimated_pdf_path.absolute()
print(f"📄 Looking for PDF at: {pdf_path}")
page_numbers = analyze_pdf_page_numbers(str(pdf_path))
if not page_numbers:
print("❌ PDF analysis failed")
return False
# ===== THIRD PASS: Update TOC with real page numbers =====
print("\n🔄 THIRD PASS: Updating TOC with real page numbers...")
# First, clean existing numbering and add professional outline numbering
print("🔧 Cleaning and adding professional outline numbering to headings...")
if not clean_and_number_headings_professionally(driver):
print("❌ Failed to add professional outline numbering")
return False
# Now create a professional TOC with real page numbers
print("🔧 Creating professional TOC with real page numbers...")
if not create_professional_toc_with_real_page_numbers(driver, page_numbers):
print("❌ Failed to create professional TOC")
return False
# Wait for page counter to update footer
if not wait_for_page_counter_completion(driver):
print("❌ Page counter update failed")
return False
print("✅ Second pass TOC completed with real page numbers")
# ===== FINAL: Extract complete HTML and generate final PDF =====
print("\n🔄 FINAL: Generating final PDF with accurate TOC and footer...")
# Extract complete HTML with accurate TOC and footer
complete_html = extract_complete_html(driver, "energie360-offerte-final.html", tmp_dir)
# Generate final PDF from complete HTML
final_html_path = tmp_dir / "energie360-offerte-final.html"
if generate_pdf_from_complete_html(str(final_html_path), str(final_pdf_path)):
print("🎉 Final PDF generation successful!")
print(f"📁 Final PDF saved to: {final_pdf_path}")
# Handle temporary files based on command line flag
if keep_temp:
print(f"📁 Temporary files kept in: {tmp_dir.absolute()}")
print("💡 Use '--keep-temp' flag to automatically clean up temp files")
else:
print(f"📁 Temporary files are available in: {tmp_dir.absolute()}")
print("🧹 Cleaning up temporary files...")
cleanup_temp_files(tmp_dir)
return True
else:
print("❌ Final PDF generation failed")
return False
except Exception as e:
print(f"❌ Error during process: {e}")
return False
finally:
driver.quit()
print("✅ Chrome driver closed")
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)

146
offerten/main.py Normal file
View file

@ -0,0 +1,146 @@
#!/usr/bin/env python3
"""
Simple HTML to PDF Generation using Chrome headless
Renders HTML file to PDF without TOC or page analysis
"""
import os
import sys
import subprocess
import platform
from pathlib import Path
def find_chrome_executable():
"""Find Chrome/Chromium executable based on platform"""
system = platform.system()
if system == "Windows":
# Common Chrome paths on Windows
chrome_paths = [
r"C:\Program Files\Google\Chrome\Application\chrome.exe",
r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
r"C:\Users\{}\AppData\Local\Google\Chrome\Application\chrome.exe".format(os.getenv('USERNAME')),
]
for path in chrome_paths:
if os.path.exists(path):
return path
# Try to find from registry or PATH
try:
result = subprocess.run(['where', 'chrome'], capture_output=True, text=True)
if result.returncode == 0:
return result.stdout.strip().split('\n')[0]
except:
pass
elif system == "Darwin": # macOS
chrome_paths = [
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
"/Applications/Chromium.app/Contents/MacOS/Chromium"
]
for path in chrome_paths:
if os.path.exists(path):
return path
else: # Linux
chrome_paths = [
"google-chrome",
"chromium-browser",
"chromium",
"/usr/bin/google-chrome",
"/usr/bin/chromium-browser"
]
for path in chrome_paths:
try:
result = subprocess.run(['which', path], capture_output=True)
if result.returncode == 0:
return path
except:
continue
return None
def generate_pdf_chrome(html_path, output_path, chrome_path):
"""Generate PDF using Chrome headless"""
try:
# Convert to absolute paths
html_path = Path(html_path).resolve()
output_path = Path(output_path).resolve()
# Chrome headless command
cmd = [
chrome_path,
"--headless",
"--disable-gpu",
"--no-pdf-header-footer", # Remove Chrome's default headers
f"--print-to-pdf={output_path}",
f"--print-to-pdf-no-header",
f"file://{html_path}"
]
print(f"🔄 Running Chrome headless...")
print(f" Input: {html_path}")
print(f" Output: {output_path}")
# Run Chrome
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f"✅ PDF generated successfully!")
print(f" Location: {output_path}")
return True
else:
print(f"❌ Chrome error: {result.stderr}")
return False
except Exception as e:
print(f"❌ Error: {e}")
return False
def main():
"""Main function"""
# Get script directory
script_dir = Path(__file__).parent
energie360_dir = script_dir / 'energie360'
# File paths
html_file = energie360_dir / 'energie360-offerte.html'
output_pdf = energie360_dir / 'energie360-offerte.pdf'
# Check if HTML file exists
if not html_file.exists():
print(f"❌ HTML file not found: {html_file}")
return False
print("🚀 HTML to PDF Generation")
print("=" * 30)
# Try to find Chrome
chrome_path = find_chrome_executable()
if chrome_path:
print(f"✅ Chrome found: {chrome_path}")
# Generate PDF
print("\n🔄 Generating PDF...")
success = generate_pdf_chrome(html_file, output_pdf, chrome_path)
if success:
print(f"\n🎉 PDF generated successfully!")
print(f"📄 Output: {output_pdf}")
return True
else:
print("\n❌ PDF generation failed")
return False
else:
print("⚠️ Chrome not found, cannot generate PDF")
return False
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)

View file

@ -0,0 +1,9 @@
weasyprint>=60.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
PyMuPDF==1.23.8 # For PDF analysis and text extraction
pathlib2==2.3.7 # For cross-platform path handling (if not using Python 3.4+)
selenium==4.15.2
webdriver-manager==4.0.1

Binary file not shown.

View file

@ -0,0 +1,74 @@
# PowerOn Use Cases für Schweiz Tourismus
## Übersicht
Dieses Dokument beschreibt spezifische Use Cases für die PowerOn AI Platform im Kontext der Schweiz Tourismus Organisation (STC). Die Use Cases zeigen, wie die verschiedenen Methoden der Plattform eingesetzt werden können, um Tourismus-Prozesse zu optimieren.
## Use Cases Übersicht
| Use Case | Ziel | Hauptmethoden | Nutzen |
|----------|------|---------------|---------|
| **Intelligente Reiseplanung** | Personalisierte Reiseempfehlungen basierend auf Benutzerpräferenzen | Web, AI, Document, Outlook | Höhere Kundenbindung, bessere Conversion-Raten |
| **Content-Erstellung & Lokalisierung** | Mehrsprachige Tourismus-Inhalte effizient erstellen | Document, AI, Web, SharePoint | Schnellere Markteinführung, lokale Relevanz |
| **Event-Management & Besucheranalyse** | Events durch datenbasierte Erkenntnisse optimieren | Web, AI, Document, Outlook | Bessere Besuchererfahrung, höhere Event-Erfolge |
### **Detaillierte Beschreibungen**
<details>
<summary><strong>Use Case 1: Intelligente Reiseplanung & Personalisierung</strong></summary>
**Ziel**: Automatisierte, personalisierte Reiseempfehlungen basierend auf Benutzerpräferenzen
**Methoden-Einsatz**:
- **Web Method**: Sammeln aktueller Informationen über Sehenswürdigkeiten, Events, Wetter
- **AI Method**: Analyse von Benutzerverhalten und Präferenzen
- **Document Method**: Erstellung personalisierter Reiseführer und Itineraries
- **Outlook Method**: Automatische Versendung von personalisierten Angeboten
**Customer Journey**: Datensammlung → Personalisierung → Content-Generierung → Kommunikation → Optimierung
</details>
<details>
<summary><strong>Use Case 2: Automatisierte Content-Erstellung & Lokalisierung</strong></summary>
**Ziel**: Effiziente Erstellung und Lokalisierung von Tourismus-Content in mehreren Sprachen
**Methoden-Einsatz**:
- **Document Method**: Extraktion von Informationen aus bestehenden Quellen
- **AI Method**: Übersetzung und Lokalisierung von Content
- **Web Method**: Recherche nach lokalen Besonderheiten und kulturellen Aspekten
- **SharePoint Method**: Verwaltung und Versionierung der mehrsprachigen Inhalte
**Customer Journey**: Content-Extraktion → Lokalisierung → Qualitätssicherung → Veröffentlichung → Performance-Tracking
</details>
<details>
<summary><strong>Use Case 3: Intelligente Event-Management & Besucheranalyse</strong></summary>
**Ziel**: Optimierung von Events und Besuchererfahrungen durch datenbasierte Erkenntnisse
**Methoden-Einsatz**:
- **Web Method**: Sammeln von Feedback und Bewertungen aus verschiedenen Quellen
- **AI Method**: Sentiment-Analyse und Trend-Erkennung
- **Document Method**: Erstellung von Event-Berichten und Optimierungsvorschlägen
- **Outlook Method**: Automatische Benachrichtigung von Stakeholdern über wichtige Erkenntnisse
**Customer Journey**: Datensammlung → Analyse → Reporting → Optimierung → Monitoring
</details>
## Technische Umsetzung
Alle Use Cases nutzen die PowerOn Methoden-Toolbox:
- **Web Method**: Automatisierte Datensammlung von verschiedenen Quellen
- **Document Method**: Intelligente Extraktion und Analyse von Informationen
- **Outlook Method**: Automatische Email-Benachrichtigungen und Teams-Integration
- **SharePoint Method**: Strukturierte Datenspeicherung und -verwaltung
- **GoogleDrive Method**: Integration mit Google Workspace
- **AI Method**: Intelligente Auswertung und Generierung von Erkenntnissen
## Nächste Schritte
1. **Proof of Concept**: Implementierung eines Use Cases als Pilotprojekt
2. **Schulung**: Einarbeitung der STC-Mitarbeiter in die PowerOn Plattform
3. **Skalierung**: Schrittweise Ausweitung auf weitere Use Cases
4. **Optimierung**: Kontinuierliche Verbesserung basierend auf Nutzer-Feedback

View file

@ -0,0 +1,166 @@
# PowerOn AI Platform
## 1. Was ist PowerOn? - Zweck und Ziel
PowerOn ist eine **Multi-Methoden-KI-Plattform**, die spezialisierte Methoden und Actions intelligent orchestriert, um komplexe geschäftliche Herausforderungen zu lösen. Die Plattform kombiniert menschliche Expertise mit KI-Effizienz in einem modularen, skalierbaren System.
### Kernziele:
- **Intelligente Orchestrierung** spezialisierter Methoden und Actions
- **Demokratisierung von KI-Fähigkeiten** für alle Mitarbeiter
- **Beschleunigung von Entscheidungsprozessen** durch automatisierte Datenanalyse
- **Nahtlose Integration** in bestehende Unternehmenssysteme
### Architektur-Übersicht:
```mermaid
flowchart TB
subgraph Frontend ["Frontend"]
UI["Benutzeroberfläche"]
end
subgraph Backend ["Backend"]
API["API Layer"] --- CORE["Core Services"]
end
subgraph Methods ["Methods & Actions"]
M1["Web Method"] --- M2["Document Method"] --- M3["Outlook Method"] --- M4["AI Method"] --- M5["SharePoint Method"] --- M6["GoogleDrive Method"]
end
subgraph External ["Externe Systeme"]
AI["AI Provider"] --- MS["Microsoft Services"] --- WEB["Web Services"]
end
subgraph Data ["Daten"]
DB["Datenbank"]
end
UI --> API
API --> CORE
CORE --> Methods
Methods --> External
Methods --> DB
CORE --> DB
classDef frontendClass fill:#D6EAF8,stroke:#2E86C1,stroke-width:2px
classDef backendClass fill:#D5F5E3,stroke:#239B56,stroke-width:2px
classDef methodClass fill:#F5A7A7,stroke:#F07272,stroke-width:2px,color:white
classDef externalClass fill:#F5EEF8,stroke:#8E44AD,stroke-width:2px
classDef dataClass fill:#FADBD8,stroke:#C0392B,stroke-width:2px
class UI frontendClass
class API,CORE backendClass
class M1,M2,M3,M4,M5,M6 methodClass
class AI,MS,WEB externalClass
class DB dataClass
```
## 2. Warum haben wir PowerOn gebaut?
### Hauptgründe:
#### 1. **Kontrolle über Daten und Datenflüsse**
- **Vollständige Transparenz**: Alle Datenverarbeitungsschritte sind nachvollziehbar
- **Lokale Datenspeicherung**: Keine ungewollte Datenweitergabe an Dritte
- **DSGVO-konform**: Compliance durch kontrollierte Datenverarbeitung
#### 2. **Compliance erfüllen mit Neutralisierer**
- **Automatische Datenklassifizierung**: Erkennung sensibler Informationen
- **Intelligente Maskierung**: Automatische Anonymisierung von personenbezogenen Daten
- **Audit-Trail**: Vollständige Protokollierung aller Datenzugriffe
#### 3. **Plug-and-Play Implementierung beim Kunden**
- **myConnectors**: Einfache Integration ohne teure ERP-Systeme
- **Standardisierte Schnittstellen**: Schnelle Anbindung bestehender Systeme
- **Minimaler Implementierungsaufwand**: Betriebsbereit in 1-2 Wochen
#### 4. **Workflow Engine und UIs beliebig koppelbar**
- **Modulare Architektur**: Flexibel kombinierbare Methoden und Actions
- **Offene Schnittstellen**: Einfache Erweiterung und Anpassung
- **Skalierbare Workflows**: Von einfachen Aufgaben bis zu komplexen Prozessen
### Workflow-System mit Methoden und Actions:
```mermaid
flowchart TB
USER((Benutzer / Trigger))
AUTH[Authentifizierung]
WF_INIT[Workflow-<br/>Initialisierung]
WF_EXEC[Workflow-<br/>Ausführung]
RESULT_COLLECT[Ergebnis-<br/>Sammlung]
subgraph Methods ["Methoden-Toolbox"]
WEB_METHOD["Web Method<br/>• Search<br/>• Crawl"] --- DOC_METHOD["Document Method<br/>• Extract<br/>• Analyze"] --- OUTLOOK_METHOD["Outlook Method<br/>• Compose<br/>• Send"] --- AI_METHOD["AI Method<br/>• Analyze<br/>• Generate"] --- SHAREPOINT_METHOD["SharePoint Method<br/>• Read<br/>• Write"] --- GOOGLEDRIVE_METHOD["GoogleDrive Method<br/>• Read<br/>• Write"]
end
USER -->|Login| AUTH
AUTH -->|Workspace| WF_INIT
WF_INIT -->|Kontext| WF_EXEC
WF_EXEC -->|Methoden| Methods
Methods -->|Ergebnisse| RESULT_COLLECT
RESULT_COLLECT -->|Feedback| USER
USER -->|Eingriffe| WF_EXEC
classDef userClass fill:#68A7AD,stroke:#376B6D,stroke-width:2px,color:white
classDef processClass fill:#99C4C8,stroke:#5E8B8F,stroke-width:1px
classDef methodClass fill:#F5A7A7,stroke:#F07272,stroke-width:2px,color:white
class USER userClass
class AUTH,WF_INIT,WF_EXEC,RESULT_COLLECT processClass
class WEB_METHOD,DOC_METHOD,OUTLOOK_METHOD,AI_METHOD,SHAREPOINT_METHOD,GOOGLEDRIVE_METHOD methodClass
```
## 3. Einsatz-Beispiele: Customer Journey & Use Cases
### **Customer Journey: Immobilienprojekte & Produktvertrieb**
#### **Phase 1: Web-Research & Datensammlung**
- **Web-Research**: Automatisierte Suche nach Immobilienprojekten oder Produktinformationen
- **Daten-Extraktion**: Sammeln von Preisen, Verfügbarkeiten, Kontaktdaten
- **Marktanalyse**: Identifikation von Trends und Wettbewerbern
#### **Phase 2: Auswertung der Ergebnisse**
- **Datenanalyse**: KI-basierte Auswertung der gesammelten Informationen
- **Trend-Erkennung**: Automatische Identifikation von Mustern und Entwicklungen
- **Qualitätsbewertung**: Bewertung der Datenqualität und Relevanz
#### **Phase 3: Formatierung für interne Weiterverarbeitung**
- **Strukturierung**: Automatische Aufbereitung in standardisierte Formate
- **Berichtgenerierung**: Erstellung von Zusammenfassungen und Dashboards
- **Dokumentation**: Archivierung und Kategorisierung der Ergebnisse
#### **Phase 4: Automatische Zuweisung zu Verantwortlichen**
- **Workflow-Orchestrierung**: Intelligente Weiterleitung basierend auf Inhalten
- **Multi-Channel-Integration**: Automatische Benachrichtigung per Email, Teams, Slack, Jira
- **Aufgabenverwaltung**: Erstellung und Zuweisung von Follow-up-Aufgaben
#### **Phase 5: Dashboard & Performance-Monitoring**
- **Prozess-Überwachung**: Echtzeit-Einblicke in Workflow-Fortschritte
- **Conversion-Tracking**: Messung von Erfolgsraten und Durchlaufzeiten
- **Performance-Analyse**: Identifikation von Optimierungspotenzialen
### **Technische Umsetzung:**
- **Web Method**: Automatisierte Datensammlung von verschiedenen Quellen
- **Document Method**: Intelligente Extraktion und Analyse von Informationen
- **Outlook Method**: Automatische Email-Benachrichtigungen und Teams-Integration
- **SharePoint Method**: Strukturierte Datenspeicherung und -verwaltung
- **AI Method**: Intelligente Auswertung und Generierung von Erkenntnissen
---
## Zusammenfassung
PowerOn ist eine **flexible KI-Plattform**, die Unternehmen dabei hilft:
1. **Kontrolle über ihre Daten** zu behalten
2. **Compliance-Anforderungen** automatisch zu erfüllen
3. **Schnell und kostengünstig** zu implementieren
4. **Flexibel und skalierbar** zu wachsen
Die Plattform kombiniert **menschliche Kreativität** mit **KI-Effizienz** und schafft ein konfigurierbares System, so wie es benötigt wird.
**Nächste Schritte:**
- Kostenlose Demo
- Proof of Concept mit spezifischen Anwendungsfall
- Massgeschneiderte Implementierung planen

View file

@ -1239,7 +1239,7 @@ graph TD
│ │ │ Parameter │ │ Value │ │ Description │ │
│ │ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ │
│ │ │ file_path │ │ {extracted_text}│ │ File to upload │ │
│ │ │ file_name │ │ report_processed│ │ Custom filename │ │
│ │ │ file_name │ │ report_processed│ │ Custom fileName │ │
│ │ │ file_extension │ │ .pdf │ │ File extension │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │ │

View file

@ -0,0 +1,483 @@
# React-UI Spezifikation für PowerOn Frontend
## Übersicht
Diese Spezifikation definiert die strukturellen und architektonischen Prinzipien für das React-UI für PowerOn und weitere UI's.
## 1. Architektur-Übersicht
### 1.1 Generische UI-Anforderungen
Das UI soll:
- **Modular und erweiterbar** sein: Neue Module können einfach hinzugefügt werden ohne bestehenden Code zu ändern
- **Konsistent und einheitlich** sein: Alle Module folgen den gleichen Design-Patterns und Verhaltensweisen
- **Responsive und zugänglich** sein: Funktioniert auf allen Geräten und ist barrierefrei
- **Performance-optimiert** sein: Schnelle Ladezeiten und flüssige Interaktionen
- **Wartbar und testbar** sein: Klare Struktur, umfassende Tests und Dokumentation
- **Sicher und robust** sein: Fehlerbehandlung, Input-Validierung und sichere API-Kommunikation
- **Internationalisierbar** sein: Mehrsprachige Unterstützung für alle UI-Elemente
- **Konfigurierbar** sein: Verhalten und Aussehen können über Konfiguration angepasst werden
### 1.2 React-Architektur-Spezifikation
Das React-UI MUSS folgende Kernelemente implementieren:
#### **1.2.1 FormGeneric-Komponente**
- EINE zentrale CRUD-Komponente für alle Module
- Automatische Formular-Generierung basierend auf Backend-Modell-Definitionen
- Einheitliche Validierung und Fehlerbehandlung
- Unterstützung für alle Standard-Feldtypen (Text, Number, Date, Select, etc.)
#### **1.2.2 Modul-Management-System**
- Zentrale Klasse für Modul-Loading, -Aktivierung und -Deaktivierung
- Dynamisches Laden von Modulen zur Laufzeit
- Modul-spezifische Konfiguration und State-Isolation
- Einheitliche Modul-Lifecycle-Verwaltung
#### **1.2.3 Globaler State-Management**
- EINE zentrale State-Management-Lösung für alle Module
- Konsistente Datenhaltung und -synchronisation
- Modul-übergreifende Datenfreigabe
- Optimistic Updates und Rollback-Mechanismen
#### **1.2.4 Timezone-Aware Timestamp-System**
- Alle Timestamps MÜSSEN timezone-aware sein
- Konsistente Darstellung in allen Modulen
- Automatische Konvertierung zwischen Zeitzonen
- Integration mit Backend-Timestamp-Format
#### **1.2.5 Zentrale API-Kommunikation**
- Einheitliche API-Call-Verwaltung
- Automatische Error-Handling und Retry-Mechanismen
- Request/Response-Interceptoren
- Caching-Strategien für Performance
#### **1.2.6 Konfigurationsverwaltung**
- Globale Konfiguration für UI-Verhalten
- Umgebungs-spezifische Konfiguration (dev/prod)
- Feature-Flags für modulare Aktivierung
- Zentrale Validierungsregeln
## 2. Konfigurationsverwaltung
### 2.1 Konfigurationsarchitektur
Das UI verwendet eine zweistufige Konfigurationsverwaltung:
#### **Globale Konfiguration (config.js)**
```typescript
// Zentrale Konfigurationsverwaltung für globale Variablen
interface GlobalConfig {
// API-Konfiguration
apiBaseUrl: string;
apiTimeout: number;
// UI-Konfiguration
defaultLanguage: string;
theme: 'light' | 'dark' | 'auto';
pageSize: number;
// Feature-Flags
features: {
enableAdvancedSearch: boolean;
enableBulkOperations: boolean;
enableRealTimeUpdates: boolean;
};
// Validierung
validation: {
maxFileSize: number;
allowedFileTypes: string[];
passwordMinLength: number;
};
}
// Konfigurationsservice
class ConfigService {
private config: GlobalConfig;
get(key: string): any;
set(key: string, value: any): void;
getApiBaseUrl(): string;
getFeatureFlag(flag: string): boolean;
}
```
#### **Umgebungs-spezifische Konfiguration (env)**
```typescript
// Umgebungsvariablen für spezifische Konfigurationen
interface EnvironmentConfig {
// Umgebung
NODE_ENV: 'development' | 'production' | 'test';
APP_ENV: 'dev' | 'int' | 'prod';
// API-Endpunkte
API_BASE_URL: string;
API_TIMEOUT: number;
// Debugging
DEBUG_MODE: boolean;
LOG_LEVEL: 'debug' | 'info' | 'warn' | 'error';
// Externe Services
GOOGLE_CLIENT_ID?: string;
MICROSOFT_CLIENT_ID?: string;
// Build-spezifisch
BUILD_VERSION: string;
BUILD_TIMESTAMP: string;
}
// Environment Service
class EnvironmentService {
get(key: keyof EnvironmentConfig): string | undefined;
isDevelopment(): boolean;
isProduction(): boolean;
getApiBaseUrl(): string;
}
```
### 2.2 Konfigurationshierarchie
```typescript
// Konfigurationspriorität (höchste zu niedrigste):
// 1. Umgebungsvariablen (env)
// 2. Globale Konfiguration (config.js)
// 3. Standardwerte (defaults)
class ConfigurationManager {
private envConfig: EnvironmentConfig;
private globalConfig: GlobalConfig;
private defaults: GlobalConfig;
get(key: string): any {
// Prüfe Umgebungsvariablen zuerst
if (this.envConfig[key]) {
return this.envConfig[key];
}
// Dann globale Konfiguration
if (this.globalConfig[key]) {
return this.globalConfig[key];
}
// Schließlich Standardwerte
return this.defaults[key];
}
}
```
### 2.3 React-Integration
```typescript
// React Hook für Konfiguration
const useConfig = () => {
const [config, setConfig] = useState<GlobalConfig>();
useEffect(() => {
// Lade Konfiguration beim Mount
const loadConfig = async () => {
const configData = await configService.load();
setConfig(configData);
};
loadConfig();
}, []);
return {
config,
get: (key: string) => config?.[key],
isFeatureEnabled: (feature: string) => config?.features?.[feature] || false,
getApiBaseUrl: () => config?.apiBaseUrl || envService.getApiBaseUrl()
};
};
// Verwendung in Komponenten
const MyComponent = () => {
const { config, isFeatureEnabled, getApiBaseUrl } = useConfig();
return (
<div>
{isFeatureEnabled('enableAdvancedSearch') && <AdvancedSearch />}
<ApiClient baseUrl={getApiBaseUrl()} />
</div>
);
};
```
## 3. Strukturelle Prinzipien
### 3.1 Modulare Architektur
Jedes Modul folgt einer einheitlichen Struktur:
```typescript
ModuleName/
├── index.tsx // Hauptkomponente
├── ModuleName.tsx // Haupt-UI-Komponente
├── ModuleName.types.ts // TypeScript-Definitionen
├── ModuleName.hooks.ts // Custom Hooks
├── ModuleName.service.ts // API-Service
└── ModuleName.styles.css // Modul-spezifische Styles
```
### 3.2 State Management
```typescript
// Zustand-Management mit React Context + useReducer
interface ModuleState {
items: any[];
currentItem: any | null;
isEditing: boolean;
isCreating: boolean;
lifecycleState: 'active' | 'background' | 'unloaded' | 'stale';
lastActivated: number | null;
lastDataLoad: number | null;
}
// Zentrale Module-Management-Klasse
class ModuleManager {
private modules: Map<string, ModuleState> = new Map();
load(moduleName: string): Promise<boolean>;
unload(moduleName: string): boolean;
activate(moduleName: string): Promise<boolean>;
deactivate(moduleName: string): boolean;
}
```
## 4. FormGeneric React-Implementierung
### 4.1 Generische CRUD-Komponente
```typescript
interface FormGenericProps<T> {
entityType: string;
apiEndpoint: {
get: () => Promise<T[]>;
create: (data: Partial<T>) => Promise<T>;
update: (id: string, data: Partial<T>) => Promise<T>;
delete: (id: string) => Promise<void>;
};
config: {
fields: FieldDefinition[];
table: TableConfig;
ui: UIConfig;
};
events?: {
beforeActivation?: () => Promise<void>;
onActivation?: () => Promise<void>;
onDeactivation?: () => Promise<void>;
};
}
const FormGeneric = <T extends Record<string, any>>({
entityType,
apiEndpoint,
config,
events
}: FormGenericProps<T>) => {
// React-Implementierung der aktuellen formGeneric-Logik
};
```
### 4.2 Field-Definitionen aus Backend
```typescript
interface FieldDefinition {
name: string;
label: Record<string, string>; // Multi-language support
type: 'text' | 'email' | 'password' | 'checkbox' | 'select' | 'textarea' | 'timestamp';
required: boolean;
readonly: boolean;
options?: Array<{
value: string;
label: Record<string, string>;
}>;
}
```
## 5. Timezone-Aware Timestamps
### 5.1 Konsistente Timestamp-Behandlung
```typescript
// React Hook für Timestamp-Utilities
const useTimezoneUtils = () => {
const formatUtcForDisplay = (timestamp: number): string => {
// UTC timestamp in seconds -> formatted display string
};
const isExpiredUtc = (expiresAt: number): boolean => {
// Check if timestamp is expired
};
return { formatUtcForDisplay, isExpiredUtc, /* ... */ };
};
```
### 5.2 Backend-Model-Integration
```typescript
// Automatische Generierung von TypeScript-Interfaces aus Backend-Modellen
interface User {
id: string;
username: string;
email: string;
fullName?: string;
language: string;
enabled: boolean;
privilege: 'user' | 'admin' | 'sysadmin';
authenticationAuthority: 'local' | 'google' | 'msft';
mandateId?: string;
}
interface UserConnection {
id: string;
userId: string;
authority: 'local' | 'google' | 'msft';
externalUsername: string;
externalEmail?: string;
status: 'active' | 'expired' | 'revoked' | 'pending';
connectedAt: number; // UTC timestamp
lastChecked: number; // UTC timestamp
expiresAt?: number; // UTC timestamp
}
```
## 6. Fehlerbehandlung
### 6.1 Zentrale Error-Boundary
```typescript
class ErrorBoundary extends React.Component {
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
// Logging und Benutzer-Benachrichtigung
console.error('Module Error:', error, errorInfo);
// Toast-Benachrichtigung anzeigen
}
}
```
### 6.2 API-Error-Handling
```typescript
// Service-Klasse für API-Aufrufe
class ApiService {
async request<T>(endpoint: string, options?: RequestInit): Promise<T> {
try {
const response = await fetch(endpoint, options);
if (!response.ok) {
throw new ApiError(response.status, await response.text());
}
return await response.json();
} catch (error) {
// Zentrale Fehlerbehandlung
this.handleError(error);
throw error;
}
}
}
```
## 7. Styling-Ansatz
### 6.1 CSS-in-JS oder CSS-Module
```typescript
// Empfehlung: CSS-Module für bessere Performance
import styles from './FormGeneric.module.css';
const FormGeneric = () => (
<div className={styles.entityTable}>
<table className={styles.table}>
{/* ... */}
</table>
</div>
);
```
### 6.2 Design-System
```css
/* Design-Tokens */
:root {
--color-primary: #3b82f6;
--color-secondary: #6b7280;
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
--border-radius: 0.375rem;
--box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
```
## 7. Performance-Optimierungen
### 7.1 Lazy Loading
```typescript
// Lazy Loading für Module
const UsersModule = React.lazy(() => import('./modules/Users'));
const ConnectionsModule = React.lazy(() => import('./modules/Connections'));
// Suspense-Wrapper
<Suspense fallback={<LoadingSpinner />}>
<UsersModule />
</Suspense>
```
### 7.2 Memoization
```typescript
// Optimierte Komponenten mit React.memo
const DataTable = React.memo<DataTableProps>(({ data, columns }) => {
// Komponente wird nur neu gerendert wenn sich data oder columns ändern
});
```
## 8. Testing-Strategie
### 8.1 Unit Tests
```typescript
// Jest + React Testing Library
describe('FormGeneric', () => {
it('should render table with data', () => {
render(<FormGeneric {...mockProps} />);
expect(screen.getByRole('table')).toBeInTheDocument();
});
});
```
### 8.2 Integration Tests
```typescript
// API-Integration Tests
describe('UserService', () => {
it('should fetch users from API', async () => {
const users = await userService.getUsers();
expect(users).toHaveLength(2);
});
});
```
## 9. Implementierungsrichtlinien
### 9.1 Code-Qualität
- **TypeScript**: Strikte Typisierung für alle Komponenten und Services
- **ESLint**: Code-Qualitätsregeln und Konsistenz
### 9.2 Dokumentation
- **Storybook**: Komponenten-Dokumentation
- **README**: Setup und Entwicklungsanweisungen

View file

@ -68,7 +68,7 @@ Die Chat-Workflow-Frontend-Logik implementiert eine State Machine, die Benutzeri
```json
{
"id": "number|string", // numerisch oder UUID
"name": "filename.ext",
"name": "fileName.ext",
"size": int,
"mimeType": "string", // MIME-Type (z.B. application/pdf)
"base64Encoded": boolean, // optional

View file

@ -1,263 +0,0 @@
"""
DSGVO-konformer Daten-Neutralisierer für KI-Agentensysteme
Unterstützt TXT, JSON, CSV, Excel und Word-Dateien
Mehrsprachig: DE, EN, FR, IT
"""
import os
import shutil
import logging
import csv
import json
import pandas as pd
from datetime import datetime
from pathlib import Path
from neutralizer import DataAnonymizer
import traceback
# Define directories
SCRIPT_DIR = Path(__file__).parent
INPUT_DIR = SCRIPT_DIR / 'input'
OUTPUT_DIR = SCRIPT_DIR / 'output'
LOG_DIR = SCRIPT_DIR / 'logs'
LOG_MAPPING = LOG_DIR / 'log_mapping.csv'
LOG_REPLACEMENTS = LOG_DIR / 'log_replacements.csv'
# Configure logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
def setup_directories():
"""Setup output and log directories"""
# Close any existing log handlers
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
# Clear and recreate output directory
output_dir = Path("output")
if output_dir.exists():
shutil.rmtree(output_dir)
output_dir.mkdir()
logger.info(f"Output directory '{output_dir}' created")
# Clear and recreate logs directory
log_dir = Path("logs")
if log_dir.exists():
shutil.rmtree(log_dir)
log_dir.mkdir()
logger.info(f"Log directory '{log_dir}' created")
# Create log files
mapping_log = log_dir / "log_mapping.csv"
replacements_log = log_dir / "log_replacements.csv"
# Create headers for mapping log
with open(mapping_log, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['timestamp', 'success', 'file_name', 'replaced_fields', 'content_type', 'headers', 'row_count'])
# Create headers for replacements log
with open(replacements_log, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['timestamp', 'success', 'file_name', 'original', 'replacement'])
# Reconfigure logging with new log file
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
file_handler = logging.FileHandler(LOG_DIR / 'app.log', encoding='utf-8')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)
return output_dir, log_dir
def log_mapping(log_dir: Path, file_name: str, success: bool, replaced_fields: list):
"""Log mapping information"""
try:
with open(log_dir / "log_mapping.csv", 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow([
datetime.now().isoformat(),
file_name,
success,
';'.join(replaced_fields) if replaced_fields else '',
'unknown'
])
except Exception as e:
logger.error(f"Error logging mapping: {str(e)}")
def log_replacements(log_dir: Path, file_name: str, mapping: dict):
"""Log replacement information"""
try:
with open(log_dir / "log_replacements.csv", 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
for original, replacement in mapping.items():
writer.writerow([
datetime.now().isoformat(),
file_name,
original,
replacement
])
except Exception as e:
logger.error(f"Error logging replacements: {str(e)}")
def save_anonymized_data(data: any, output_path: Path, file_type: str):
"""Save anonymized data to file"""
try:
if file_type == '.csv':
if isinstance(data, pd.DataFrame):
data.to_csv(output_path, index=False, encoding='utf-8')
else:
raise ValueError("Data must be a DataFrame for CSV output")
elif file_type == '.json':
if isinstance(data, pd.DataFrame):
data.to_json(output_path, orient='records', force_ascii=False)
else:
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
elif file_type == '.xml':
if isinstance(data, str):
with open(output_path, 'w', encoding='utf-8') as f:
f.write(data)
else:
raise ValueError("Data must be a string for XML output")
elif file_type in ['.txt', '.docx']:
if isinstance(data, str):
with open(output_path, 'w', encoding='utf-8') as f:
f.write(data)
else:
raise ValueError("Data must be a string for text output")
else:
raise ValueError(f"Unsupported file type: {file_type}")
except Exception as e:
logger.error(f"Error saving anonymized data to {output_path}: {str(e)}")
raise
def read_file_content(file_path: Path) -> tuple[str, str]:
"""Read file content and determine content type"""
try:
file_type = file_path.suffix.lower()
if file_type == '.docx':
import docx
doc = docx.Document(file_path)
content = '\n'.join(para.text for para in doc.paragraphs)
else:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return content, file_type
except Exception as e:
logger.error(f"Error reading file {file_path}: {str(e)}")
raise
def process_file(file_path: Path, anonymizer: DataAnonymizer) -> bool:
"""Process a single file and save anonymized version"""
try:
# Read file content
content = file_path.read_text(encoding='utf-8')
# Process content
result = anonymizer.process_content(content, file_path.suffix[1:])
if result.data is None:
logger.error(f"Failed to process {file_path.name}")
return False
# Save anonymized content with neutralized_ prefix
output_path = OUTPUT_DIR / f"neutralized_{file_path.name}"
if file_path.suffix.lower() == '.csv':
result.data.to_csv(output_path, index=False)
elif file_path.suffix.lower() == '.json':
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(result.data, f, indent=2)
elif file_path.suffix.lower() == '.xml':
with open(output_path, 'w', encoding='utf-8') as f:
f.write(result.data)
else:
# For text files, preserve original whitespace
with open(output_path, 'w', encoding='utf-8') as f:
f.write(result.data)
# Log processing details
timestamp = datetime.now().isoformat()
success = True
# Create detailed log entry
log_entry = {
'timestamp': timestamp,
'success': success,
'file_name': file_path.name,
'replaced_fields': ';'.join(set(result.replaced_fields)), # Use set to remove duplicates
'content_type': result.processed_info.get('type', 'unknown')
}
# Add type-specific details
if result.processed_info['type'] == 'table':
log_entry.update({
'headers': ';'.join(result.processed_info['headers']),
'row_count': result.processed_info['row_count']
})
elif result.processed_info['type'] == 'text':
tables = result.processed_info.get('tables', [])
text_sections = result.processed_info.get('text_sections', [])
log_entry.update({
'headers': '', # Empty for text files
'row_count': sum(s['length'] for s in text_sections) # Total text length
})
# Write to log file
with open(LOG_MAPPING, 'a', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=log_entry.keys())
if f.tell() == 0: # Write header if file is empty
writer.writeheader()
writer.writerow(log_entry)
# Log replacements
for original, replacement in result.mapping.items():
with open(LOG_REPLACEMENTS, 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow([timestamp, success, file_path.name, original, replacement])
return True
except Exception as e:
logger.error(f"Error processing {file_path.name}: {str(e)}")
logger.debug(traceback.format_exc())
return False
def main():
# Setup directories
setup_directories()
# Initialize anonymizer
anonymizer = DataAnonymizer()
# Process all files
logger.info("Starting file processing...")
testdata_dir = Path("testdata")
for file_path in testdata_dir.glob("*.*"):
try:
logger.info(f"Processing file: {file_path.name}")
# Process file
if process_file(file_path, anonymizer):
logger.info(f"Anonymization completed for {file_path.name}")
else:
logger.error(f"Error processing {file_path.name}")
except Exception as e:
logger.error(f"Error processing {file_path.name}: {str(e)}")
continue
logger.info("Processing completed!")
if __name__ == "__main__":
main()

View file

@ -1,34 +0,0 @@
2025-06-07 18:12:07,994 - __main__ - INFO - Starting file processing...
2025-06-07 18:12:07,995 - __main__ - INFO - Processing file: Case.md
2025-06-07 18:12:08,020 - __main__ - INFO - Anonymization completed for Case.md
2025-06-07 18:12:08,020 - __main__ - INFO - Processing file: customers.csv
2025-06-07 18:12:08,050 - __main__ - INFO - Anonymization completed for customers.csv
2025-06-07 18:12:08,050 - __main__ - INFO - Processing file: cv_lara_meier.txt
2025-06-07 18:12:08,076 - __main__ - INFO - Anonymization completed for cv_lara_meier.txt
2025-06-07 18:12:08,076 - __main__ - INFO - Processing file: employees.csv
2025-06-07 18:12:08,098 - __main__ - INFO - Anonymization completed for employees.csv
2025-06-07 18:12:08,099 - __main__ - INFO - Processing file: english.txt
2025-06-07 18:12:08,119 - __main__ - INFO - Anonymization completed for english.txt
2025-06-07 18:12:08,119 - __main__ - INFO - Processing file: example.json
2025-06-07 18:12:08,143 - __main__ - INFO - Anonymization completed for example.json
2025-06-07 18:12:08,143 - __main__ - INFO - Processing file: example.xml
2025-06-07 18:12:08,174 - __main__ - INFO - Anonymization completed for example.xml
2025-06-07 18:12:08,176 - __main__ - INFO - Processing file: french.txt
2025-06-07 18:12:08,198 - __main__ - INFO - Anonymization completed for french.txt
2025-06-07 18:12:08,199 - __main__ - INFO - Processing file: german.txt
2025-06-07 18:12:08,222 - __main__ - INFO - Anonymization completed for german.txt
2025-06-07 18:12:08,222 - __main__ - INFO - Processing file: geschaeftsstrategie.txt
2025-06-07 18:12:08,251 - __main__ - INFO - Anonymization completed for geschaeftsstrategie.txt
2025-06-07 18:12:08,251 - __main__ - INFO - Processing file: geschäfte.csv
2025-06-07 18:12:08,281 - __main__ - INFO - Anonymization completed for geschäfte.csv
2025-06-07 18:12:08,281 - __main__ - INFO - Processing file: italian.txt
2025-06-07 18:12:08,310 - __main__ - INFO - Anonymization completed for italian.txt
2025-06-07 18:12:08,311 - __main__ - INFO - Processing file: kunden.csv
2025-06-07 18:12:08,346 - __main__ - INFO - Anonymization completed for kunden.csv
2025-06-07 18:12:08,346 - __main__ - INFO - Processing file: mitarbeiter.csv
2025-06-07 18:12:08,387 - __main__ - INFO - Anonymization completed for mitarbeiter.csv
2025-06-07 18:12:08,387 - __main__ - INFO - Processing file: swiss.txt
2025-06-07 18:12:08,427 - __main__ - INFO - Anonymization completed for swiss.txt
2025-06-07 18:12:08,427 - __main__ - INFO - Processing file: transactions.csv
2025-06-07 18:12:08,470 - __main__ - INFO - Anonymization completed for transactions.csv
2025-06-07 18:12:08,470 - __main__ - INFO - Processing completed!

View file

@ -1,17 +0,0 @@
timestamp,success,file_name,replaced_fields,content_type,headers,row_count
2025-06-07T18:12:08.019661,True,Case.md,,text,,0
2025-06-07T18:12:08.040653,True,customers.csv,ahv_number;phone;credit_card;address;name;iban;email,table,id;name;email;phone;address;iban;credit_card;ahv_number,5
2025-06-07T18:12:08.064201,True,cv_lara_meier.txt,,text,,0
2025-06-07T18:12:08.080961,True,employees.csv,bank_account;first_name;last_name;office_address;phone;uid_number;email,table,employee_id;first_name;last_name;email;phone;department;office_address;uid_number;bank_account,5
2025-06-07T18:12:08.101660,True,english.txt,,text,,0
2025-06-07T18:12:08.125634,True,example.json,,json
2025-06-07T18:12:08.157397,True,example.xml,,xml
2025-06-07T18:12:08.178030,True,french.txt,,text,,0
2025-06-07T18:12:08.201071,True,german.txt,,text,,0
2025-06-07T18:12:08.228652,True,geschaeftsstrategie.txt,,text,,0
2025-06-07T18:12:08.255652,True,geschäfte.csv,datum;kundenname;kundenemail;zahlungsdetails;lieferadresse,table,geschäft_id;datum;kundenname;kundenemail;betrag;zahlungsmethode;zahlungsdetails;lieferadresse,5
2025-06-07T18:12:08.284172,True,italian.txt,,text,,0
2025-06-07T18:12:08.314527,True,kunden.csv,kreditkarte;vorname;adresse;telefon;iban;steuernummer;email;nachname,table,kunden_id;vorname;nachname;email;telefon;adresse;iban;kreditkarte;steuernummer,5
2025-06-07T18:12:08.349750,True,mitarbeiter.csv,vorname;büroadresse;telefon;steuernummer;email;sozialversicherungsnummer;nachname,table,mitarbeiter_id;vorname;nachname;email;telefon;abteilung;büroadresse;steuernummer;sozialversicherungsnummer,5
2025-06-07T18:12:08.389324,True,swiss.txt,,text,,0
2025-06-07T18:12:08.431916,True,transactions.csv,date;customer_email;payment_details;customer_name;shipping_address,table,transaction_id;date;customer_name;customer_email;amount;payment_method;payment_details;shipping_address,5
1 timestamp,success,file_name,replaced_fields,content_type,headers,row_count
2 2025-06-07T18:12:08.019661,True,Case.md,,text,,0
3 2025-06-07T18:12:08.040653,True,customers.csv,ahv_number;phone;credit_card;address;name;iban;email,table,id;name;email;phone;address;iban;credit_card;ahv_number,5
4 2025-06-07T18:12:08.064201,True,cv_lara_meier.txt,,text,,0
5 2025-06-07T18:12:08.080961,True,employees.csv,bank_account;first_name;last_name;office_address;phone;uid_number;email,table,employee_id;first_name;last_name;email;phone;department;office_address;uid_number;bank_account,5
6 2025-06-07T18:12:08.101660,True,english.txt,,text,,0
7 2025-06-07T18:12:08.125634,True,example.json,,json
8 2025-06-07T18:12:08.157397,True,example.xml,,xml
9 2025-06-07T18:12:08.178030,True,french.txt,,text,,0
10 2025-06-07T18:12:08.201071,True,german.txt,,text,,0
11 2025-06-07T18:12:08.228652,True,geschaeftsstrategie.txt,,text,,0
12 2025-06-07T18:12:08.255652,True,geschäfte.csv,datum;kundenname;kundenemail;zahlungsdetails;lieferadresse,table,geschäft_id;datum;kundenname;kundenemail;betrag;zahlungsmethode;zahlungsdetails;lieferadresse,5
13 2025-06-07T18:12:08.284172,True,italian.txt,,text,,0
14 2025-06-07T18:12:08.314527,True,kunden.csv,kreditkarte;vorname;adresse;telefon;iban;steuernummer;email;nachname,table,kunden_id;vorname;nachname;email;telefon;adresse;iban;kreditkarte;steuernummer,5
15 2025-06-07T18:12:08.349750,True,mitarbeiter.csv,vorname;büroadresse;telefon;steuernummer;email;sozialversicherungsnummer;nachname,table,mitarbeiter_id;vorname;nachname;email;telefon;abteilung;büroadresse;steuernummer;sozialversicherungsnummer,5
16 2025-06-07T18:12:08.389324,True,swiss.txt,,text,,0
17 2025-06-07T18:12:08.431916,True,transactions.csv,date;customer_email;payment_details;customer_name;shipping_address,table,transaction_id;date;customer_name;customer_email;amount;payment_method;payment_details;shipping_address,5

File diff suppressed because it is too large Load diff

View file

@ -1,338 +0,0 @@
"""
DSGVO-konformer Daten-Neutralisierer für KI-Agentensysteme
Unterstützt TXT, JSON, CSV, Excel und Word-Dateien
Mehrsprachig: DE, EN, FR, IT
"""
import re
import json
import pandas as pd
from typing import Dict, List, Tuple, Any, Union, Optional
from dataclasses import dataclass
import logging
import traceback
import xml.etree.ElementTree as ET
from io import StringIO
from patterns import Pattern, HeaderPatterns, DataPatterns, get_pattern_for_header, find_patterns_in_text, TextTablePatterns
# Configure logging
logger = logging.getLogger(__name__)
@dataclass
class TableData:
"""Repräsentiert Tabellendaten"""
headers: List[str]
rows: List[List[str]]
source_type: str # 'csv', 'json', 'xml', 'text_table'
@dataclass
class PlainText:
"""Repräsentiert normalen Text"""
content: str
source_type: str # 'txt', 'docx', 'text_plain'
@dataclass
class ProcessResult:
"""Result of content processing"""
data: Any
mapping: Dict[str, str]
replaced_fields: List[str]
processed_info: Dict[str, Any] # Additional processing information
class DataAnonymizer:
"""Hauptklasse für die Datenanonymisierung"""
def __init__(self):
"""Initialize the anonymizer with patterns"""
self.header_patterns = HeaderPatterns.patterns
self.data_patterns = DataPatterns.patterns
self.replaced_fields = set()
self.mapping = {}
self.processing_info = []
def _normalize_whitespace(self, text: str) -> str:
"""Normalize whitespace in text"""
text = re.sub(r'\s+', ' ', text)
text = text.replace('\r\n', '\n').replace('\r', '\n')
return text.strip()
def _is_table_line(self, line: str) -> bool:
"""Check if a line represents a table row"""
return bool(re.match(r'^\s*[^:]+:\s*[^:]+$', line) or
re.match(r'^\s*[^\t]+\t[^\t]+$', line))
def _extract_tables_from_text(self, content: str) -> Tuple[List[TableData], List[PlainText]]:
"""
Extract tables and plain text from content
Args:
content: Content to process
Returns:
Tuple of (list of tables, list of plain text sections)
"""
tables = []
plain_texts = []
# Process the entire content as plain text
plain_texts.append(PlainText(content=content, source_type='text_plain'))
return tables, plain_texts
def _anonymize_table(self, table: TableData) -> TableData:
"""Anonymize table data"""
try:
anonymized_table = TableData(
headers=table.headers.copy(),
rows=[row.copy() for row in table.rows],
source_type=table.source_type
)
for i, header in enumerate(anonymized_table.headers):
pattern = get_pattern_for_header(header, self.header_patterns)
if pattern:
for row in anonymized_table.rows:
if row[i] is not None:
original = str(row[i])
if original not in self.mapping:
self.mapping[original] = pattern.replacement_template.format(len(self.mapping) + 1)
row[i] = self.mapping[original]
return anonymized_table
except Exception as e:
logger.error(f"Error anonymizing table: {str(e)}")
logger.debug(traceback.format_exc())
raise
def _anonymize_plain_text(self, text: PlainText) -> PlainText:
"""Anonymize plain text content"""
try:
# Process the entire text at once instead of line by line
current_text = text.content
# Find all matches in the entire text
matches = find_patterns_in_text(current_text, self.data_patterns)
# Process matches in reverse order to avoid position shifting
for match in sorted(matches, key=lambda x: x[2], reverse=True):
pattern_name, matched_text, start, end = match
# Skip if the matched text is already a placeholder
if re.match(r'\[[A-Z_]+\d+\]', matched_text):
continue
# Find the pattern that matched
pattern = next((p for p in self.data_patterns if p.name == pattern_name), None)
if pattern:
# Use the pattern's replacement template
if matched_text not in self.mapping:
self.mapping[matched_text] = pattern.replacement_template.format(len(self.mapping) + 1)
replacement = self.mapping[matched_text]
if pattern_name == 'email':
print(f"DEBUG: Replacing email '{matched_text}' with '{replacement}'")
print(f"DEBUG: Text after replacement: {current_text[:start] + replacement + current_text[end:]}")
# Replace the matched text while preserving surrounding whitespace
current_text = current_text[:start] + replacement + current_text[end:]
return PlainText(content=current_text, source_type=text.source_type)
except Exception as e:
logger.error(f"Error anonymizing plain text: {str(e)}")
logger.debug(traceback.format_exc())
raise
def _anonymize_json_value(self, value: Any, key: str = None) -> Any:
"""
Recursively anonymize JSON values based on their keys and content
Args:
value: Value to anonymize
key: Key name (if part of a key-value pair)
Returns:
Anonymized value
"""
if isinstance(value, dict):
return {k: self._anonymize_json_value(v, k) for k, v in value.items()}
elif isinstance(value, list):
return [self._anonymize_json_value(item) for item in value]
elif isinstance(value, str):
# Check if this is a key we should process
if key:
pattern = get_pattern_for_header(key, self.header_patterns)
if pattern:
if value not in self.mapping:
self.mapping[value] = pattern.replacement_template.format(len(self.mapping) + 1)
return self.mapping[value]
# Check if the value itself matches any patterns
matches = find_patterns_in_text(value, self.data_patterns)
if matches:
# Use the first match's pattern
pattern_name = matches[0][0]
if value not in self.mapping:
self.mapping[value] = f"{pattern_name.upper()}_{len(self.mapping) + 1}"
return self.mapping[value]
return value
else:
return value
def _anonymize_xml_element(self, element: ET.Element, indent: str = '') -> str:
"""
Recursively process XML element and return formatted string
Args:
element: XML element to process
indent: Current indentation level
Returns:
Formatted XML string
"""
# Process attributes
processed_attrs = {}
for attr_name, attr_value in element.attrib.items():
# Check if attribute name matches any header patterns
pattern = get_pattern_for_header(attr_name, self.header_patterns)
if pattern:
if attr_value not in self.mapping:
self.mapping[attr_value] = pattern.replacement_template.format(len(self.mapping) + 1)
processed_attrs[attr_name] = self.mapping[attr_value]
else:
# Check if attribute value matches any data patterns
matches = find_patterns_in_text(attr_value, self.data_patterns)
if matches:
pattern_name = matches[0][0]
pattern = next((p for p in self.data_patterns if p.name == pattern_name), None)
if pattern:
if attr_value not in self.mapping:
self.mapping[attr_value] = pattern.replacement_template.format(len(self.mapping) + 1)
processed_attrs[attr_name] = self.mapping[attr_value]
else:
processed_attrs[attr_name] = attr_value
else:
processed_attrs[attr_name] = attr_value
attrs = ' '.join(f'{k}="{v}"' for k, v in processed_attrs.items())
attrs = f' {attrs}' if attrs else ''
# Process text content
text = element.text.strip() if element.text and element.text.strip() else ''
if text:
# Check if text matches any patterns
matches = find_patterns_in_text(text, self.data_patterns)
if matches:
pattern_name = matches[0][0]
pattern = next((p for p in self.data_patterns if p.name == pattern_name), None)
if pattern:
if text not in self.mapping:
self.mapping[text] = pattern.replacement_template.format(len(self.mapping) + 1)
text = self.mapping[text]
# Process child elements
children = []
for child in element:
child_str = self._anonymize_xml_element(child, indent + ' ')
children.append(child_str)
# Build element string
if not children and not text:
return f"{indent}<{element.tag}{attrs}/>"
elif not children:
return f"{indent}<{element.tag}{attrs}>{text}</{element.tag}>"
else:
result = [f"{indent}<{element.tag}{attrs}>"]
if text:
result.append(f"{indent} {text}")
result.extend(children)
result.append(f"{indent}</{element.tag}>")
return '\n'.join(result)
def process_content(self, content: str, content_type: str) -> ProcessResult:
"""
Process content and return anonymized data
Args:
content: Content to process
content_type: Type of content ('csv', 'json', 'xml', 'text')
Returns:
ProcessResult: Contains anonymized data, mapping, replaced fields and processing info
"""
try:
replaced_fields = []
processed_info = {}
if content_type in ['csv', 'json', 'xml']:
# Handle as table
if content_type == 'csv':
df = pd.read_csv(StringIO(content), encoding='utf-8')
table = TableData(
headers=df.columns.tolist(),
rows=df.values.tolist(),
source_type='csv'
)
processed_info['type'] = 'table'
processed_info['headers'] = table.headers
processed_info['row_count'] = len(table.rows)
elif content_type == 'json':
data = json.loads(content)
# Process JSON recursively
result = self._anonymize_json_value(data)
processed_info['type'] = 'json'
return ProcessResult(result, self.mapping, replaced_fields, processed_info)
else: # xml
root = ET.fromstring(content)
# Process XML recursively with proper formatting
result = self._anonymize_xml_element(root)
processed_info['type'] = 'xml'
return ProcessResult(result, self.mapping, replaced_fields, processed_info)
if not table.rows:
return ProcessResult(None, self.mapping, [], processed_info)
anonymized_table = self._anonymize_table(table)
# Track replaced fields
for i, header in enumerate(anonymized_table.headers):
for orig_row, anon_row in zip(table.rows, anonymized_table.rows):
if anon_row[i] != orig_row[i]:
replaced_fields.append(header)
# Convert back to original format
if content_type == 'csv':
result = pd.DataFrame(anonymized_table.rows, columns=anonymized_table.headers)
elif content_type == 'json':
if len(anonymized_table.headers) == 1 and anonymized_table.headers[0] == 'value':
result = anonymized_table.rows[0][0]
else:
result = dict(zip(anonymized_table.headers, anonymized_table.rows[0]))
else: # xml
result = ET.tostring(root, encoding='unicode')
return ProcessResult(result, self.mapping, replaced_fields, processed_info)
else:
# Handle as text
# First, identify what needs to be replaced using table detection
tables, plain_texts = self._extract_tables_from_text(content)
processed_info['type'] = 'text'
processed_info['tables'] = [{'headers': t.headers, 'row_count': len(t.rows)} for t in tables]
# Process plain text sections
anonymized_texts = [self._anonymize_plain_text(text) for text in plain_texts]
# Combine all processed content
result = content
for text, anonymized_text in zip(plain_texts, anonymized_texts):
if text.content != anonymized_text.content:
result = result.replace(text.content, anonymized_text.content)
return ProcessResult(result, self.mapping, replaced_fields, processed_info)
except Exception as e:
logger.error(f"Error processing content: {str(e)}")
logger.debug(traceback.format_exc())
return ProcessResult(None, self.mapping, [], {'type': 'error', 'error': str(e)})

View file

@ -1,608 +0,0 @@
# Bewertung der PowerOn AI Platform
Basierend auf dem nachstehenden Q&A ergibt sich nachfolgende Bewertung des Softwareprodukts "PowerOn AI Platform".
## Aktueller Wert per Juni 2025
1. **Technischer Wert des Codes**:
- Professionelle, modulare Codebasis (~50.000-60.000 LOC)
- Moderne Architektur mit innovativen Komponenten
- 5 Personenmonate Entwicklung x CHF 15.000/PM = CHF 75.000
- Zusätzlicher Wert durch Enterprise-Ready Architektur: CHF 50.000
2. **Bisherige Investitionen**:
- Hardware/Software: CHF 20.000
- Expertise-Premium (30+ Jahre Erfahrung): CHF 25.000
3. **IP und Innovationswert**:
- Multi-Agent Workflow-System
- Modulare Architecture mit Alleinstellungsmerkmalen
- Geschätzter Wert: CHF 100.000
4. **Marktpotenzial-Faktor**:
- Adressierbares Marktvolumen von CHF 500-700 Mio.
- Wachstumsmarkt (25-30% jährlich)
- Frühphasen-Multiplikator: 2x
**Aktueller Gesamtwert (Juni 2025)**: **CHF 500.000**
## Prognostizierte Wertentwicklung
### Ende 2025
- Abschluss der technischen Entwicklung
- Erste Pilotprojekte mit 3-5 Referenzkunden
- Validierung des Produkts am Markt
- **Geschätzter Wert Ende 2025**: **CHF 1,2 Millionen**
(Steigerung durch Marktvalidierung und Risikoreduktion)
### Ende 2026
- 20-30 Kunden
- ARR: CHF 0,5-0,8 Mio.
- Etablierung im DACH-Markt
- **Geschätzter Wert Ende 2026**: **CHF 4-5 Millionen**
(Bewertungsmultiplikator von 6-8x ARR für wachstumsstarke SaaS)
### Ende 2027
- 70-90 Kunden
- ARR: CHF 2-2,5 Mio.
- Erweiterung der Produktpalette
- **Geschätzter Wert Ende 2027**: **CHF 12-15 Millionen**
(Bewertungsmultiplikator von 6x ARR)
### Ende 2028
- 150+ Kunden
- ARR: CHF 4,5 Mio.
- Internationale Expansion
- **Geschätzter Wert Ende 2028**: **CHF 25-30 Millionen**
(Bewertungsmultiplikator von 5,5-6,5x ARR für etablierte SaaS)
## Schlüsselfaktoren und Risikobeurteilung für die Wertentwicklung
1. **Erfolgreiche Markteinführung**: Der Übergang von Entwicklung zu erfolgreicher Pilotphase ist kritisch für die Wertentwicklung 2025-2026.
2. **Skalierung des Vertriebs**: Die Fähigkeit, die Kundenakquisition gemäss der Prognose zu skalieren, ist entscheidend für die 2026-[ADDRESS_2].
3. **Kapitaleffizienz**: Die effiziente Nutzung des Kapitals (CHF 750.000-1.050.000) für die nächste Entwicklungsphase wird die Bewertung massgeblich beeinflussen.
4. **Marktdynamik**: Die Entwicklung des KI-Marktes und regulatorische Änderungen können sowohl positive als auch negative Auswirkungen haben.
Diese Bewertung basiert auf der Annahme, dass die Meilensteine wie geplant erreicht werden und keine signifikanten externen Faktoren die Marktentwicklung negativ beeinflussen.
# Kriterienkatalog zur Softwarebewertung
## Teil 1: Technische Bewertung (Code-basiert)
1. Wie umfangreich ist die Codebasis (LOC, Module, Komponenten)?
2. Welche Programmiersprachen und Frameworks wurden verwendet?
3. Wie hoch ist die Codequalität und -konsistenz (saubere Architektur, Dokumentation, Tests)?
4. Gibt es innovative Algorithmen oder patentierbare technische Lösungen?
5. Wie modular und wartbar ist die Software gestaltet?
6. Wie robust ist die Fehlerbehandlung und Sicherheitsarchitektur?
7. Wie skalierbar ist die technische Infrastruktur?
8. Gibt es technische Schulden, die zukünftige Entwicklungen behindern könnten?
### 1. Umfang der Codebasis
- **Frontend**: Modulare JavaScript-Struktur mit ca. 15 Hauptmodulen
- **Backend**: Python/FastAPI mit ca. 15 Hauptmodulen
- **Hauptkomponenten**:
- Frontend: Workflow, UI, Koordination, Datenmanagement
- Backend: Gateway, Agent Service, Connectors, Workflow Manager
- **Geschätzte LOC**: ~50,000-60,000 Zeilen Code
### 2. Programmiersprachen und Frameworks
- **Frontend**:
- JavaScript (ES6+)
- Modulares System mit ES6-Import/Export
- Vanilla JS ohne externe Frameworks
- **Backend**:
- Python 3.x
- FastAPI für REST-API
- Asyncio für asynchrone Verarbeitung
### 3. Codequalität und -konsistenz
- **Saubere Architektur**:
- Klare Trennung Frontend/Backend
- Modulare Struktur mit definierten Verantwortlichkeiten
- State Machine Pattern für Workflow-Management
- **Dokumentation**:
- Ausführliche JSDoc/Python-Docstrings
- Architekturdiagramme (Mermaid)
- Technische Spezifikationen
- **Tests**:
- Automatisierte Modultests
- Manuell Integrationstests
- Benutzertests über Tickets in Clickup
### 4. Innovative Algorithmen/patentierbare Lösungen
- Multi-Agent Workflow-System mit spezialisierten Agenten
- Modulares Agent-Registry-System
- State Machine für Workflow-Koordination
- Dynamische Agenten-Integration
### 5. Modularität und Wartbarkeit
- **Hohe Modularität**:
- Klare Trennung der Verantwortlichkeiten
- Plug-and-Play Agent-System
- Erweiterbare Connector-Architektur
- **Wartbarkeit**:
- Konsistente Codestruktur
- Klare Namenskonventionen
- Dokumentierte Schnittstellen
### 6. Fehlerbehandlung und Sicherheit
- **Robuste Fehlerbehandlung**:
- State Machine für Workflow-Status
- Exception Handling auf allen Ebenen
- Logging-System für Debugging
- **Sicherheitsarchitektur**:
- Multi-Tenant-Architektur
- Authentifizierung/Autorisierung
- Mandantenverwaltung
### 7. Skalierbarkeit
- **Horizontale Skalierbarkeit**:
- Modulare Architektur
- Asynchrone Verarbeitung
- Connector-System für externe Dienste
- **Vertikale Skalierbarkeit**:
- Workflow-Parallelisierung
- Agent-Pooling
- Caching-Mechanismen
### 8. Technische Schulden
- **Potenzielle Verbesserungsbereiche**:
- Test-Coverage nicht sichtbar
- Eventuell fehlende Performance-Optimierungen
- Dokumentation für Zielgruppen noch unvollständig
- **Keine kritischen Blockierer identifiziert**
### Fazit der technischen Bewertung
Die Codebasis zeigt eine professionelle, gut strukturierte Enterprise-Anwendung mit klarer Architektur und modernen Best Practices. Die modulare Struktur und die saubere Implementierung der State Machine für Workflow-Management sind besonders hervorzuheben. Die Anwendung ist technisch reif und zeigt ein hohes Mass an Professionalität in der Implementierung.
## Teil 2: Bewertung der bisherigen Aufwände
### 1. Entwicklungsaufwände
- **Patrick**:
- ValueOn AG: 80 Stunden
- Private Entwicklung: 650 Stunden
- **Gesamt**: 730 Stunden (ca. 4.5 Personenmonate)
- **Ida**:
- ValueOn AG: 60 Stunden
- **Gesamt**: 60 Stunden (ca. 0.4 Personenmonate)
- **Gesamtaufwand**: ~5 Personenmonate
### 2. Qualifikationen und Erfahrungslevel
- **Patrick**:
- Business Consultant
- Software Architect
- Full Stack Developer
- 30+ Jahre Berufserfahrung
- Experte für Enterprise-Architekturen
- **Ida**:
- Business Analyst
- Project Manager
- Scrum Master
- Erfahrung in agiler Entwicklung
- Expertise in Prozessoptimierung
### 3. Spezifische Fachkenntnisse
- **Patrick**:
- Umfassende Markt- und Business-Erfahrung (30 Jahre)
- Expertise in Software-Architektur
- Full Stack Entwicklung
- Azure Cloud-Integration
- KI/ML Integration
- Enterprise-Systeme
- **Ida**:
- Projektmanagement
- Agile Methoden
- Business Analysis
- Prozessoptimierung
- Qualitätssicherung
### 4. Finanzielle Investitionen
- **Hardware**: CHF 10,000
- Entwicklungsserver
- Testumgebungen
- Entwicklungshardware
- **Software & Lizenzen**: CHF 10,000
- Entwicklungstools
- Cloud-Services
- KI-API-Zugänge
- **Gesamt**: CHF 20,000
### 5. Externe Dienstleister
- **Aktueller Status**: Keine externen Dienstleister
- **Vorteile**:
- Volle Kontrolle über Entwicklung
- Tiefes Verständnis der Architektur
- Schnelle Entscheidungswege
- Kosteneffizienz
### 6. Schlüsselkomponenten-Entwicklung
- **Patrick**:
- Frontend-Architektur
- Backend-System
- Workflow-Engine
- Agent-System
- Connector-Framework
- Datenmanagement
- Sicherheitsarchitektur
- **Verantwortlichkeiten**:
- Systemarchitektur
- Technische Leitung
- Code-Review
- Qualitätssicherung
### 7. Nicht-monetäre Ressourcen
- **Dominic**:
- Umfangreiches Sales & Marketing Netzwerk
- Marktzugang
- Branchenkontakte
- **ValueOn AG**:
- Infrastruktur
- Rechtlicher Rahmen
- Geschäftsprozesse
- **Netzwerke**:
- Technologie-Partner
- Potenzielle Kunden
- Branchenexperten
### 8. Finanzielle Risiken
- **ValueOn AG**:
- Bereitstellung von Infrastruktur
- Personelle Ressourcen
- Rechtlicher Rahmen
- **Private Investitionen**:
- Entwicklungszeit
- Hardware/Software
- Cloud-Services
### Fazit bisherige Aufwände
Die bisherigen Aufwände zeigen ein ausgewogenes Verhältnis zwischen technischer Expertise und Business-Know-how. Die private Investition von 730 Stunden durch Patrick demonstriert ein hohes Engagement und tiefes Verständnis der Technologie. Die Kombination aus technischer Expertise, Business-Erfahrung und Marktzugang bildet eine solide Grundlage für die weitere Entwicklung. Die bisherigen Investitionen sind effizient eingesetzt worden, mit Fokus auf kritische Kernkomponenten und skalierbare Architektur.
## Teil 3: Markt- und Geschäftspotenzial
### 1. Adressierbarer Gesamtmarkt und Wachstumspotenzial
- **Gesamtmarktvolumen 2025**:
- KI-Markt: $190 Mrd.
- Business Process Automation: $19,6 Mrd.
- Enterprise Knowledge Management: $43 Mrd.
- **Adressierbarer Markt (SAM)**:
- Initial: Mittlerer Markt in DACH (Professional Services, Finanzdienstleistungen, Gesundheitswesen)
- Geschätztes SAM: CHF 500-700 Mio.
- **Wachstumspotenzial**:
- Jährliches Marktwachstum: 25-30%
- Erweiterung auf internationale Märkte
- Branchenspezifische Lösungen
### 2. Alleinstellungsmerkmale
1. **Technologische Vorteile**:
- Proprietäre Multi-Agent-Technologie
- Modellunabhängige KI-Integration
- Enterprise-Ready Architektur
- Fortschrittliche Workflow-Orchestrierung
2. **Funktionale Vorteile**:
- Nahtlose Integration verschiedener KI-Modelle
- Robuste Fehlerbehandlung
- Skalierbare Multi-Tenant-Architektur
- Umfassende Enterprise-Features
### 3. Kunden und Pilotprojekte
- **Aktueller Status**:
- In Entwicklung
- Erste Referenzkunden in Planung
- Fokus auf mittelständische Unternehmen
- **Pilotphase**:
- Geplant für Q3/Q4 2025
- 3-5 Schlüsselreferenzkunden
- Branchenspezifische Templates
### 4. Geschäftsmodell
- **Hauptmodell**: SaaS (Software as a Service)
- **Preismodell**:
- Basis: Pro-Benutzer/Monat Abonnement
- Zusätzlich: Nutzungsbasierte Abrechnung
- Enterprise-Lizenzen für grössere Kunden
- **Erwartete Margen**: 75-85% nach Skalierung
### 5. Preisgestaltung
- **Wettbewerbsvergleich**:
- Unterhalb Enterprise-Lösungen
- Über Standard-BPA-Tools
- Flexiblere Preisgestaltung als Konkurrenz
- **Preisstruktur**:
- Basis-Abonnement: CHF 50-100 pro Benutzer/Monat
- Nutzungsbasierte Komponente: CHF 0.10-0.50 pro Verarbeitungseinheit
- Enterprise-Pakete: Individuelle Preisgestaltung
### 6. Umsatzpotenziale
- **Jahr 1 (2026)**:
- Ziel: 20-30 Kunden
- Erwartetes ARR: CHF 0.5-0.8 Mio.
- **Jahr 2 (2027)**:
- Ziel: 70-90 Kunden
- Erwartetes ARR: CHF 2-2.5 Mio.
- **Jahr 3 (2028)**:
- Ziel: 150+ Kunden
- Erwartetes ARR: CHF 4.5 Mio.
### 7. Akquisitionskosten
- **Customer Acquisition Cost (CAC)**:
- Erwarteter CAC: CHF 15,000-20,000
- Payback-Zeit: 12-18 Monate
- **Kostenstruktur**:
- 30% Vertrieb und Marketing
- Fokus auf effiziente Akquisition
- Skaleneffekte ab 50+ Kunden
### 8. Regulatorische Herausforderungen
- **Datenschutz**:
- DSGVO-Konformität
- Datensicherheit
- Mandantentrennung
- **KI-Regulierung**:
- EU AI Act
- Transparenzpflichten
- Qualitätssicherung
- **Branchenspezifische Regulierung**:
- Finanzdienstleistungen
- Gesundheitswesen
- Professional Services
### Fazit Markt- und Geschäftspotenzial
Die PowerOn AI Platform adressiert einen wachsenden Markt mit klaren Alleinstellungsmerkmalen. Das Geschäftsmodell ist skalierbar und die Preisgestaltung wettbewerbsfähig. Die regulatorischen Herausforderungen sind bekannt und adressierbar. Die Umsatzprognosen sind konservativ kalkuliert und basieren auf realistischen Marktannahmen.
## Teil 4: Skalierungs- und Zukunftspotenzial
### 1. Ressourcen für Support und Weiterentwicklung
- **Entwicklungsteam**:
- 2-3 Full-Stack Entwickler, KI-unterstützte Entwicklung
- 1 DevOps Engineer
- 1 QA Engineer
- **Support-Team**:
- 1-2 Support Engineers
- 1 Technical Account Manager
- **Infrastruktur**:
- Cloud-basierte Skalierung (Azure)
- Automatisierte Deployment-Pipeline
- Monitoring und Logging-Systeme
### 2. Skalierbarkeit
- **Technische Skalierbarkeit**:
- Horizontale Skalierung durch Multi-Tenant-Architektur
- Vertikale Skalierung durch Agent-Pooling
- Automatische Lastverteilung
- **Skalierungszeitrahmen**:
- 2x Nutzer: Sofort möglich
- 5x Nutzer: 1-2 Monate Vorbereitung
- 10x Nutzer: 3-4 Monate mit Infrastruktur-Erweiterung
### 3. Kapitalbedarf
- **Nächste Entwicklungsphase (12 Monate)**:
- Entwicklung: CHF 400,000-500,000
- Marketing & Sales: CHF 100,000-200,000
- Infrastruktur: CHF 50,000-100,000
- Betrieb & Support: CHF 100,000-150,000
- **Gesamt**: CHF 750,000-1,050,000
### 4. Schlüsselpersonen
- **Technische Leitung**:
- Patrick (Software Architect, Full Stack Developer)
- Verantwortlich für: Architektur, Entwicklung, Technische Strategie
- **Business & Operations**:
- Ida (Business Analyst, Project Manager)
- Verantwortlich für: Projektmanagement, Business Analysis
- **Sales & Marketing**:
- Dominic (Sales & Marketing)
- Verantwortlich für: Marktentwicklung, Kundenakquisition
### 5. Exit-Strategien
- **Strategische Übernahme**:
- Enterprise Software Anbieter
- KI/ML Plattform Betreiber
- Business Process Automation Unternehmen
- **IPO-Potenzial**:
- Ab CHF 50 Mio. ARR
- Zeitrahmen: 5-7 Jahre
- **Extraktion aus ValueOn AG**:
- Vergütung der Aufwände
- Anrechnung des Mehrwerts für Schlüsselpersonen
- Beschaffung des notwendigen Kapitals
### 6. Strategische Partnerschaften
- **Technologie-Partner**:
- KI-Provider (OpenAI, Anthropic)
- Cloud-Provider (Azure)
- Enterprise Software Anbieter
- **Vertriebspartner**:
- Systemhäuser
- Beratungsunternehmen
- Branchenspezialisten
- **Forschungspartner**:
- Universitäten
- Forschungsinstitute
- KI-Labore
### 7. Geplante Erweiterungen
- **Kurzfristig (12 Monate)**:
- Erweiterte Agent-Typen
- Branchenspezifische Templates
- API-Erweiterungen
- **Mittelfristig (24 Monate)**:
- Agentenmarktplatz
- Proprietäre KI-Modelle
- Erweiterte Analytics
- **Langfristig (36+ Monate)**:
- KI-Middleware für Unternehmen
- Branchenlösungen
- Internationale Expansion
### 8. Langfristige Vision
- **Technologische Vision**:
- Führende Multi-Agent KI-Plattform
- Standard für Enterprise Workflow Automation
- Innovationstreiber in der KI-Integration
- **Marktvision**:
- Globaler Marktführer in Nischenbereichen
- Branchenstandard für bestimmte Anwendungsfälle
- Referenz für KI-gestützte Prozessoptimierung
- **Geschäftsvision**:
- Nachhaltiges Wachstum
- Profitables Geschäftsmodell
- Führende Position in ausgewählten Märkten
### Fazit Skalierungs- und Zukunftspotenzial
Die PowerOn AI Platform verfügt über ein solides Skalierungspotenzial sowohl technisch als auch geschäftlich. Die modulare Architektur ermöglicht schnelles Wachstum, während die klare Vision und die strategischen Partnerschaften den langfristigen Erfolg unterstützen. Die Kapitalanforderungen sind realistisch kalkuliert und die Exit-Strategien bieten verschiedene Optionen für die Zukunft.
# Exitplan: PowerOn AI Platform als eigenständige AG
## Bewertung und Ausgangssituation
**Aktueller Wert (Juni 2025)**: CHF 500.000
**Angepasster Gründungswert**: CHF 800.000 (berücksichtigt den strategischen Wert der Produktvision, welche bereits als innerer Wert im Produkt enthalten ist)
## Strukturierung der PowerOn AG
### 1. Aktienstruktur bei Gründung
**Gesamtes Aktienkapital**: 1.000.000 Aktien (Nennwert CHF 0,10)
**Firmenvaluation bei Gründung**: CHF 800.000
#### Verteilung der initialen Aktien:
- **Patrick**:
- Eingebrachte Leistung: Entwicklung, technische Expertise und essenzielles Gesamtkonzept
- **Aktienanteil**: 35% (350.000 Aktien)
- **Dominic**:
- Eingebrachte Leistung: Netzwerk, Sales & Marketing Expertise und Vision
- **Aktienanteil**: 15% (150.000 Aktien)
- **ValueOn AG**:
- Eingebrachte Leistung: Infrastruktur, rechtlicher Rahmen, Arbeitszeit, Übertragung von IP
- **Aktienanteil**: 25% (250.000 Aktien)
- **Reservierter Anteil für Mitarbeiter-Pool**:
- **Aktienanteil**: 10% (100.000 Aktien)
- **Reserviert für Investoren (erste Runde)**:
- **Aktienanteil**: 15% (150.000 Aktien)
### 2. Kapitalbedarfsplanung (18 Monate)
| Kategorie | Betrag (CHF) |
|-----------|--------------|
| Entwicklung | 550.000 |
| Marketing & Sales | 250.000 |
| Infrastruktur | 100.000 |
| Betrieb & Support | 200.000 |
| **Gesamtbedarf** | **1.100.000** |
**Kapitalbeschaffungsstrategie**:
- **Erste Finanzierungsrunde**: CHF 1.000.000 (für 18 Monate)
- **Sicherheitspuffer**: CHF 100.000 (aus Umsätzen/zukünftigen Einnahmen)
### 3. Investitionskonditionen
**Pre-Money Bewertung**: CHF 800.000
**Investitionsvolumen**: CHF 1.000.000
**Post-Money Bewertung**: CHF 1.800.000
**Aktienkurs für Investoren**:
- 150.000 bestehende Aktien + 214.285 neue Aktien = 364.285 Aktien für Investoren
- **Aktienkurs**: CHF 2,75 pro Aktie
**Aktienstruktur nach Investment**:
- Patrick: 35% → 28,9% (350.000 Aktien)
- Dominic: 15% → 12,4% (150.000 Aktien)
- ValueOn AG: 25% → 20,7% (250.000 Aktien)
- Mitarbeiter-Pool: 10% → 8,3% (100.000 Aktien)
- Investoren: 29,7% (364.285 Aktien)
## Governance und Organisation
### 1. Schlüsselpositionen in der Organisation
- **CEO**: Gesamtführung des Unternehmens
- **CTO**: Verantwortlich für technische Strategie und Produktentwicklung
- **CSO/Vertriebsleitung**: Verantwortlich für Vertrieb und Marktentwicklung
- **COO**: Operative Leitung und Geschäftsprozesse
Die Besetzung dieser Positionen wird unter Berücksichtigung der Kompetenzen von Patrick, Dominic und möglichen neuen Führungskräften festgelegt. Die Rollen von CEO und COO werden im Rahmen der Unternehmensgründung evaluiert.
### 2. Vergütungsstruktur
- **Führungsebene**: Marktübliche Vergütung zwischen CHF 150.[PHONE_1]ahr je nach Position
- **Aktienoptionen**: Zusätzliche Aktienoptionen bei Erreichen definierter Unternehmensziele
## Meilensteine und Finanzielle Ziele
### Kritische Meilensteine (18 Monate)
| Zeitpunkt | Meilenstein | KPI |
|-----------|-------------|-----|
| Q3 2025 | Ausgründung & Finanzierung | Abschluss der Seed-Runde |
| Q4 2025 | Markteinführung | 3-5 Pilotprojekte |
| Q1 2026 | Produktvalidierung | 10+ zahlende Kunden |
| Q2 2026 | Skalierung | 15+ zahlende Kunden |
| Q4 2026 | Vorbereitung Serie A | 25+ Kunden, ARR: CHF 0,8 Mio. |
### Umsatz- und Bewertungsprognose
| Jahr | Kunden | ARR (CHF) | Valuation (CHF) | Multiplikator |
|------|--------|-----------|-----------------|---------------|
| Ende 2025 | 5-8 | 0,2 Mio. | 1,8 Mio. | 9x ARR |
| Ende 2026 | 25-30 | 0,8 Mio. | 5,6 Mio. | 7x ARR |
| Ende 2027 | 80-90 | 2,5 Mio. | 15 Mio. | 6x ARR |
| Ende 2028 | 150+ | 4,5 Mio. | 27 Mio. | 6x ARR |
## Liquiditätsoptionen
### Mittelfristige Optionen (2-3 Jahre)
1. **Serie A Finanzierung** (Ende 2026):
- Teilweise Liquidität für Gründer und ValueOn AG (10-15% ihrer Anteile)
- Zu erwartender Wert: CHF 5-6 Mio.
2. **Strategische Partnerschaft**:
- Investment durch strategischen Partner mit teilweisem Aktienrückkauf
- Potenzielle Partner: Enterprise Software-Anbieter, KI-Plattform-Betreiber
### Langfristige Optionen (4-7 Jahre)
1. **Komplette Übernahme**:
- Erwarteter Exit-Wert 2028: CHF 25-30 Mio.
- Vollständige Liquidität für alle Anteilseigner
2. **IPO-Vorbereitung**:
- Bei Erreichen von CHF 10+ Mio. ARR
- Potenzielle Bewertung: CHF 50-70 Mio.
## Nächste Schritte im Ausgründungsprozess
1. **Rechtliche Strukturierung**:
- Gründung der PowerOn AG
- Übertragungsvereinbarungen für geistiges Eigentum
- Aktionärsvereinbarungen
2. **Finanzierung**:
- Erstellung eines detaillierten Businessplans
- Vorbereitung des Investor Pitch Decks
- Ansprache potenzieller Investoren
3. **Organisationsaufbau**:
- Definition der Führungsstruktur und Schlüsselpositionen
- Rekrutierung des Kernteams
- Aufbau der operativen Prozesse
4. **Markteinführungsstrategie**:
- Festlegung der Go-to-Market Strategie
- Identifikation von Pilotprojekten
- Vorbereitung der Vertriebsunterlagen

View file

@ -1,6 +0,0 @@
id,name,email,phone,address,iban,credit_card,ahv_number
1,[NAME_3],[EMAIL_8],[PHONE_13],[ADDRESS_18],[IBAN_23],[IBAN_28],[SSN_33]
2,[NAME_4],[EMAIL_9],[PHONE_14],[ADDRESS_19],[IBAN_24],[IBAN_29],[SSN_34]
3,[NAME_5],[EMAIL_10],[PHONE_15],[ADDRESS_20],[IBAN_25],[IBAN_30],[SSN_33]
4,[NAME_6],[EMAIL_11],[PHONE_16],[ADDRESS_21],[IBAN_26],[IBAN_31],[SSN_33]
5,[NAME_7],[EMAIL_12],[PHONE_17],[ADDRESS_22],[IBAN_27],[IBAN_32],[SSN_35]
1 id name email phone address iban credit_card ahv_number
2 1 [NAME_3] [EMAIL_8] [PHONE_13] [ADDRESS_18] [IBAN_23] [IBAN_28] [SSN_33]
3 2 [NAME_4] [EMAIL_9] [PHONE_14] [ADDRESS_19] [IBAN_24] [IBAN_29] [SSN_34]
4 3 [NAME_5] [EMAIL_10] [PHONE_15] [ADDRESS_20] [IBAN_25] [IBAN_30] [SSN_33]
5 4 [NAME_6] [EMAIL_11] [PHONE_16] [ADDRESS_21] [IBAN_26] [IBAN_31] [SSN_33]
6 5 [NAME_7] [EMAIL_12] [PHONE_17] [ADDRESS_22] [IBAN_27] [IBAN_32] [SSN_35]

View file

@ -1,69 +0,0 @@
Lebenslauf: Lara Meier
Persönliche Daten:
Name: Lara Meier
Geboren: 15.03.[ADDRESS_55]: [ADDRESS_54], [ADDRESS_53]
Telefon: [PHONE_40] 67
E-Mail: [EMAIL_52]
AHV-Nr.: [SSN_34]
Steuernummer: [SSN_48]
Berufserfahrung:
2020-2023: Senior Projektmanagerin
Firma: TechSolutions AG
Adresse: [ADDRESS_51], [ADDRESS_50]
UID: [SSN_49]lefon: [PHONE_37] 43
E-Mail: [EMAIL_47]
In dieser Position leitete ich ein Team von 15 Mitarbeitern und verantwortete die Implementierung von Cloud-Lösungen für internationale Kunden. Meine Hauptaufgaben umfassten:
- Projektplanung und -steuerung mit einem Budget von CHF 2.5 Mio.
- Kundenbetreuung und Stakeholder-Management
- Teamführung und Personalentwicklung
- Qualitätssicherung und Risikomanagement
2015-2020: Projektmanagerin
Firma: Digital Systems GmbH
Adresse: [ADDRESS_46], [ADDRESS_45]
UID: [SSN_44]lefon: [PHONE_42] 90
E-Mail: [EMAIL_41]
Als Projektmanagerin verantwortete ich die erfolgreiche Durchführung von Digitalisierungsprojekten. Meine Leistungen:
- Implementierung von ERP-Systemen
- Optimierung von Geschäftsprozessen
- Schulung von Endbenutzern
- Erstellung von Projektdokumentation
Ausbildung:
2010-2015: ETH Zürich
Studiengang: Informatik
Matrikelnummer: 12-345-678
Abschluss: Master of Science in Computer Science
Thesis: "Künstliche Intelligenz in der Prozessautomatisierung"
2005-2010: Kantonsschule Zürich
Abschluss: Eidgenössische Maturität
Schwerpunkt: Mathematik und Naturwissenschaften
Sprachen:
Deutsch (Muttersprache)
Englisch (C2)
Französisch (B2)
Italienisch (B1)
Zertifizierungen:
PMP (Project Management Professional)
ITIL v4 Foundation
AWS Certified Solutions Architect
Scrum Master (PSM I)
Referenzen:
Prof. Dr. Hans Müller
ETH Zürich
Department of Computer Science
Telefon: [PHONE_40] 68
E-Mail: [EMAIL_39]
[NAME_38] AG
CTO
Telefon: [PHONE_37] 44
E-Mail: [EMAIL_36]

View file

@ -1,20 +0,0 @@
employee_id,first_name,last_name,email,phone,department,office_address,uid_number,bank_account
E001,[NAME_56],[NAME_61],[EMAIL_66],[PHONE_71],IT,[ADDRESS_76],,[IBAN_23]
E002,[NAME_57],[NAME_62],[EMAIL_67],[PHONE_72],HR,[ADDRESS_77],CHE-123.456.789,[IBAN_81]
E003,[NAME_58],[NAME_63],[EMAIL_68],[PHONE_73],Finance,[ADDRESS_78],,[IBAN_25]
E004,[NAME_59],[NAME_64],[EMAIL_69],[PHONE_74],Marketing,[ADDRESS_79],,[IBAN_26]
E005,[NAME_60],[NAME_65],[EMAIL_70],[PHONE_75],Sales,[ADDRESS_80],,[IBAN_82]
[REINTEGRATE]
The employee database has 9 attributes,
uid_number and bank_account is not defined for all records.
1 employee_id,first_name,last_name,email,phone,department,office_address,uid_number,bank_account
2 E001,[NAME_56],[NAME_61],[EMAIL_66],[PHONE_71],IT,[ADDRESS_76],,[IBAN_23]
3 E002,[NAME_57],[NAME_62],[EMAIL_67],[PHONE_72],HR,[ADDRESS_77],CHE-123.456.789,[IBAN_81]
4 E003,[NAME_58],[NAME_63],[EMAIL_68],[PHONE_73],Finance,[ADDRESS_78],,[IBAN_25]
5 E004,[NAME_59],[NAME_64],[EMAIL_69],[PHONE_74],Marketing,[ADDRESS_79],,[IBAN_26]
6 E005,[NAME_60],[NAME_65],[EMAIL_70],[PHONE_75],Sales,[ADDRESS_80],,[IBAN_82]
7 [REINTEGRATE]
8 The employee database has 9 attributes,
9 uid_number and bank_account is not defined for all records.

View file

@ -1,9 +0,0 @@
Dear Mr. Smith,
Thank you for your email to [EMAIL_85].
Your contact details have been recorded:
Phone: [PHONE_17]RESS_84]: 123 High Street, London SW1A 1AA
Your IBAN: GB29 NWBK 6016 1331 9268 19
Credit Card: 4532 1234 5678 [ADDRESS_83] regards,
John Doe

View file

@ -1,54 +0,0 @@
{
"customer": {
"personal_info": {
"name": "[NAME_3]",
"email": "[EMAIL_86]",
"phone": "[PHONE_87]",
"address": {
"street": "Hauptstra\u00dfe 123",
"city": "M\u00fcnchen",
"zip": "80331",
"country": "Deutschland"
}
},
"order_history": [
{
"order_id": "ORD-2024-001",
"date": "[DATE_88]",
"items": [
{
"product": "Laptop",
"price": 1299.99,
"payment": {
"method": "credit_card",
"card_number": "[IBAN_89]",
"iban": "[IBAN_23]"
}
}
]
}
],
"preferences": {
"language": "de",
"newsletter": true,
"marketing_consent": {
"email": "[EMAIL_86]",
"phone": "[PHONE_87]"
}
}
},
"company": {
"name": "[NAME_90]",
"contact": {
"manager": "NAME_91",
"email": "[EMAIL_92]",
"phone": "[PHONE_71]",
"address": {
"street": "Technologiestra\u00dfe 45",
"city": "Berlin",
"zip": "10115",
"country": "Deutschland"
}
}
}
}

View file

@ -1,78 +0,0 @@
<company_data>
<employees>
<employee id="EMP001">
<personal_info>
<name>[NAME_93]</name>
<email>[EMAIL_94]</email>
<phone>[PHONE_13]</phone>
<address>
<street>Musterstraße 42</street>
<city>Hamburg</city>
<zip>20095</zip>
<country>Deutschland</country>
</address>
</personal_info>
<employment>
<department>IT</department>
<position>Senior Developer</position>
<salary currency="EUR">75000</salary>
<bank_details>
<iban>[IBAN_23]</iban>
<bic>COBADEFFXXX</bic>
</bank_details>
</employment>
</employee>
<employee id="EMP002">
<personal_info>
<name>Maria Schmidt</name>
<email>[EMAIL_95]</email>
<phone>[PHONE_96]</phone>
<address>
<street>Bahnhofstraße 15</street>
<city>Frankfurt</city>
<zip>60329</zip>
<country>Deutschland</country>
</address>
</personal_info>
<employment>
<department>HR</department>
<position>HR Manager</position>
<salary currency="EUR">65000</salary>
<bank_details>
<iban>[PHONE_97]</iban>
<bic>COBADEFFXXX</bic>
</bank_details>
</employment>
</employee>
</employees>
<projects>
<project id="PRJ001">
<name>Digital Transformation</name>
<manager>[NAME_93]</manager>
<budget currency="EUR">150000</budget>
<team_members>
<member email="[EMAIL_94]">[NAME_93]</member>
<member email="[EMAIL_95]">Maria Schmidt</member>
</team_members>
</project>
</projects>
<company_info>
<name>Tech Innovations GmbH</name>
<address>
<street>Innovationsstraße 1</street>
<city>München</city>
<zip>80331</zip>
<country>Deutschland</country>
</address>
<contact>
<email>[EMAIL_98]</email>
<phone>[PHONE_71]</phone>
<fax>[PHONE_99]</fax>
</contact>
<banking>
<iban>[PHONE_100]</iban>
<bic>COBADEFFXXX</bic>
<tax_id>DE123456789</tax_id>
</banking>
</company_info>
</company_data>

View file

@ -1,10 +0,0 @@
Bonjour Madame Dupont,
Merci pour votre email à [EMAIL_104].
Vos coordonnées ont été enregistrées:
Téléphone: [PHONE_103] 67 89
Adresse: 123 Rue de Paris, 75001 Paris
Votre IBAN: FR76 3000 6000 [PHONE_102]9
Carte de crédit: 4532 1234 5678 [ADDRESS_101],
Jean Martin

View file

@ -1,24 +0,0 @@
Sehr geehrte Frau [NAME_12],
vielen Dank für Ihre E-Mail an [EMAIL_8].
Ihre Telefonnummer [PHONE_108]urde in unserem System hinterlegt.
Die Rechnung wird an folgende Adresse gesendet:
Musterstraße 123, 12345 Berlin
Ihre IBAN: DE89 3704 [PHONE_107]Kreditkarte: 4532 1234 5678 [ADDRESS_105] freundlichen Grüßen
Max Mustermann
[REINTEGRATE]
Brief von Frau Müller zur
Rechnungsnachfrage an den Helpdesk

View file

@ -1,54 +0,0 @@
Geschäftsstrategie 2024-[ADDRESS_112] AG
Unternehmensdaten:
Firmenname: TechSolutions AG
UID: [SSN_49]resse: [ADDRESS_51], [ADDRESS_50]
Telefon: [PHONE_37] 43
E-Mail: [EMAIL_111]
Website: www.techsolutions.ch
Geschäftsführung:
CEO: [NAME_93]
E-Mail: [EMAIL_110]
Telefon: [PHONE_37] 44
CTO: Dr. Sarah Müller
E-Mail: [EMAIL_109]
Telefon: [PHONE_37] 45
Finanzdaten:
Bank: UBS AG
IBAN: CH93 0076 7000 E529 0767 9
BIC: UBSWCHZH80A
Strategische Ziele:
1. Marktpositionierung
- Marktanteil in der Schweiz auf 25% steigern
- Expansion in DACH-Region
- Neue Zielgruppe: KMU
2. Produktentwicklung
- Cloud-Lösung für KMU
- KI-basierte Automatisierung
- Mobile App für Kunden
3. Personalentwicklung
- Team auf 50 Mitarbeiter ausbauen
- Neue Standorte: Bern und Genf
- Fokus auf Diversity & Inclusion
4. Nachhaltigkeit
- CO2-Neutralität bis 2025
- Green IT Zertifizierung
- Nachhaltige Lieferkette
Budgetplanung:
2024: CHF 5.2 Mio.
2025: CHF 6.8 Mio.
2026: CHF 8.5 Mio.
Risikoanalyse:
- Marktrisiken
- Technologische Risiken
- Personelle Risiken
- Finanzielle Risiken

View file

@ -1,6 +0,0 @@
geschäft_id,datum,kundenname,kundenemail,betrag,zahlungsmethode,zahlungsdetails,lieferadresse
2024-03-15,[DATE_113],[NAME_118],[EMAIL_123],50,IBAN,[IBAN_23],[ADDRESS_132]
2024-03-15,[DATE_114],[NAME_119],[EMAIL_124],75,IBAN,[IBAN_128],[ADDRESS_133]
2024-03-15,[DATE_115],[NAME_120],[EMAIL_125],25,IBAN,[IBAN_129],[ADDRESS_134]
2024-03-15,[DATE_116],[NAME_121],[EMAIL_126],0,IBAN,[IBAN_130],[ADDRESS_135]
2024-03-15,[DATE_117],[NAME_122],[EMAIL_127],50,IBAN,[IBAN_131],[ADDRESS_136]
1 geschäft_id datum kundenname kundenemail betrag zahlungsmethode zahlungsdetails lieferadresse
2 2024-03-15 [DATE_113] [NAME_118] [EMAIL_123] 50 IBAN [IBAN_23] [ADDRESS_132]
3 2024-03-15 [DATE_114] [NAME_119] [EMAIL_124] 75 IBAN [IBAN_128] [ADDRESS_133]
4 2024-03-15 [DATE_115] [NAME_120] [EMAIL_125] 25 IBAN [IBAN_129] [ADDRESS_134]
5 2024-03-15 [DATE_116] [NAME_121] [EMAIL_126] 0 IBAN [IBAN_130] [ADDRESS_135]
6 2024-03-15 [DATE_117] [NAME_122] [EMAIL_127] 50 IBAN [IBAN_131] [ADDRESS_136]

View file

@ -1,9 +0,0 @@
Buongiorno Signora Rossi,
Grazie per la sua email a [EMAIL_141].
Grazie per la sua email a [EMAIL_141] .
I suoi dati di contatto sono stati registrati:
Telefono: [PHONE_16]S_139]: Via Roma 123, 20100 Milano
Il suo IBAN: IT60 X054 2811 1010 [PHONE_138]arta di credito: 4532 1234 5678 [ADDRESS_137] saluti,
Marco Bianchi

View file

@ -1,6 +0,0 @@
kunden_id,vorname,nachname,email,telefon,adresse,iban,kreditkarte,steuernummer
K001,[NAME_142],[NAME_146],[EMAIL_149],[PHONE_13],[ADDRESS_18],[IBAN_23],[IBAN_28],[SSN_162]
K002,[NAME_143],[NAME_62],[EMAIL_150],[PHONE_154],[ADDRESS_158],[IBAN_128],[IBAN_29],[SSN_163]
K003,[NAME_57],[NAME_61],[EMAIL_151],[PHONE_155],[ADDRESS_159],[IBAN_129],[IBAN_30],[SSN_164]
K004,[NAME_144],[NAME_147],[EMAIL_152],[PHONE_156],[ADDRESS_160],[IBAN_130],[IBAN_31],[SSN_165]
K005,[NAME_145],[NAME_148],[EMAIL_153],[PHONE_157],[ADDRESS_161],[IBAN_131],[IBAN_32],[SSN_166]
1 kunden_id vorname nachname email telefon adresse iban kreditkarte steuernummer
2 K001 [NAME_142] [NAME_146] [EMAIL_149] [PHONE_13] [ADDRESS_18] [IBAN_23] [IBAN_28] [SSN_162]
3 K002 [NAME_143] [NAME_62] [EMAIL_150] [PHONE_154] [ADDRESS_158] [IBAN_128] [IBAN_29] [SSN_163]
4 K003 [NAME_57] [NAME_61] [EMAIL_151] [PHONE_155] [ADDRESS_159] [IBAN_129] [IBAN_30] [SSN_164]
5 K004 [NAME_144] [NAME_147] [EMAIL_152] [PHONE_156] [ADDRESS_160] [IBAN_130] [IBAN_31] [SSN_165]
6 K005 [NAME_145] [NAME_148] [EMAIL_153] [PHONE_157] [ADDRESS_161] [IBAN_131] [IBAN_32] [SSN_166]

View file

@ -1,6 +0,0 @@
mitarbeiter_id,vorname,nachname,email,telefon,abteilung,büroadresse,steuernummer,sozialversicherungsnummer
M001,[NAME_167],[NAME_172],[EMAIL_177],[PHONE_182],IT,[ADDRESS_187],[SSN_162],[SSN_192]
M002,[NAME_168],[NAME_173],[EMAIL_178],[PHONE_183],HR,[ADDRESS_188],[SSN_163],[SSN_193]
M003,[NAME_169],[NAME_174],[EMAIL_179],[PHONE_184],Finanzen,[ADDRESS_189],[SSN_164],[SSN_194]
M004,[NAME_170],[NAME_175],[EMAIL_180],[PHONE_185],Marketing,[ADDRESS_190],[SSN_165],[SSN_195]
M005,[NAME_171],[NAME_176],[EMAIL_181],[PHONE_186],Vertrieb,[ADDRESS_161],[SSN_191],[SSN_196]
1 mitarbeiter_id vorname nachname email telefon abteilung büroadresse steuernummer sozialversicherungsnummer
2 M001 [NAME_167] [NAME_172] [EMAIL_177] [PHONE_182] IT [ADDRESS_187] [SSN_162] [SSN_192]
3 M002 [NAME_168] [NAME_173] [EMAIL_178] [PHONE_183] HR [ADDRESS_188] [SSN_163] [SSN_193]
4 M003 [NAME_169] [NAME_174] [EMAIL_179] [PHONE_184] Finanzen [ADDRESS_189] [SSN_164] [SSN_194]
5 M004 [NAME_170] [NAME_175] [EMAIL_180] [PHONE_185] Marketing [ADDRESS_190] [SSN_165] [SSN_195]
6 M005 [NAME_171] [NAME_176] [EMAIL_181] [PHONE_186] Vertrieb [ADDRESS_161] [SSN_191] [SSN_196]

View file

@ -1,10 +0,0 @@
Guten Tag [NAME_200] für Ihre Anfrage an [EMAIL_199].
Ihre Kontaktdaten wurden wie folgt erfasst:
Telefon: [PHONE_40] 67
Adresse: [ADDRESS_198], [ADDRESS_53]
Ihre AHV-Nummer: [SSN_34]
UID-Nummer: [SSN_49]nkkonto: [PHONE_197]7]-8
Mit freundlichen Grüßen
Peter Muster

View file

@ -1,6 +0,0 @@
transaction_id,date,customer_name,customer_email,amount,payment_method,payment_details,shipping_address
T001,[DATE_88],[DATE_113],[NAME_118],1250.5,IBAN,[IBAN_23],[ADDRESS_132]
T002,[DATE_88],[DATE_114],[EMAIL_201],890.75,AHV,[SSN_34],[ADDRESS_205]
T003,[DATE_88],[DATE_115],[EMAIL_202],2340.25,IBAN,[IBAN_25],[ADDRESS_206]
T004,[DATE_88],[DATE_116],[EMAIL_203],1750.0,IBAN,[IBAN_26],[ADDRESS_207]
T005,[DATE_88],[DATE_117],[EMAIL_204],3200.5,IBAN,[IBAN_27],[ADDRESS_208]
1 transaction_id date customer_name customer_email amount payment_method payment_details shipping_address
2 T001 [DATE_88] [DATE_113] [NAME_118] 1250.5 IBAN [IBAN_23] [ADDRESS_132]
3 T002 [DATE_88] [DATE_114] [EMAIL_201] 890.75 AHV [SSN_34] [ADDRESS_205]
4 T003 [DATE_88] [DATE_115] [EMAIL_202] 2340.25 IBAN [IBAN_25] [ADDRESS_206]
5 T004 [DATE_88] [DATE_116] [EMAIL_203] 1750.0 IBAN [IBAN_26] [ADDRESS_207]
6 T005 [DATE_88] [DATE_117] [EMAIL_204] 3200.5 IBAN [IBAN_27] [ADDRESS_208]

View file

@ -1,402 +0,0 @@
"""
Pattern definitions for data anonymization
Separates header patterns from data patterns
"""
from dataclasses import dataclass
from typing import List, Optional, Tuple
import re
@dataclass
class Pattern:
"""Base class for patterns"""
name: str
patterns: List[str]
replacement_template: str
class HeaderPatterns:
"""Patterns for identifying sensitive data in headers"""
patterns = [
# Name patterns
Pattern(
name="name",
patterns=[
# Simple variations
r'\b(?:name|first[-_\s]*name|last[-_\s]*name|full[-_\s]*name)\b',
r'\b(?:customer[-_\s]*name|client[-_\s]*name|user[-_\s]*name)\b',
r'\b(?:given[-_\s]*name|family[-_\s]*name|surname)\b',
# German variations
r'\b(?:vorname|nachname|vollständiger[-_\s]*name|name)\b',
r'\b(?:kunden[-_\s]*name|kunde[-_\s]*name|benutzer[-_\s]*name)\b',
# French variations
r'\b(?:prénom|nom|nom[-_\s]*complet)\b',
r'\b(?:nom[-_\s]*du[-_\s]*client|nom[-_\s]*d\'utilisateur)\b',
# Italian variations
r'\b(?:nome|cognome|nome[-_\s]*completo)\b',
r'\b(?:nome[-_\s]*cliente|nome[-_\s]*utente)\b',
# Common variations
r'\b(?:nom|name|nome|naam)\b'
],
replacement_template="[NAME_{}]"
),
# Email patterns
Pattern(
name="email",
patterns=[
# Simple variations - only labels
r'\b(?:email|e[-_\s]*mail|mail)\s*:?\b',
r'\b(?:contact[-_\s]*email|user[-_\s]*email|client[-_\s]*email)\s*:?\b',
r'\b(?:customer[-_\s]*email|customer[-_\s]*mail|customer[-_\s]*e[-_\s]*mail)\s*:?\b',
# German variations - only labels
r'\b(?:e[-_\s]*mail|e[-_\s]*post|mail[-_\s]*adresse)\s*:?\b',
r'\b(?:kontakt[-_\s]*email|benutzer[-_\s]*email|kunden[-_\s]*email)\s*:?\b',
r'\b(?:kunden[-_\s]*mail|kunden[-_\s]*e[-_\s]*mail|kunden[-_\s]*e[-_\s]*post)\s*:?\b',
# French variations - only labels
r'\b(?:courriel|e[-_\s]*mail|adresse[-_\s]*e[-_\s]*mail)\s*:?\b',
r'\b(?:courriel[-_\s]*de[-_\s]*contact|e[-_\s]*mail[-_\s]*client)\s*:?\b',
r'\b(?:courriel[-_\s]*client|courriel[-_\s]*utilisateur|mail[-_\s]*client)\s*:?\b',
# Italian variations - only labels
r'\b(?:posta[-_\s]*elettronica|e[-_\s]*mail|indirizzo[-_\s]*e[-_\s]*mail)\s*:?\b',
r'\b(?:email[-_\s]*cliente|email[-_\s]*utente)\s*:?\b',
r'\b(?:mail[-_\s]*cliente|mail[-_\s]*utente|posta[-_\s]*cliente)\s*:?\b'
],
replacement_template="[EMAIL_{}]"
),
# Phone patterns
Pattern(
name="phone",
patterns=[
# Simple variations
r'\b(?:phone|tel|telephone|mobile)\b',
r'\b(?:contact[-_\s]*number|phone[-_\s]*number|tel[-_\s]*number)\b',
# German variations
r'\b(?:telefon|mobil|handy|telefon[-_\s]*nummer)\b',
r'\b(?:kontakt[-_\s]*nummer|telefon[-_\s]*nummer|tel[-_\s]*nummer)\b',
# French variations
r'\b(?:téléphone|portable|mobile|numéro[-_\s]*de[-_\s]*téléphone)\b',
r'\b(?:numéro[-_\s]*de[-_\s]*contact|tél[-_\s]*fixe|tél[-_\s]*mobile)\b',
# Italian variations
r'\b(?:telefono|cellulare|mobile|numero[-_\s]*di[-_\s]*telefono)\b',
r'\b(?:numero[-_\s]*di[-_\s]*contatto|tel[-_\s]*fisso|tel[-_\s]*mobile)\b'
],
replacement_template="[PHONE_{}]"
),
# IBAN patterns
Pattern(
name="iban",
patterns=[
# Simple variations
r'\b(?:iban|bank[-_\s]*account|account[-_\s]*number)\b',
r'\b(?:bank[-_\s]*details|account[-_\s]*details|banking[-_\s]*info)\b',
# German variations
r'\b(?:iban|bank[-_\s]*konto|konto[-_\s]*nummer)\b',
r'\b(?:bank[-_\s]*verbindung|konto[-_\s]*verbindung|bank[-_\s]*daten)\b',
# French variations
r'\b(?:iban|compte[-_\s]*bancaire|numéro[-_\s]*de[-_\s]*compte)\b',
r'\b(?:coordonnées[-_\s]*bancaires|détails[-_\s]*bancaires)\b',
# Credit card variations in French
r'\b(?:carte[-_\s]*de[-_\s]*credit|carte[-_\s]*credit|numero[-_\s]*carte[-_\s]*credit)\b',
r'\b(?:carte[-_\s]*bancaire|carte[-_\s]*de[-_\s]*paiement)\b',
r'\b(?:carte[-_\s]*de[-_\s]*crédit|carte[-_\s]*crédit|numéro[-_\s]*carte[-_\s]*crédit)\b',
r'\b(?:carte[-_\s]*de[-_\s]*débit|carte[-_\s]*débit|numéro[-_\s]*carte[-_\s]*débit)\b',
# Italian variations
r'\b(?:iban|conto[-_\s]*bancario|numero[-_\s]*di[-_\s]*conto)\b',
r'\b(?:coordinate[-_\s]*bancarie|dettagli[-_\s]*bancari)\b',
# Common variations
r'\b(?:bankkonto|bank[-_\s]*konto|conto[-_\s]*di[-_\s]*banca)\b',
# Credit card variations
r'\b(?:credit[-_\s]*card|credit[-_\s]*card[-_\s]*number|credit[-_\s]*card[-_\s]*no)\b',
r'\b(?:credit[-_\s]*card[-_\s]*nr|credit[-_\s]*card[-_\s]*num)\b',
r'\b(?:credit[-_\s]*card[-_\s]*id|credit[-_\s]*card[-_\s]*code)\b',
r'\b(?:credit[-_\s]*card[-_\s]*reference|credit[-_\s]*card[-_\s]*ref)\b',
r'\b(?:credit[-_\s]*card[-_\s]*details|credit[-_\s]*card[-_\s]*info)\b',
r'\b(?:credit[-_\s]*card[-_\s]*data|credit[-_\s]*card[-_\s]*account)\b',
# Credit card variations in other languages
r'\b(?:kredit[-_\s]*karte|kreditkarte|kredit[-_\s]*karten[-_\s]*nummer)\b',
r'\b(?:carta[-_\s]*di[-_\s]*credito|carta[-_\s]*credito|numero[-_\s]*carta[-_\s]*credito)\b',
# Payment variations
r'\b(?:payment[-_\s]*details|payment[-_\s]*info|payment[-_\s]*data)\b',
r'\b(?:zahlungs[-_\s]*details|zahlungs[-_\s]*informationen|zahlungs[-_\s]*daten)\b',
r'\b(?:détails[-_\s]*de[-_\s]*paiement|informations[-_\s]*de[-_\s]*paiement)\b',
r'\b(?:dettagli[-_\s]*di[-_\s]*pagamento|informazioni[-_\s]*di[-_\s]*pagamento)\b',
# Common credit card abbreviations
r'\b(?:cc[-_\s]*number|cc[-_\s]*no|cc[-_\s]*nr)\b',
r'\b(?:cc[-_\s]*num|cc[-_\s]*id|cc[-_\s]*code)\b',
r'\b(?:cc[-_\s]*ref|cc[-_\s]*details|cc[-_\s]*info)\b',
r'\b(?:cc[-_\s]*data|cc[-_\s]*account)\b',
# Simple credit card
r'\b(?:credit[-_\s]*card|credit[-_\s]*card[-_\s]*number)\b',
# Additional credit card variations
r'\b(?:card[-_\s]*number|card[-_\s]*no|card[-_\s]*nr)\b',
r'\b(?:card[-_\s]*num|card[-_\s]*id|card[-_\s]*code)\b',
r'\b(?:card[-_\s]*ref|card[-_\s]*details|card[-_\s]*info)\b',
r'\b(?:card[-_\s]*data|card[-_\s]*account)\b'
],
replacement_template="[IBAN_{}]"
),
# Address patterns
Pattern(
name="address",
patterns=[
# English variations
r'\b(?:address|street[-_\s]*address|mailing[-_\s]*address)\b',
r'\b(?:home[-_\s]*address|work[-_\s]*address|billing[-_\s]*address)\b',
r'\b(?:.*address.*)\b', # Match any text containing "address"
# German variations
r'\b(?:adresse|strassen[-_\s]*adresse|post[-_\s]*adresse)\b',
r'\b(?:wohn[-_\s]*adresse|geschäfts[-_\s]*adresse|rechnungs[-_\s]*adresse)\b',
r'\b(?:.*adresse.*)\b', # Match any text containing "adresse"
# French variations
r'\b(?:adresse|adresse[-_\s]*postale|adresse[-_\s]*de[-_\s]*livraison)\b',
r'\b(?:adresse[-_\s]*personnelle|adresse[-_\s]*professionnelle)\b',
r'\b(?:.*adresse.*)\b', # Match any text containing "adresse"
# Italian variations
r'\b(?:indirizzo|indirizzo[-_\s]*postale|indirizzo[-_\s]*di[-_\s]*consegna)\b',
r'\b(?:indirizzo[-_\s]*personale|indirizzo[-_\s]*professionale)\b',
r'\b(?:.*indirizzo.*)\b', # Match any text containing "indirizzo"
# Common variations
r'\b(?:location|place|residence|domicile)\b',
r'\b(?:standort|ort|wohnort|domizil)\b',
r'\b(?:lieu|emplacement|résidence|domicile)\b',
r'\b(?:luogo|posizione|residenza|domicilio)\b'
],
replacement_template="[ADDRESS_{}]"
),
# Date patterns
Pattern(
name="date",
patterns=[
# English variations
r'\b(?:date|birth[-_\s]*date|date[-_\s]*of[-_\s]*birth)\b',
r'\b(?:dob|birthday|anniversary)\b',
# German variations
r'\b(?:datum|geburt[-_\s]*datum|geboren[-_\s]*am)\b',
r'\b(?:geburtstag|jubiläum|feier[-_\s]*tag)\b',
r'\b(?:geboren|geb\.|geboren[-_\s]*am)\b',
# French variations
r'\b(?:date|date[-_\s]*de[-_\s]*naissance|né[-_\s]*le)\b',
r'\b(?:anniversaire|date[-_\s]*anniversaire)\b',
r'\b(?:né|née|né[-_\s]*le)\b',
# Italian variations
r'\b(?:data|data[-_\s]*di[-_\s]*nascita|nato[-_\s]*il)\b',
r'\b(?:compleanno|anniversario)\b',
r'\b(?:nato|nata|nato[-_\s]*il)\b',
# Common variations
r'\b(?:birth|born|geboren|né|nato)\b'
],
replacement_template="[DATE_{}]"
),
# SSN patterns
Pattern(
name="ssn",
patterns=[
# English variations
r'\b(?:ssn|social[-_\s]*security[-_\s]*number|tax[-_\s]*id)\b',
r'\b(?:tax[-_\s]*identification|national[-_\s]*id)\b',
# German variations
r'\b(?:ahv[-_\s]*nummer|sozial[-_\s]*versicherungs[-_\s]*nummer)\b',
r'\b(?:steuer[-_\s]*nummer|steuer[-_\s]*id|svn)\b',
r'\b(?:ahv[-_\s]*nr|ahv[-_\s]*no|ahv[-_\s]*num)\b',
# French variations
r'\b(?:numéro[-_\s]*avs|numéro[-_\s]*de[-_\s]*sécurité[-_\s]*sociale)\b',
r'\b(?:numéro[-_\s]*fiscal|numéro[-_\s]*d\'identification)\b',
# Italian variations
r'\b(?:numero[-_\s]*avs|numero[-_\s]*di[-_\s]*sicurezza[-_\s]*sociale)\b',
r'\b(?:numero[-_\s]*fiscale|codice[-_\s]*fiscale)\b',
# Common variations
r'\b(?:ahv|svn|nss|avs)\b',
# Additional AHV variations
r'\b(?:ahv_nummer|ahvnummer|ahv-nummer|ahv_number)\b',
r'\b(?:ahv[-_\s]*nr|ahv[-_\s]*no|ahv[-_\s]*num)\b',
r'\b(?:ahv[-_\s]*number|ahv[-_\s]*number)\b',
r'\b(?:ahv[-_\s]*id|ahv[-_\s]*id)\b',
r'\b(?:ahv[-_\s]*code|ahv[-_\s]*code)\b',
r'\b(?:ahv[-_\s]*reference|ahv[-_\s]*reference)\b',
r'\b(?:ahv[-_\s]*reference[-_\s]*number|ahv[-_\s]*reference[-_\s]*number)\b',
r'\b(?:ahv[-_\s]*reference[-_\s]*no|ahv[-_\s]*reference[-_\s]*no)\b',
r'\b(?:ahv[-_\s]*reference[-_\s]*nr|ahv[-_\s]*reference[-_\s]*nr)\b',
r'\b(?:ahv[-_\s]*reference[-_\s]*num|ahv[-_\s]*reference[-_\s]*num)\b',
r'\b(?:ahv[-_\s]*reference[-_\s]*id|ahv[-_\s]*reference[-_\s]*id)\b',
r'\b(?:ahv[-_\s]*reference[-_\s]*code|ahv[-_\s]*reference[-_\s]*code)\b'
],
replacement_template="[SSN_{}]"
)
]
class DataPatterns:
"""Patterns for identifying sensitive data in content"""
patterns = [
# Name patterns
Pattern(
name="name",
patterns=[
# Person names with titles and academic degrees
r'\b(?:Dr\.|Prof\.|PhD\.?|MD\.?|Herr|Frau|Mr\.|Mrs\.|Ms\.|Monsieur|Madame|Signore|Signora)\s+[A-Z][a-z]{2,}(?:\s+[A-Za-z]{2,}){1,2}\b'
],
replacement_template="[NAME_{}]"
),
# Email pattern for plain text
Pattern(
name="email",
patterns=[
# Basic email pattern
r'[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)*'
],
replacement_template="[EMAIL_{}]"
),
# Phone patterns
Pattern(
name="phone",
patterns=[
# International format
r'\+\d{1,3}[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}\b',
# Swiss format
r'\b(?:0\d{1,2}|0041\d{1,2})[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}\b',
# German format
r'\b(?:0\d{1,4}|0049\d{1,4})[-.\s]?\d{3,}[-.\s]?\d{3,}\b',
# French format
r'\b(?:0\d{1,2}|0033\d{1,2})[-.\s]?\d{1,2}[-.\s]?\d{2}[-.\s]?\d{2}[-.\s]?\d{2}\b',
# Italian format
r'\b(?:0\d{1,3}|0039\d{1,3})[-.\s]?\d{3,}[-.\s]?\d{3,}\b',
# Mobile numbers
r'\b(?:07|00417|004917|00337|00397)\d{8,9}\b',
# Emergency numbers
r'\b(?:112|911|118|117|144|1414)\b'
],
replacement_template="[PHONE_{}]"
),
# IBAN patterns
Pattern(
name="iban",
patterns=[
r'\b(?:CH|DE|FR|IT)\d{2}\s?(?:\d{4}\s?){5}\d{2}\b',
r'\b(?:CH|DE|FR|IT)\d{2}(?:\d{4}){5}\d{2}\b'
],
replacement_template="[IBAN_{}]"
),
# Address patterns
Pattern(
name="address",
patterns=[
r'\b(?:[A-Za-zäöüßÄÖÜ]+(?:strasse|str\.|gasse|weg|platz|allee|boulevard|avenue|via|strada|rue|chemin|route))\s+\d{1,4}(?:[a-z])?\b',
r'\b\d{4}\s+[A-Za-zäöüßÄÖÜ]+\b'
],
replacement_template="[ADDRESS_{}]"
),
# Date patterns
Pattern(
name="date",
patterns=[
# Specific date formats with context
r'\b(?:geboren|birth|né|nato)\s+am\s+[0-9]{2}[./-][0-9]{2}[./-][0-9]{4}\b', # Birth dates
r'\b(?:geboren|birth|né|nato)\s+am\s+[0-9]{4}[./-][0-9]{2}[./-][0-9]{2}\b', # Birth dates
r'\b(?:vertrag|contract|contrat|contratto)\s+vom\s+[0-9]{2}[./-][0-9]{2}[./-][0-9]{4}\b', # Contract dates
r'\b(?:vertrag|contract|contrat|contratto)\s+vom\s+[0-9]{4}[./-][0-9]{2}[./-][0-9]{2}\b', # Contract dates
# Specific date formats with month names
r'\b(?:geboren|birth|né|nato)\s+am\s+(?:jan|feb|mar|apr|mai|jun|jul|aug|sep|okt|nov|dez|januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)[a-z]*\s+\d{4}\b', # Birth dates with month
r'\b(?:vertrag|contract|contrat|contratto)\s+vom\s+(?:jan|feb|mar|apr|mai|jun|jul|aug|sep|okt|nov|dez|januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)[a-z]*\s+\d{4}\b' # Contract dates with month
],
replacement_template="[DATE_{}]"
),
# SSN patterns
Pattern(
name="ssn",
patterns=[
r'\b(?:756|757|758|759)\.\d{4}\.\d{4}\.\d{2}\b', # Swiss AHV
r'\b(?:CHE|DE|FR|IT)-\d{3}\.\d{3}\.\d{3}\b', # Company IDs
r'\b\d{3}\.\d{3}\.\d{3}\b' # Generic SSN format
],
replacement_template="[SSN_{}]"
)
]
class TextTablePatterns:
"""Patterns for identifying table-like structures in text"""
@staticmethod
def get_patterns() -> List[Tuple[str, str]]:
return [
# key: value pattern (with optional whitespace)
(r'^([^:]+):\s*(.+)$', ':'),
# key = value pattern (with optional whitespace)
(r'^([^=]+)=\s*(.+)$', '='),
# key = value pattern (with required whitespace)
(r'^([^=]+)\s+=\s+(.+)$', '='),
# key: value pattern (with required whitespace)
(r'^([^:]+)\s+:\s+(.+)$', ':'),
]
@staticmethod
def is_table_line(line: str) -> bool:
"""Check if a line matches any table pattern"""
patterns = TextTablePatterns.get_patterns()
return any(re.match(pattern[0], line.strip()) for pattern in patterns)
@staticmethod
def extract_key_value(line: str) -> Optional[Tuple[str, str]]:
"""Extract key and value from a table line"""
patterns = TextTablePatterns.get_patterns()
for pattern, separator in patterns:
match = re.match(pattern, line.strip())
if match:
key = match.group(1).strip()
value = match.group(2).strip()
return key, value
return None
def get_pattern_for_header(header: str, patterns: List[Pattern]) -> Optional[Pattern]:
"""
Find matching pattern for a header
Args:
header: The header to check
patterns: List of patterns to check against
Returns:
Optional[Pattern]: Matching pattern or None
"""
if not header:
return None
header = header.lower().strip()
for pattern in patterns:
for p in pattern.patterns:
if re.search(p, header, re.IGNORECASE):
return pattern
return None
def find_patterns_in_text(text: str, patterns: List[Pattern]) -> List[tuple]:
"""
Find all pattern matches in text
Args:
text: Text to search
patterns: List of patterns to check
Returns:
List[tuple]: List of (pattern_name, match, start, end)
"""
matches = []
for pattern in patterns:
for p in pattern.patterns:
if pattern.name == 'email':
print(f"\nDEBUG: Checking email pattern '{p}'")
for match in re.finditer(p, text, re.IGNORECASE):
if pattern.name == 'email':
print(f"DEBUG: Found email match: '{match.group(0)}' at position {match.start()}-{match.end()}")
print(f"DEBUG: Context: '{text[max(0, match.start()-20):match.end()+20]}'")
matches.append((pattern.name, match.group(0), match.start(), match.end()))
return sorted(matches, key=lambda x: x[2]) # Sort by start position

View file

@ -1,608 +0,0 @@
# Bewertung der PowerOn AI Platform
Basierend auf dem nachstehenden Q&A ergibt sich nachfolgende Bewertung des Softwareprodukts "PowerOn AI Platform".
## Aktueller Wert per Juni 2025
1. **Technischer Wert des Codes**:
- Professionelle, modulare Codebasis (~50.000-60.000 LOC)
- Moderne Architektur mit innovativen Komponenten
- 5 Personenmonate Entwicklung x CHF 15.000/PM = CHF 75.000
- Zusätzlicher Wert durch Enterprise-Ready Architektur: CHF 50.000
2. **Bisherige Investitionen**:
- Hardware/Software: CHF 20.000
- Expertise-Premium (30+ Jahre Erfahrung): CHF 25.000
3. **IP und Innovationswert**:
- Multi-Agent Workflow-System
- Modulare Architecture mit Alleinstellungsmerkmalen
- Geschätzter Wert: CHF 100.000
4. **Marktpotenzial-Faktor**:
- Adressierbares Marktvolumen von CHF 500-700 Mio.
- Wachstumsmarkt (25-30% jährlich)
- Frühphasen-Multiplikator: 2x
**Aktueller Gesamtwert (Juni 2025)**: **CHF 500.000**
## Prognostizierte Wertentwicklung
### Ende 2025
- Abschluss der technischen Entwicklung
- Erste Pilotprojekte mit 3-5 Referenzkunden
- Validierung des Produkts am Markt
- **Geschätzter Wert Ende 2025**: **CHF 1,2 Millionen**
(Steigerung durch Marktvalidierung und Risikoreduktion)
### Ende 2026
- 20-30 Kunden
- ARR: CHF 0,5-0,8 Mio.
- Etablierung im DACH-Markt
- **Geschätzter Wert Ende 2026**: **CHF 4-5 Millionen**
(Bewertungsmultiplikator von 6-8x ARR für wachstumsstarke SaaS)
### Ende 2027
- 70-90 Kunden
- ARR: CHF 2-2,5 Mio.
- Erweiterung der Produktpalette
- **Geschätzter Wert Ende 2027**: **CHF 12-15 Millionen**
(Bewertungsmultiplikator von 6x ARR)
### Ende 2028
- 150+ Kunden
- ARR: CHF 4,5 Mio.
- Internationale Expansion
- **Geschätzter Wert Ende 2028**: **CHF 25-30 Millionen**
(Bewertungsmultiplikator von 5,5-6,5x ARR für etablierte SaaS)
## Schlüsselfaktoren und Risikobeurteilung für die Wertentwicklung
1. **Erfolgreiche Markteinführung**: Der Übergang von Entwicklung zu erfolgreicher Pilotphase ist kritisch für die Wertentwicklung 2025-2026.
2. **Skalierung des Vertriebs**: Die Fähigkeit, die Kundenakquisition gemäss der Prognose zu skalieren, ist entscheidend für die 2026-2027 Bewertung.
3. **Kapitaleffizienz**: Die effiziente Nutzung des Kapitals (CHF 750.000-1.050.000) für die nächste Entwicklungsphase wird die Bewertung massgeblich beeinflussen.
4. **Marktdynamik**: Die Entwicklung des KI-Marktes und regulatorische Änderungen können sowohl positive als auch negative Auswirkungen haben.
Diese Bewertung basiert auf der Annahme, dass die Meilensteine wie geplant erreicht werden und keine signifikanten externen Faktoren die Marktentwicklung negativ beeinflussen.
# Kriterienkatalog zur Softwarebewertung
## Teil 1: Technische Bewertung (Code-basiert)
1. Wie umfangreich ist die Codebasis (LOC, Module, Komponenten)?
2. Welche Programmiersprachen und Frameworks wurden verwendet?
3. Wie hoch ist die Codequalität und -konsistenz (saubere Architektur, Dokumentation, Tests)?
4. Gibt es innovative Algorithmen oder patentierbare technische Lösungen?
5. Wie modular und wartbar ist die Software gestaltet?
6. Wie robust ist die Fehlerbehandlung und Sicherheitsarchitektur?
7. Wie skalierbar ist die technische Infrastruktur?
8. Gibt es technische Schulden, die zukünftige Entwicklungen behindern könnten?
### 1. Umfang der Codebasis
- **Frontend**: Modulare JavaScript-Struktur mit ca. 15 Hauptmodulen
- **Backend**: Python/FastAPI mit ca. 15 Hauptmodulen
- **Hauptkomponenten**:
- Frontend: Workflow, UI, Koordination, Datenmanagement
- Backend: Gateway, Agent Service, Connectors, Workflow Manager
- **Geschätzte LOC**: ~50,000-60,000 Zeilen Code
### 2. Programmiersprachen und Frameworks
- **Frontend**:
- JavaScript (ES6+)
- Modulares System mit ES6-Import/Export
- Vanilla JS ohne externe Frameworks
- **Backend**:
- Python 3.x
- FastAPI für REST-API
- Asyncio für asynchrone Verarbeitung
### 3. Codequalität und -konsistenz
- **Saubere Architektur**:
- Klare Trennung Frontend/Backend
- Modulare Struktur mit definierten Verantwortlichkeiten
- State Machine Pattern für Workflow-Management
- **Dokumentation**:
- Ausführliche JSDoc/Python-Docstrings
- Architekturdiagramme (Mermaid)
- Technische Spezifikationen
- **Tests**:
- Automatisierte Modultests
- Manuell Integrationstests
- Benutzertests über Tickets in Clickup
### 4. Innovative Algorithmen/patentierbare Lösungen
- Multi-Agent Workflow-System mit spezialisierten Agenten
- Modulares Agent-Registry-System
- State Machine für Workflow-Koordination
- Dynamische Agenten-Integration
### 5. Modularität und Wartbarkeit
- **Hohe Modularität**:
- Klare Trennung der Verantwortlichkeiten
- Plug-and-Play Agent-System
- Erweiterbare Connector-Architektur
- **Wartbarkeit**:
- Konsistente Codestruktur
- Klare Namenskonventionen
- Dokumentierte Schnittstellen
### 6. Fehlerbehandlung und Sicherheit
- **Robuste Fehlerbehandlung**:
- State Machine für Workflow-Status
- Exception Handling auf allen Ebenen
- Logging-System für Debugging
- **Sicherheitsarchitektur**:
- Multi-Tenant-Architektur
- Authentifizierung/Autorisierung
- Mandantenverwaltung
### 7. Skalierbarkeit
- **Horizontale Skalierbarkeit**:
- Modulare Architektur
- Asynchrone Verarbeitung
- Connector-System für externe Dienste
- **Vertikale Skalierbarkeit**:
- Workflow-Parallelisierung
- Agent-Pooling
- Caching-Mechanismen
### 8. Technische Schulden
- **Potenzielle Verbesserungsbereiche**:
- Test-Coverage nicht sichtbar
- Eventuell fehlende Performance-Optimierungen
- Dokumentation für Zielgruppen noch unvollständig
- **Keine kritischen Blockierer identifiziert**
### Fazit der technischen Bewertung
Die Codebasis zeigt eine professionelle, gut strukturierte Enterprise-Anwendung mit klarer Architektur und modernen Best Practices. Die modulare Struktur und die saubere Implementierung der State Machine für Workflow-Management sind besonders hervorzuheben. Die Anwendung ist technisch reif und zeigt ein hohes Mass an Professionalität in der Implementierung.
## Teil 2: Bewertung der bisherigen Aufwände
### 1. Entwicklungsaufwände
- **Patrick**:
- ValueOn AG: 80 Stunden
- Private Entwicklung: 650 Stunden
- **Gesamt**: 730 Stunden (ca. 4.5 Personenmonate)
- **Ida**:
- ValueOn AG: 60 Stunden
- **Gesamt**: 60 Stunden (ca. 0.4 Personenmonate)
- **Gesamtaufwand**: ~5 Personenmonate
### 2. Qualifikationen und Erfahrungslevel
- **Patrick**:
- Business Consultant
- Software Architect
- Full Stack Developer
- 30+ Jahre Berufserfahrung
- Experte für Enterprise-Architekturen
- **Ida**:
- Business Analyst
- Project Manager
- Scrum Master
- Erfahrung in agiler Entwicklung
- Expertise in Prozessoptimierung
### 3. Spezifische Fachkenntnisse
- **Patrick**:
- Umfassende Markt- und Business-Erfahrung (30 Jahre)
- Expertise in Software-Architektur
- Full Stack Entwicklung
- Azure Cloud-Integration
- KI/ML Integration
- Enterprise-Systeme
- **Ida**:
- Projektmanagement
- Agile Methoden
- Business Analysis
- Prozessoptimierung
- Qualitätssicherung
### 4. Finanzielle Investitionen
- **Hardware**: CHF 10,000
- Entwicklungsserver
- Testumgebungen
- Entwicklungshardware
- **Software & Lizenzen**: CHF 10,000
- Entwicklungstools
- Cloud-Services
- KI-API-Zugänge
- **Gesamt**: CHF 20,000
### 5. Externe Dienstleister
- **Aktueller Status**: Keine externen Dienstleister
- **Vorteile**:
- Volle Kontrolle über Entwicklung
- Tiefes Verständnis der Architektur
- Schnelle Entscheidungswege
- Kosteneffizienz
### 6. Schlüsselkomponenten-Entwicklung
- **Patrick**:
- Frontend-Architektur
- Backend-System
- Workflow-Engine
- Agent-System
- Connector-Framework
- Datenmanagement
- Sicherheitsarchitektur
- **Verantwortlichkeiten**:
- Systemarchitektur
- Technische Leitung
- Code-Review
- Qualitätssicherung
### 7. Nicht-monetäre Ressourcen
- **Dominic**:
- Umfangreiches Sales & Marketing Netzwerk
- Marktzugang
- Branchenkontakte
- **ValueOn AG**:
- Infrastruktur
- Rechtlicher Rahmen
- Geschäftsprozesse
- **Netzwerke**:
- Technologie-Partner
- Potenzielle Kunden
- Branchenexperten
### 8. Finanzielle Risiken
- **ValueOn AG**:
- Bereitstellung von Infrastruktur
- Personelle Ressourcen
- Rechtlicher Rahmen
- **Private Investitionen**:
- Entwicklungszeit
- Hardware/Software
- Cloud-Services
### Fazit bisherige Aufwände
Die bisherigen Aufwände zeigen ein ausgewogenes Verhältnis zwischen technischer Expertise und Business-Know-how. Die private Investition von 730 Stunden durch Patrick demonstriert ein hohes Engagement und tiefes Verständnis der Technologie. Die Kombination aus technischer Expertise, Business-Erfahrung und Marktzugang bildet eine solide Grundlage für die weitere Entwicklung. Die bisherigen Investitionen sind effizient eingesetzt worden, mit Fokus auf kritische Kernkomponenten und skalierbare Architektur.
## Teil 3: Markt- und Geschäftspotenzial
### 1. Adressierbarer Gesamtmarkt und Wachstumspotenzial
- **Gesamtmarktvolumen 2025**:
- KI-Markt: $190 Mrd.
- Business Process Automation: $19,6 Mrd.
- Enterprise Knowledge Management: $43 Mrd.
- **Adressierbarer Markt (SAM)**:
- Initial: Mittlerer Markt in DACH (Professional Services, Finanzdienstleistungen, Gesundheitswesen)
- Geschätztes SAM: CHF 500-700 Mio.
- **Wachstumspotenzial**:
- Jährliches Marktwachstum: 25-30%
- Erweiterung auf internationale Märkte
- Branchenspezifische Lösungen
### 2. Alleinstellungsmerkmale
1. **Technologische Vorteile**:
- Proprietäre Multi-Agent-Technologie
- Modellunabhängige KI-Integration
- Enterprise-Ready Architektur
- Fortschrittliche Workflow-Orchestrierung
2. **Funktionale Vorteile**:
- Nahtlose Integration verschiedener KI-Modelle
- Robuste Fehlerbehandlung
- Skalierbare Multi-Tenant-Architektur
- Umfassende Enterprise-Features
### 3. Kunden und Pilotprojekte
- **Aktueller Status**:
- In Entwicklung
- Erste Referenzkunden in Planung
- Fokus auf mittelständische Unternehmen
- **Pilotphase**:
- Geplant für Q3/Q4 2025
- 3-5 Schlüsselreferenzkunden
- Branchenspezifische Templates
### 4. Geschäftsmodell
- **Hauptmodell**: SaaS (Software as a Service)
- **Preismodell**:
- Basis: Pro-Benutzer/Monat Abonnement
- Zusätzlich: Nutzungsbasierte Abrechnung
- Enterprise-Lizenzen für grössere Kunden
- **Erwartete Margen**: 75-85% nach Skalierung
### 5. Preisgestaltung
- **Wettbewerbsvergleich**:
- Unterhalb Enterprise-Lösungen
- Über Standard-BPA-Tools
- Flexiblere Preisgestaltung als Konkurrenz
- **Preisstruktur**:
- Basis-Abonnement: CHF 50-100 pro Benutzer/Monat
- Nutzungsbasierte Komponente: CHF 0.10-0.50 pro Verarbeitungseinheit
- Enterprise-Pakete: Individuelle Preisgestaltung
### 6. Umsatzpotenziale
- **Jahr 1 (2026)**:
- Ziel: 20-30 Kunden
- Erwartetes ARR: CHF 0.5-0.8 Mio.
- **Jahr 2 (2027)**:
- Ziel: 70-90 Kunden
- Erwartetes ARR: CHF 2-2.5 Mio.
- **Jahr 3 (2028)**:
- Ziel: 150+ Kunden
- Erwartetes ARR: CHF 4.5 Mio.
### 7. Akquisitionskosten
- **Customer Acquisition Cost (CAC)**:
- Erwarteter CAC: CHF 15,000-20,000
- Payback-Zeit: 12-18 Monate
- **Kostenstruktur**:
- 30% Vertrieb und Marketing
- Fokus auf effiziente Akquisition
- Skaleneffekte ab 50+ Kunden
### 8. Regulatorische Herausforderungen
- **Datenschutz**:
- DSGVO-Konformität
- Datensicherheit
- Mandantentrennung
- **KI-Regulierung**:
- EU AI Act
- Transparenzpflichten
- Qualitätssicherung
- **Branchenspezifische Regulierung**:
- Finanzdienstleistungen
- Gesundheitswesen
- Professional Services
### Fazit Markt- und Geschäftspotenzial
Die PowerOn AI Platform adressiert einen wachsenden Markt mit klaren Alleinstellungsmerkmalen. Das Geschäftsmodell ist skalierbar und die Preisgestaltung wettbewerbsfähig. Die regulatorischen Herausforderungen sind bekannt und adressierbar. Die Umsatzprognosen sind konservativ kalkuliert und basieren auf realistischen Marktannahmen.
## Teil 4: Skalierungs- und Zukunftspotenzial
### 1. Ressourcen für Support und Weiterentwicklung
- **Entwicklungsteam**:
- 2-3 Full-Stack Entwickler, KI-unterstützte Entwicklung
- 1 DevOps Engineer
- 1 QA Engineer
- **Support-Team**:
- 1-2 Support Engineers
- 1 Technical Account Manager
- **Infrastruktur**:
- Cloud-basierte Skalierung (Azure)
- Automatisierte Deployment-Pipeline
- Monitoring und Logging-Systeme
### 2. Skalierbarkeit
- **Technische Skalierbarkeit**:
- Horizontale Skalierung durch Multi-Tenant-Architektur
- Vertikale Skalierung durch Agent-Pooling
- Automatische Lastverteilung
- **Skalierungszeitrahmen**:
- 2x Nutzer: Sofort möglich
- 5x Nutzer: 1-2 Monate Vorbereitung
- 10x Nutzer: 3-4 Monate mit Infrastruktur-Erweiterung
### 3. Kapitalbedarf
- **Nächste Entwicklungsphase (12 Monate)**:
- Entwicklung: CHF 400,000-500,000
- Marketing & Sales: CHF 100,000-200,000
- Infrastruktur: CHF 50,000-100,000
- Betrieb & Support: CHF 100,000-150,000
- **Gesamt**: CHF 750,000-1,050,000
### 4. Schlüsselpersonen
- **Technische Leitung**:
- Patrick (Software Architect, Full Stack Developer)
- Verantwortlich für: Architektur, Entwicklung, Technische Strategie
- **Business & Operations**:
- Ida (Business Analyst, Project Manager)
- Verantwortlich für: Projektmanagement, Business Analysis
- **Sales & Marketing**:
- Dominic (Sales & Marketing)
- Verantwortlich für: Marktentwicklung, Kundenakquisition
### 5. Exit-Strategien
- **Strategische Übernahme**:
- Enterprise Software Anbieter
- KI/ML Plattform Betreiber
- Business Process Automation Unternehmen
- **IPO-Potenzial**:
- Ab CHF 50 Mio. ARR
- Zeitrahmen: 5-7 Jahre
- **Extraktion aus ValueOn AG**:
- Vergütung der Aufwände
- Anrechnung des Mehrwerts für Schlüsselpersonen
- Beschaffung des notwendigen Kapitals
### 6. Strategische Partnerschaften
- **Technologie-Partner**:
- KI-Provider (OpenAI, Anthropic)
- Cloud-Provider (Azure)
- Enterprise Software Anbieter
- **Vertriebspartner**:
- Systemhäuser
- Beratungsunternehmen
- Branchenspezialisten
- **Forschungspartner**:
- Universitäten
- Forschungsinstitute
- KI-Labore
### 7. Geplante Erweiterungen
- **Kurzfristig (12 Monate)**:
- Erweiterte Agent-Typen
- Branchenspezifische Templates
- API-Erweiterungen
- **Mittelfristig (24 Monate)**:
- Agentenmarktplatz
- Proprietäre KI-Modelle
- Erweiterte Analytics
- **Langfristig (36+ Monate)**:
- KI-Middleware für Unternehmen
- Branchenlösungen
- Internationale Expansion
### 8. Langfristige Vision
- **Technologische Vision**:
- Führende Multi-Agent KI-Plattform
- Standard für Enterprise Workflow Automation
- Innovationstreiber in der KI-Integration
- **Marktvision**:
- Globaler Marktführer in Nischenbereichen
- Branchenstandard für bestimmte Anwendungsfälle
- Referenz für KI-gestützte Prozessoptimierung
- **Geschäftsvision**:
- Nachhaltiges Wachstum
- Profitables Geschäftsmodell
- Führende Position in ausgewählten Märkten
### Fazit Skalierungs- und Zukunftspotenzial
Die PowerOn AI Platform verfügt über ein solides Skalierungspotenzial sowohl technisch als auch geschäftlich. Die modulare Architektur ermöglicht schnelles Wachstum, während die klare Vision und die strategischen Partnerschaften den langfristigen Erfolg unterstützen. Die Kapitalanforderungen sind realistisch kalkuliert und die Exit-Strategien bieten verschiedene Optionen für die Zukunft.
# Exitplan: PowerOn AI Platform als eigenständige AG
## Bewertung und Ausgangssituation
**Aktueller Wert (Juni 2025)**: CHF 500.000
**Angepasster Gründungswert**: CHF 800.000 (berücksichtigt den strategischen Wert der Produktvision, welche bereits als innerer Wert im Produkt enthalten ist)
## Strukturierung der PowerOn AG
### 1. Aktienstruktur bei Gründung
**Gesamtes Aktienkapital**: 1.000.000 Aktien (Nennwert CHF 0,10)
**Firmenvaluation bei Gründung**: CHF 800.000
#### Verteilung der initialen Aktien:
- **Patrick**:
- Eingebrachte Leistung: Entwicklung, technische Expertise und essenzielles Gesamtkonzept
- **Aktienanteil**: 35% (350.000 Aktien)
- **Dominic**:
- Eingebrachte Leistung: Netzwerk, Sales & Marketing Expertise und Vision
- **Aktienanteil**: 15% (150.000 Aktien)
- **ValueOn AG**:
- Eingebrachte Leistung: Infrastruktur, rechtlicher Rahmen, Arbeitszeit, Übertragung von IP
- **Aktienanteil**: 25% (250.000 Aktien)
- **Reservierter Anteil für Mitarbeiter-Pool**:
- **Aktienanteil**: 10% (100.000 Aktien)
- **Reserviert für Investoren (erste Runde)**:
- **Aktienanteil**: 15% (150.000 Aktien)
### 2. Kapitalbedarfsplanung (18 Monate)
| Kategorie | Betrag (CHF) |
|-----------|--------------|
| Entwicklung | 550.000 |
| Marketing & Sales | 250.000 |
| Infrastruktur | 100.000 |
| Betrieb & Support | 200.000 |
| **Gesamtbedarf** | **1.100.000** |
**Kapitalbeschaffungsstrategie**:
- **Erste Finanzierungsrunde**: CHF 1.000.000 (für 18 Monate)
- **Sicherheitspuffer**: CHF 100.000 (aus Umsätzen/zukünftigen Einnahmen)
### 3. Investitionskonditionen
**Pre-Money Bewertung**: CHF 800.000
**Investitionsvolumen**: CHF 1.000.000
**Post-Money Bewertung**: CHF 1.800.000
**Aktienkurs für Investoren**:
- 150.000 bestehende Aktien + 214.285 neue Aktien = 364.285 Aktien für Investoren
- **Aktienkurs**: CHF 2,75 pro Aktie
**Aktienstruktur nach Investment**:
- Patrick: 35% → 28,9% (350.000 Aktien)
- Dominic: 15% → 12,4% (150.000 Aktien)
- ValueOn AG: 25% → 20,7% (250.000 Aktien)
- Mitarbeiter-Pool: 10% → 8,3% (100.000 Aktien)
- Investoren: 29,7% (364.285 Aktien)
## Governance und Organisation
### 1. Schlüsselpositionen in der Organisation
- **CEO**: Gesamtführung des Unternehmens
- **CTO**: Verantwortlich für technische Strategie und Produktentwicklung
- **CSO/Vertriebsleitung**: Verantwortlich für Vertrieb und Marktentwicklung
- **COO**: Operative Leitung und Geschäftsprozesse
Die Besetzung dieser Positionen wird unter Berücksichtigung der Kompetenzen von Patrick, Dominic und möglichen neuen Führungskräften festgelegt. Die Rollen von CEO und COO werden im Rahmen der Unternehmensgründung evaluiert.
### 2. Vergütungsstruktur
- **Führungsebene**: Marktübliche Vergütung zwischen CHF 150.000-180.000/Jahr je nach Position
- **Aktienoptionen**: Zusätzliche Aktienoptionen bei Erreichen definierter Unternehmensziele
## Meilensteine und Finanzielle Ziele
### Kritische Meilensteine (18 Monate)
| Zeitpunkt | Meilenstein | KPI |
|-----------|-------------|-----|
| Q3 2025 | Ausgründung & Finanzierung | Abschluss der Seed-Runde |
| Q4 2025 | Markteinführung | 3-5 Pilotprojekte |
| Q1 2026 | Produktvalidierung | 10+ zahlende Kunden |
| Q2 2026 | Skalierung | 15+ zahlende Kunden |
| Q4 2026 | Vorbereitung Serie A | 25+ Kunden, ARR: CHF 0,8 Mio. |
### Umsatz- und Bewertungsprognose
| Jahr | Kunden | ARR (CHF) | Valuation (CHF) | Multiplikator |
|------|--------|-----------|-----------------|---------------|
| Ende 2025 | 5-8 | 0,2 Mio. | 1,8 Mio. | 9x ARR |
| Ende 2026 | 25-30 | 0,8 Mio. | 5,6 Mio. | 7x ARR |
| Ende 2027 | 80-90 | 2,5 Mio. | 15 Mio. | 6x ARR |
| Ende 2028 | 150+ | 4,5 Mio. | 27 Mio. | 6x ARR |
## Liquiditätsoptionen
### Mittelfristige Optionen (2-3 Jahre)
1. **Serie A Finanzierung** (Ende 2026):
- Teilweise Liquidität für Gründer und ValueOn AG (10-15% ihrer Anteile)
- Zu erwartender Wert: CHF 5-6 Mio.
2. **Strategische Partnerschaft**:
- Investment durch strategischen Partner mit teilweisem Aktienrückkauf
- Potenzielle Partner: Enterprise Software-Anbieter, KI-Plattform-Betreiber
### Langfristige Optionen (4-7 Jahre)
1. **Komplette Übernahme**:
- Erwarteter Exit-Wert 2028: CHF 25-30 Mio.
- Vollständige Liquidität für alle Anteilseigner
2. **IPO-Vorbereitung**:
- Bei Erreichen von CHF 10+ Mio. ARR
- Potenzielle Bewertung: CHF 50-70 Mio.
## Nächste Schritte im Ausgründungsprozess
1. **Rechtliche Strukturierung**:
- Gründung der PowerOn AG
- Übertragungsvereinbarungen für geistiges Eigentum
- Aktionärsvereinbarungen
2. **Finanzierung**:
- Erstellung eines detaillierten Businessplans
- Vorbereitung des Investor Pitch Decks
- Ansprache potenzieller Investoren
3. **Organisationsaufbau**:
- Definition der Führungsstruktur und Schlüsselpositionen
- Rekrutierung des Kernteams
- Aufbau der operativen Prozesse
4. **Markteinführungsstrategie**:
- Festlegung der Go-to-Market Strategie
- Identifikation von Pilotprojekten
- Vorbereitung der Vertriebsunterlagen

View file

@ -1,6 +0,0 @@
id,name,email,phone,address,iban,credit_card,ahv_number
1,Max Mustermann,max.mustermann@beispiel.de,+49 30 12345678,Musterstraße 123 12345 Berlin,DE89 3704 0044 0532 0130 00,4532 1234 5678 9012,
2,Peter Schmid,peter.schmid@beispiel.ch,+41 44 123 45 67,Bahnhofstrasse 1 8001 Zürich,CH93 0076 7000 E529 3557 7,4532 1234 5678 9013,756.1234.5678.90
3,Marie Dupont,marie.dupont@exemple.fr,+33 1 23 45 67 89,123 Rue de Paris 75001 Paris,FR76 3000 6000 0112 3456 7890 189,4532 1234 5678 9014,
4,Marco Rossi,marco.rossi@esempio.it,+39 02 1234 5678,Via Roma 123 20100 Milano,IT60 X054 2811 1010 0000 0123 456,4532 1234 5678 9015,
5,John Smith,john.smith@example.com,+44 20 1234 5678,123 High Street London SW1A 1AA,GB29 NWBK 6016 1331 9268 19,4532 1234 5678 9016,
1 id name email phone address iban credit_card ahv_number
2 1 Max Mustermann max.mustermann@beispiel.de +49 30 12345678 Musterstraße 123 12345 Berlin DE89 3704 0044 0532 0130 00 4532 1234 5678 9012
3 2 Peter Schmid peter.schmid@beispiel.ch +41 44 123 45 67 Bahnhofstrasse 1 8001 Zürich CH93 0076 7000 E529 3557 7 4532 1234 5678 9013 756.1234.5678.90
4 3 Marie Dupont marie.dupont@exemple.fr +33 1 23 45 67 89 123 Rue de Paris 75001 Paris FR76 3000 6000 0112 3456 7890 189 4532 1234 5678 9014
5 4 Marco Rossi marco.rossi@esempio.it +39 02 1234 5678 Via Roma 123 20100 Milano IT60 X054 2811 1010 0000 0123 456 4532 1234 5678 9015
6 5 John Smith john.smith@example.com +44 20 1234 5678 123 High Street London SW1A 1AA GB29 NWBK 6016 1331 9268 19 4532 1234 5678 9016

View file

@ -1,73 +0,0 @@
Lebenslauf: Lara Meier
Persönliche Daten:
Name: Lara Meier
Geboren: 15.03.1990
Adresse: Bahnhofstrasse 45, 8001 Zürich
Telefon: +41 44 123 45 67
E-Mail: lara.meier@example.ch
AHV-Nr.: 756.1234.5678.90
Steuernummer: 123.456.789
Berufserfahrung:
2020-2023: Senior Projektmanagerin
Firma: TechSolutions AG
Adresse: Industriestrasse 100, 8004 Zürich
UID: CHE-123.456.789
Telefon: +41 44 987 65 43
E-Mail: lara.meier@techsolutions.ch
In dieser Position leitete ich ein Team von 15 Mitarbeitern und verantwortete die Implementierung von Cloud-Lösungen für internationale Kunden. Meine Hauptaufgaben umfassten:
- Projektplanung und -steuerung mit einem Budget von CHF 2.5 Mio.
- Kundenbetreuung und Stakeholder-Management
- Teamführung und Personalentwicklung
- Qualitätssicherung und Risikomanagement
2015-2020: Projektmanagerin
Firma: Digital Systems GmbH
Adresse: Musterstrasse 123, 8002 Zürich
UID: CHE-987.654.321
Telefon: +41 44 456 78 90
E-Mail: l.meier@digitalsystems.ch
Als Projektmanagerin verantwortete ich die erfolgreiche Durchführung von Digitalisierungsprojekten. Meine Leistungen:
- Implementierung von ERP-Systemen
- Optimierung von Geschäftsprozessen
- Schulung von Endbenutzern
- Erstellung von Projektdokumentation
Ausbildung:
2010-2015: ETH Zürich
Studiengang: Informatik
Matrikelnummer: 12-345-678
Abschluss: Master of Science in Computer Science
Thesis: "Künstliche Intelligenz in der Prozessautomatisierung"
2005-2010: Kantonsschule Zürich
Abschluss: Eidgenössische Maturität
Schwerpunkt: Mathematik und Naturwissenschaften
Sprachen:
Deutsch (Muttersprache)
Englisch (C2)
Französisch (B2)
Italienisch (B1)
Zertifizierungen:
PMP (Project Management Professional)
ITIL v4 Foundation
AWS Certified Solutions Architect
Scrum Master (PSM I)
Referenzen:
Prof. Dr. Hans Müller
ETH Zürich
Department of Computer Science
Telefon: +41 44 123 45 68
E-Mail: hans.mueller@ethz.ch
Dr. Sarah Weber
TechSolutions AG
CTO
Telefon: +41 44 987 65 44
E-Mail: sarah.weber@techsolutions.ch

View file

@ -1,6 +0,0 @@
employee_id,first_name,last_name,email,phone,department,office_address,uid_number,bank_account
E001,Hans,Müller,hans.mueller@firma.de,+49 89 12345678,IT,Hauptstraße 1 80331 München,,DE89 3704 0044 0532 0130 00
E002,Thomas,Weber,thomas.weber@firma.ch,+41 44 234 56 78,HR,Bahnhofstrasse 2 8001 Zürich,CHE-123.456.789,01-234567-8
E003,Sophie,Martin,sophie.martin@entreprise.fr,+33 1 34 56 78 90,Finance,15 Avenue des Champs-Élysées 75008 Paris,,FR76 3000 6000 0112 3456 7890 189
E004,Luca,Ferrari,luca.ferrari@azienda.it,+39 02 2345 6789,Marketing,Via Monte Napoleone 8 20121 Milano,,IT60 X054 2811 1010 0000 0123 456
E005,Emma,Wilson,emma.wilson@company.com,+44 20 2345 6789,Sales,25 Old Street London EC1V 9HL,,GB29 NWBK 6016 1331 9268 19
1 employee_id first_name last_name email phone department office_address uid_number bank_account
2 E001 Hans Müller hans.mueller@firma.de +49 89 12345678 IT Hauptstraße 1 80331 München DE89 3704 0044 0532 0130 00
3 E002 Thomas Weber thomas.weber@firma.ch +41 44 234 56 78 HR Bahnhofstrasse 2 8001 Zürich CHE-123.456.789 01-234567-8
4 E003 Sophie Martin sophie.martin@entreprise.fr +33 1 34 56 78 90 Finance 15 Avenue des Champs-Élysées 75008 Paris FR76 3000 6000 0112 3456 7890 189
5 E004 Luca Ferrari luca.ferrari@azienda.it +39 02 2345 6789 Marketing Via Monte Napoleone 8 20121 Milano IT60 X054 2811 1010 0000 0123 456
6 E005 Emma Wilson emma.wilson@company.com +44 20 2345 6789 Sales 25 Old Street London EC1V 9HL GB29 NWBK 6016 1331 9268 19

View file

@ -1,12 +0,0 @@
Dear Mr. Smith,
Thank you for your email to contact@example.com.
Your contact details have been recorded:
Phone: +44 20 1234 5678
Address: 123 High Street, London SW1A 1AA
Your IBAN: GB29 NWBK 6016 1331 9268 19
Credit Card: 4532 1234 5678 9012
Best regards,
John Doe

View file

@ -1,54 +0,0 @@
{
"customer": {
"personal_info": {
"name": "Max Mustermann",
"email": "max.mustermann@example.com",
"phone": "+49 123 4567890",
"address": {
"street": "Hauptstraße 123",
"city": "München",
"zip": "80331",
"country": "Deutschland"
}
},
"order_history": [
{
"order_id": "ORD-2024-001",
"date": "2024-03-15",
"items": [
{
"product": "Laptop",
"price": 1299.99,
"payment": {
"method": "credit_card",
"card_number": "4111 1111 1111 1111",
"iban": "DE89 3704 0044 0532 0130 00"
}
}
]
}
],
"preferences": {
"language": "de",
"newsletter": true,
"marketing_consent": {
"email": "max.mustermann@example.com",
"phone": "+49 123 4567890"
}
}
},
"company": {
"name": "Tech Solutions GmbH",
"contact": {
"manager": "Dr. Anna Schmidt",
"email": "anna.schmidt@techsolutions.de",
"phone": "+49 89 12345678",
"address": {
"street": "Technologiestraße 45",
"city": "Berlin",
"zip": "10115",
"country": "Deutschland"
}
}
}
}

View file

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<company_data>
<employees>
<employee id="EMP001">
<personal_info>
<name>Dr. Thomas Weber</name>
<email>thomas.weber@company.de</email>
<phone>+49 30 12345678</phone>
<address>
<street>Musterstraße 42</street>
<city>Hamburg</city>
<zip>20095</zip>
<country>Deutschland</country>
</address>
</personal_info>
<employment>
<department>IT</department>
<position>Senior Developer</position>
<salary currency="EUR">75000</salary>
<bank_details>
<iban>DE89 3704 0044 0532 0130 00</iban>
<bic>COBADEFFXXX</bic>
</bank_details>
</employment>
</employee>
<employee id="EMP002">
<personal_info>
<name>Maria Schmidt</name>
<email>maria.schmidt@company.de</email>
<phone>+49 40 98765432</phone>
<address>
<street>Bahnhofstraße 15</street>
<city>Frankfurt</city>
<zip>60329</zip>
<country>Deutschland</country>
</address>
</personal_info>
<employment>
<department>HR</department>
<position>HR Manager</position>
<salary currency="EUR">65000</salary>
<bank_details>
<iban>DE27 3704 0044 0532 0130 01</iban>
<bic>COBADEFFXXX</bic>
</bank_details>
</employment>
</employee>
</employees>
<projects>
<project id="PRJ001">
<name>Digital Transformation</name>
<manager>Dr. Thomas Weber</manager>
<budget currency="EUR">150000</budget>
<team_members>
<member email="thomas.weber@company.de">Dr. Thomas Weber</member>
<member email="maria.schmidt@company.de">Maria Schmidt</member>
</team_members>
</project>
</projects>
<company_info>
<name>Tech Innovations GmbH</name>
<address>
<street>Innovationsstraße 1</street>
<city>München</city>
<zip>80331</zip>
<country>Deutschland</country>
</address>
<contact>
<email>info@techinnovations.de</email>
<phone>+49 89 12345678</phone>
<fax>+49 89 12345679</fax>
</contact>
<banking>
<iban>DE89 3704 0044 0532 0130 02</iban>
<bic>COBADEFFXXX</bic>
<tax_id>DE123456789</tax_id>
</banking>
</company_info>
</company_data>

View file

@ -1,12 +0,0 @@
Bonjour Madame Dupont,
Merci pour votre email à contact@exemple.fr.
Vos coordonnées ont été enregistrées:
Téléphone: +33 1 23 45 67 89
Adresse: 123 Rue de Paris, 75001 Paris
Votre IBAN: FR76 3000 6000 0112 3456 7890 189
Carte de crédit: 4532 1234 5678 9012
Cordialement,
Jean Martin

View file

@ -1,12 +0,0 @@
Sehr geehrte Frau Müller,
vielen Dank für Ihre E-Mail an max.mustermann@beispiel.de.
Ihre Telefonnummer 030-12345678 wurde in unserem System hinterlegt.
Die Rechnung wird an folgende Adresse gesendet:
Musterstraße 123, 12345 Berlin
Ihre IBAN: DE89 3704 0044 0532 0130 00
Kreditkarte: 4532 1234 5678 9012
Mit freundlichen Grüßen
Max Mustermann

View file

@ -1,56 +0,0 @@
Geschäftsstrategie 2024-2026
TechSolutions AG
Unternehmensdaten:
Firmenname: TechSolutions AG
UID: CHE-123.456.789
Adresse: Industriestrasse 100, 8004 Zürich
Telefon: +41 44 987 65 43
E-Mail: info@techsolutions.ch
Website: www.techsolutions.ch
Geschäftsführung:
CEO: Dr. Thomas Weber
E-Mail: thomas.weber@techsolutions.ch
Telefon: +41 44 987 65 44
CTO: Dr. Sarah Müller
E-Mail: sarah.mueller@techsolutions.ch
Telefon: +41 44 987 65 45
Finanzdaten:
Bank: UBS AG
IBAN: CH93 0076 7000 E529 0767 9
BIC: UBSWCHZH80A
Strategische Ziele:
1. Marktpositionierung
- Marktanteil in der Schweiz auf 25% steigern
- Expansion in DACH-Region
- Neue Zielgruppe: KMU
2. Produktentwicklung
- Cloud-Lösung für KMU
- KI-basierte Automatisierung
- Mobile App für Kunden
3. Personalentwicklung
- Team auf 50 Mitarbeiter ausbauen
- Neue Standorte: Bern und Genf
- Fokus auf Diversity & Inclusion
4. Nachhaltigkeit
- CO2-Neutralität bis 2025
- Green IT Zertifizierung
- Nachhaltige Lieferkette
Budgetplanung:
2024: CHF 5.2 Mio.
2025: CHF 6.8 Mio.
2026: CHF 8.5 Mio.
Risikoanalyse:
- Marktrisiken
- Technologische Risiken
- Personelle Risiken
- Finanzielle Risiken

View file

@ -1,6 +0,0 @@
geschäft_id,datum,kundenname,kundenemail,betrag,zahlungsmethode,zahlungsdetails,lieferadresse
G001,2024-03-15,Anna Schmidt,anna.schmidt@kunde.de,1250,50,IBAN,DE89 3704 0044 0532 0130 00,Kirchstraße 10 10115 Berlin
G002,2024-03-15,Franz Huber,franz.huber@kunde.de,890,75,IBAN,DE02 5001 0517 5407 3249 31,Seefeldstraße 5 10117 Berlin
G003,2024-03-15,Pierre Dubois,pierre.dubois@kunde.de,2340,25,IBAN,DE27 2005 0550 1045 1862 37,15 Rue de la Paix 10115 Berlin
G004,2024-03-15,Giovanni Bianchi,giovanni.bianchi@kunde.de,1750,00,IBAN,DE02 5001 0517 5407 3249 32,Via della Spiga 20 10115 Berlin
G005,2024-03-15,William Brown,william.brown@kunde.de,3200,50,IBAN,DE02 5001 0517 5407 3249 33,42 Oxford Street 10115 Berlin
1 geschäft_id,datum,kundenname,kundenemail,betrag,zahlungsmethode,zahlungsdetails,lieferadresse
2 G001,2024-03-15,Anna Schmidt,anna.schmidt@kunde.de,1250,50,IBAN,DE89 3704 0044 0532 0130 00,Kirchstraße 10 10115 Berlin
3 G002,2024-03-15,Franz Huber,franz.huber@kunde.de,890,75,IBAN,DE02 5001 0517 5407 3249 31,Seefeldstraße 5 10117 Berlin
4 G003,2024-03-15,Pierre Dubois,pierre.dubois@kunde.de,2340,25,IBAN,DE27 2005 0550 1045 1862 37,15 Rue de la Paix 10115 Berlin
5 G004,2024-03-15,Giovanni Bianchi,giovanni.bianchi@kunde.de,1750,00,IBAN,DE02 5001 0517 5407 3249 32,Via della Spiga 20 10115 Berlin
6 G005,2024-03-15,William Brown,william.brown@kunde.de,3200,50,IBAN,DE02 5001 0517 5407 3249 33,42 Oxford Street 10115 Berlin

View file

@ -1,13 +0,0 @@
Buongiorno Signora Rossi,
Grazie per la sua email a info@esempio.it.
Grazie per la sua email a info@esempio.it .
I suoi dati di contatto sono stati registrati:
Telefono: +39 02 1234 5678
Indirizzo: Via Roma 123, 20100 Milano
Il suo IBAN: IT60 X054 2811 1010 0000 0123 456
Carta di credito: 4532 1234 5678 9012
Cordiali saluti,
Marco Bianchi

View file

@ -1,6 +0,0 @@
kunden_id,vorname,nachname,email,telefon,adresse,iban,kreditkarte,steuernummer
K001,Michael,Schmidt,michael.schmidt@kunde.de,+49 30 12345678,Musterstraße 123 12345 Berlin,DE89 3704 0044 0532 0130 00,4532 1234 5678 9012,12/345/67890
K002,Sabine,Weber,sabine.weber@kunde.de,+49 89 23456789,Hauptstraße 45 80331 München,DE02 5001 0517 5407 3249 31,4532 1234 5678 9013,98/765/43210
K003,Thomas,Müller,thomas.mueller@kunde.de,+49 40 34567890,Neue Straße 78 20095 Hamburg,DE27 2005 0550 1045 1862 37,4532 1234 5678 9014,45/678/90123
K004,Petra,Fischer,petra.fischer@kunde.de,+49 69 45678901,Frankfurter Ring 12 60313 Frankfurt,DE02 5001 0517 5407 3249 32,4532 1234 5678 9015,34/567/89012
K005,Klaus,Wagner,klaus.wagner@kunde.de,+49 211 56789012,Königsallee 92 40212 Düsseldorf,DE02 5001 0517 5407 3249 33,4532 1234 5678 9016,23/456/78901
1 kunden_id vorname nachname email telefon adresse iban kreditkarte steuernummer
2 K001 Michael Schmidt michael.schmidt@kunde.de +49 30 12345678 Musterstraße 123 12345 Berlin DE89 3704 0044 0532 0130 00 4532 1234 5678 9012 12/345/67890
3 K002 Sabine Weber sabine.weber@kunde.de +49 89 23456789 Hauptstraße 45 80331 München DE02 5001 0517 5407 3249 31 4532 1234 5678 9013 98/765/43210
4 K003 Thomas Müller thomas.mueller@kunde.de +49 40 34567890 Neue Straße 78 20095 Hamburg DE27 2005 0550 1045 1862 37 4532 1234 5678 9014 45/678/90123
5 K004 Petra Fischer petra.fischer@kunde.de +49 69 45678901 Frankfurter Ring 12 60313 Frankfurt DE02 5001 0517 5407 3249 32 4532 1234 5678 9015 34/567/89012
6 K005 Klaus Wagner klaus.wagner@kunde.de +49 211 56789012 Königsallee 92 40212 Düsseldorf DE02 5001 0517 5407 3249 33 4532 1234 5678 9016 23/456/78901

View file

@ -1,6 +0,0 @@
mitarbeiter_id,vorname,nachname,email,telefon,abteilung,büroadresse,steuernummer,sozialversicherungsnummer
M001,Andreas,Becker,andreas.becker@firma.de,+49 30 98765432,IT,Hauptstraße 1 10115 Berlin,12/345/67890,12 345678 901
M002,Monika,Hoffmann,monika.hoffmann@firma.de,+49 89 87654321,HR,Leopoldstraße 45 80802 München,98/765/43210,98 765432 102
M003,Frank,Schäfer,frank.schaefer@firma.de,+49 40 76543210,Finanzen,Neuer Wall 78 20354 Hamburg,45/678/90123,45 678901 203
M004,Susanne,Koch,susanne.koch@firma.de,+49 69 65432109,Marketing,Mainzer Landstraße 12 60329 Frankfurt,34/567/89012,34 567890 304
M005,Dieter,Richter,dieter.richter@firma.de,+49 211 54321098,Vertrieb,Königsallee 92 40212 Düsseldorf,23/456/78901,23 456789 405
1 mitarbeiter_id vorname nachname email telefon abteilung büroadresse steuernummer sozialversicherungsnummer
2 M001 Andreas Becker andreas.becker@firma.de +49 30 98765432 IT Hauptstraße 1 10115 Berlin 12/345/67890 12 345678 901
3 M002 Monika Hoffmann monika.hoffmann@firma.de +49 89 87654321 HR Leopoldstraße 45 80802 München 98/765/43210 98 765432 102
4 M003 Frank Schäfer frank.schaefer@firma.de +49 40 76543210 Finanzen Neuer Wall 78 20354 Hamburg 45/678/90123 45 678901 203
5 M004 Susanne Koch susanne.koch@firma.de +49 69 65432109 Marketing Mainzer Landstraße 12 60329 Frankfurt 34/567/89012 34 567890 304
6 M005 Dieter Richter dieter.richter@firma.de +49 211 54321098 Vertrieb Königsallee 92 40212 Düsseldorf 23/456/78901 23 456789 405

View file

@ -1,13 +0,0 @@
Guten Tag Herr Schmid
Vielen Dank für Ihre Anfrage an info@beispiel.ch.
Ihre Kontaktdaten wurden wie folgt erfasst:
Telefon: +41 44 123 45 67
Adresse: Bahnhofstrasse 1, 8001 Zürich
Ihre AHV-Nummer: 756.1234.5678.90
UID-Nummer: CHE-123.456.789
Bankkonto: 01-234567-8
Mit freundlichen Grüßen
Peter Muster

View file

@ -1,6 +0,0 @@
transaction_id,date,customer_name,customer_email,amount,payment_method,payment_details,shipping_address
T001,2024-03-15,Anna Schmidt,anna.schmidt@kunde.de,1250.50,IBAN,DE89 3704 0044 0532 0130 00,Kirchstraße 10 10115 Berlin
T002,2024-03-15,Franz Huber,franz.huber@kunde.ch,890.75,AHV,756.1234.5678.90,Seefeldstrasse 5 8008 Zürich
T003,2024-03-15,Pierre Dubois,pierre.dubois@client.fr,2340.25,IBAN,FR76 3000 6000 0112 3456 7890 189,15 Rue de la Paix 75002 Paris
T004,2024-03-15,Giovanni Bianchi,giovanni.bianchi@cliente.it,1750.00,IBAN,IT60 X054 2811 1010 0000 0123 456,Via della Spiga 20 20121 Milano
T005,2024-03-15,William Brown,william.brown@customer.com,3200.50,IBAN,GB29 NWBK 6016 1331 9268 19,42 Oxford Street London W1D 2BJ
1 transaction_id date customer_name customer_email amount payment_method payment_details shipping_address
2 T001 2024-03-15 Anna Schmidt anna.schmidt@kunde.de 1250.50 IBAN DE89 3704 0044 0532 0130 00 Kirchstraße 10 10115 Berlin
3 T002 2024-03-15 Franz Huber franz.huber@kunde.ch 890.75 AHV 756.1234.5678.90 Seefeldstrasse 5 8008 Zürich
4 T003 2024-03-15 Pierre Dubois pierre.dubois@client.fr 2340.25 IBAN FR76 3000 6000 0112 3456 7890 189 15 Rue de la Paix 75002 Paris
5 T004 2024-03-15 Giovanni Bianchi giovanni.bianchi@cliente.it 1750.00 IBAN IT60 X054 2811 1010 0000 0123 456 Via della Spiga 20 20121 Milano
6 T005 2024-03-15 William Brown william.brown@customer.com 3200.50 IBAN GB29 NWBK 6016 1331 9268 19 42 Oxford Street London W1D 2BJ

View file

@ -1,157 +0,0 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Daten-Neutralisierer Logik</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 40px;
color: #333;
}
h1, h2, h3 {
color: #2c3e50;
}
.pattern-group {
margin: 20px 0;
padding: 15px;
border: 1px solid #ddd;
border-radius: 5px;
}
.pattern {
margin: 10px 0;
padding: 10px;
background-color: #f8f9fa;
border-left: 4px solid #2c3e50;
}
.languages {
color: #666;
font-style: italic;
}
.replacement {
color: #27ae60;
font-weight: bold;
}
</style>
</head>
<body>
<h1>Daten-Neutralisierer Logik</h1>
<p>Der Daten-Neutralisierer unterstützt die Anonymisierung von sensiblen Daten in verschiedenen Dateiformaten (TXT, JSON, CSV, XML, DOCX) und Sprachen (DE, EN, FR, IT).</p>
<h2>1. Unterstützte Dateiformate</h2>
<ul>
<li>CSV-Dateien</li>
<li>JSON-Dateien</li>
<li>XML-Dateien</li>
<li>Text-Dateien (TXT)</li>
<li>Word-Dokumente (DOCX)</li>
</ul>
<h2>2. Neutralisierungsmuster</h2>
<div class="pattern-group">
<h3>Personenbezogene Daten</h3>
<div class="pattern">
<h4>Vornamen</h4>
<p>Deutsch: vorname, vornamen, rufname, taufname</p>
<p>Englisch: first name, given name, forename, personal name</p>
<p>Französisch: prénom, prénoms, nom de baptême</p>
<p>Italienisch: nome, nome di battesimo</p>
<p class="replacement">Ersetzung: NAME_{uuid}</p>
</div>
<div class="pattern">
<h4>Nachnamen</h4>
<p>Deutsch: nachname, nachnamen, familienname, familiennamen, zuname, zunamen</p>
<p>Englisch: last name, family name, surname, second name</p>
<p>Französisch: nom de famille, nom, noms</p>
<p>Italienisch: cognome, cognomi</p>
<p class="replacement">Ersetzung: NAME_{uuid}</p>
</div>
<div class="pattern">
<h4>Namen mit Titel</h4>
<p>Muster: Herr/Frau/Mr./Mrs./Ms./Monsieur/Madame/Signore/Signora/Dr./Prof.</p>
<p class="replacement">Ersetzung: NAME_{uuid}</p>
</div>
</div>
<div class="pattern-group">
<h3>Kontaktdaten</h3>
<div class="pattern">
<h4>E-Mail-Adressen</h4>
<p>Muster: [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}</p>
<p class="replacement">Ersetzung: EMAIL_{uuid}</p>
</div>
<div class="pattern">
<h4>Telefonnummern</h4>
<p>Allgemein: (+XXX)? (XXX) XXX-XXXX</p>
<p>Deutsch: (+49|0049|0) XXX XXXXXXX</p>
<p>Schweiz: (+41|0041|0) XXX XXX XX XX</p>
<p class="replacement">Ersetzung: PHONE_{uuid}</p>
</div>
</div>
<div class="pattern-group">
<h3>Finanzielle Daten</h3>
<div class="pattern">
<h4>IBAN</h4>
<p>Muster: [A-Z]{2}\d{2}[A-Z0-9]{4}\d{7}([A-Z0-9]?){0,16}</p>
<p class="replacement">Ersetzung: IBAN_{uuid}</p>
</div>
<div class="pattern">
<h4>Kreditkartennummern</h4>
<p>Muster: XXXX-XXXX-XXXX-XXXX</p>
<p class="replacement">Ersetzung: CREDITCARD_{uuid}</p>
</div>
</div>
<div class="pattern-group">
<h3>Adressdaten</h3>
<div class="pattern">
<h4>Vollständige Adressen</h4>
<p>Muster: Straßenname + Hausnummer + PLZ + Stadt</p>
<p class="replacement">Ersetzung: ADDRESS_{uuid}</p>
</div>
<div class="pattern">
<h4>Städte und Orte</h4>
<p>Muster: Stadtnamen mit typischen Endungen (-stadt, -dorf, -berg, etc.)</p>
<p class="replacement">Ersetzung: CITY_{uuid}</p>
</div>
</div>
<h2>3. Verarbeitungslogik</h2>
<ol>
<li>Datei wird basierend auf dem Dateityp eingelesen</li>
<li>Bei Tabellendaten (CSV, JSON, XML):
<ul>
<li>Header werden analysiert und Spaltentypen identifiziert</li>
<li>Daten in den Spalten werden entsprechend dem Spaltentyp neutralisiert</li>
</ul>
</li>
<li>Bei Textdaten:
<ul>
<li>Text wird nach Tabellenstrukturen analysiert</li>
<li>Gefundene Tabellen werden wie oben verarbeitet</li>
<li>Verbleibender Text wird nach Mustern durchsucht</li>
</ul>
</li>
<li>Alle Ersetzungen werden in einer Mapping-Datei protokolliert</li>
</ol>
<h2>4. Logging und Tracking</h2>
<ul>
<li>Mapping-Log: Protokolliert alle durchgeführten Ersetzungen</li>
<li>Replacements-Log: Speichert Original- und anonymisierte Werte</li>
<li>Alle Aktionen werden mit Zeitstempel und Dateiname dokumentiert</li>
</ul>
</body>
</html>