Script: Projekt kopieren

Inhalt

Erstellt ein neues Projekt und übernimmt die Werte eines bestehenden Projektes.

Als Projektleiter wird der Benutzer eingefügt, der das Script ausführt.

Es werden alle Werte ausser Leistungen, Spesen und Vorschüsse übernommen. Auch inhaltliche Angaben wie Ordnerreferenzen werden nicht übernommen.

Übernimmt die Phasen in der richtigen Reihenfolge sowie die verschiedenen Zuordnungen und Berechtigungen. Ausserdem werden Phasenbudgets übernommen (ohne BudgetChange-Objekte).

Der Name des neuen Projektes kann eingegeben werden. Das neue Projekt wird inaktiv gesetzt.

Ausführen

Auf dem Projekt, das kopiert werden soll. Bitte verwenden Sie jeweils das Script, welches zu Ihrer aktuellen Vertec Version passt.

Versionen

Vertec VersionBesonderheiten VersionScript
Version 3.1.7.x - 3.1.8.x

GenericLinks werden nicht übernommen.

Der Projektcode wird kopiert und mit "(Kopie)" versehen. Es kann noch kein Name angegeben werden.

ProjektKopieren30.txt
Version 4.0 bis Version 4.3.

Übernimmt die Phasen in der richtigen Reihenfolge sowie die Bearbeiterzuordnungen und zugeordneten Tätigkeiten.

Der Name des neuen Projektes kann eingegeben werden. Das neue Projekt wird inaktiv gesetzt.

ProjektKopieren40.txt
Ab Version 4.3 Das Feld privDocPfad gibt es nicht mehr ProjektKopieren43.txt
Ab Version 5.0 Berücksichtigt die Zuordnung von Auslagen- und Spesentypen zu Phasen ProjektKopieren50.txt
Ab Version 5.2 Berücksichtigt die neue Zuordnung von Tätigkeiten zu Phasen. Kopiert neu Zusatzfelder. ProjektKopieren52.txt
Ab Version 5.2.6 Berücksichtigt das Member xMwstTyp ProjektKopieren526.txt
Ab Version 5.3 Berücksichtigt planWertInt (Budgetwert internes Honorar) ProjektKopieren53.txt
Ab Version 5.5 Kopiert neu auch GenericLinks. ProjektKopieren55.txt
Ab Version 5.6

Berücksichtigt Bearbeiterstufe auf BearbeiterPhaseLink und die Zuordnung Bearbeiter auf ProjekteintragstypPhaseLink.

Das Kopieren von CustomLinks ist zur Zeit noch nicht möglich.

ProjektKopieren56.txt
Ab Version 5.8

BearbeiterLink (neu als UserEintrag), ProjektberichtLink kopiert auch berichtName und automatischDrucken. Ruft die Funktionen msgbox und inputbox direkt auf dem Vertec Objekt auf. Kopiert auch CustomLinks.

ProjektKopieren58.txt
Ab Version 6.0

Member der automatischen Rechnungsstellung entfernt, Verflechtungen 1 und 2 sowie Gegenverflechtungen 1 und 2 zusammengeführt; Berichte und Projektberichtlinks entfernt.

Projektkopieren60.txt

Scripttext

Ein Scripttext wird hier dargestellt, um die Volltextsuche zu ermöglichen. Es handelt sich dabei um den neusten Scripttext, aktuell Version 6.0.

'---Bezeichnung: Projekt kopieren
'   Klassen: Projekt
'   CondExpression:
'   ObjectScript: Y
'   ContainerScript: N
'   EventType: Kein
'   EventClass:
'   EventMembers:
'   ExtendedRights: N
'---Kopiert das ausgewählte Projekt.
'---07.01.2010, IB: Script angepasst bzw. erweitert. Genericlinks werden auch kopiert.
'---05.07.2011, SR: Version 5.6: Bearbeiterstufe auf BearbeiterPhaseLink. Bearbeiter auf ProjekteintragstypPhaseLink.
'---26.08.2011 IB(DL): Zusatzfelder Phasen Auslage- und Tätigkeitstypen werden auch kopiert
'---28.11.2011, SR: Kopiert orderidx auf Projektphasen, projektnummer auf Projekt,
'                   Zusatzfelder auf BearbeiterPhaseLinks. Vereinfachung Evaluierung der Zusatzfeldklassen.
'---03.01.2012, SR: Evaluierung des Projektnamens nach der Überprüfung des aktuellen Objekts.
'            Code umformatiert und lesbarer gemacht.
'---25.09.2013, CR: Anpassung BearbeiterLink (neu als UserEintrag),
'                   ProjektberichtLink kopiert auch berichtName und automatischDrucken.
'---03.12.2013, SR: msgbox und inputbox durch vertec.msgbox und vertec.inputbox ersetzt.
'---14.02.2014, MR: bei Projekt xAnsatz... Werte und kst ergänzt.
'---23.09.2014, MW: CustomLinks kopieren.
'---19.01.2015, RS: Phasenmember um Boolean Zuordnungsmember ergänzt.
'---15.03.2016, PH: Member der automatischen Rechnungsstellung entfernt, Verflechtungen 1 und 2
'                   sowie Gegenverflechtungen 1 und 2 zusammengeführt; Berichte und Projektberichtlinks entfernt.
'   Version = 123
option explicit

Sub CopyBoolean (Target, Source, Member)
    if cstr(Source.member(member))<>"" then
        target.member(Member) = source.Member(Member)
    end if
end sub

Sub CopyZusatzfelder (oldphase, newphase, classname)
    dim zusatzfeldlist
    dim zusatzfeldname
    dim i

    'Suche alle Zusatzfelder einer bestimmten Klasse
    set zusatzfeldlist = oldphase.eval("zusatzfelder.metaZusatzfeld")
    for i = 0 to zusatzfeldlist.count-1
        zusatzfeldname = zusatzfeldlist.objects(i).eval("fieldname")
        newphase.zusatzfeldasvariant(zusatzfeldname) = oldphase.zusatzfeldasvariant(zusatzfeldname)
    next
end sub

Sub CopyPhasenMembers (oldphase, newphase)
    newphase.member("code") = oldphase.member("code")
    newphase.member("orderidx") =  oldphase.member("orderidx")
    newphase.member("verantwortlicher") = oldphase.member("verantwortlicher")
    newphase.member("xAktiv") = oldphase.member("xAktiv")
    newphase.member("verrechenbar") = oldphase.member("verrechenbar")
    newphase.member("Beschreibung") = oldphase.member("Beschreibung")
    newphase.member("xEndDatum") = oldphase.member("xEndDatum")
    newphase.member("xStartDatum") = oldphase.member("xStartDatum")
    newphase.member("xPlanWertExt") = oldphase.member("xPlanWertExt")
    newphase.member("xPlanMinutenInt") = oldphase.member("xPlanMinutenInt")
    newphase.member("xPlanSpesenWert") = oldphase.member("xPlanSpesenWert")
    newphase.member("AnsatzBearbeiter") = oldphase.member("AnsatzBearbeiter")
    newphase.member("AnsatzExt") = oldphase.member("AnsatzExt")
    newphase.member("ErtragskontoSpesen") = oldphase.member("ErtragskontoSpesen")
    newphase.member("Status") = oldphase.member("Status")
    newphase.member("ErtragskontoAuslagen") = oldphase.member("ErtragskontoAuslagen")
    newphase.member("PauschalAuslagen") = oldphase.member("PauschalAuslagen")
    CopyBoolean newphase, oldphase, "xAuslagenWeiterleiten"
    newphase.member("KostenstelleSpesen") = oldphase.member("KostenstelleSpesen")
    newphase.member("xPlanKostenAuslagen") = oldphase.member("xPlanKostenAuslagen")
    newphase.member("pauschal") = oldphase.member("pauschal")
    newphase.member("TagesPauschaleExt") = oldphase.member("TagesPauschaleExt")
    newphase.member("PauschalSpesen") = oldphase.member("PauschalSpesen")
    newphase.member("KostenstelleAuslagen") = oldphase.member("KostenstelleAuslagen")
    newphase.member("AnsatzKosten") = oldphase.member("AnsatzKosten")
    newphase.member("KostenstelleLeistungen") = oldphase.member("KostenstelleLeistungen")
    newphase.member("ErtragskontoLeistungen") = oldphase.member("ErtragskontoLeistungen")
    newphase.member("xMinPlanWertLeist") = oldphase.member("xMinPlanWertLeist")
    newphase.member("xMinPlanWertSpesen") = oldphase.member("xMinPlanWertSpesen")
    newphase.member("xPlanKostenLeistung") = oldphase.member("xPlanKostenLeistung")
    newphase.member("xMaxPlanWertLeist") = oldphase.member("xMaxPlanWertLeist")
    newphase.member("xPlanKostenSpesen") = oldphase.member("xPlanKostenSpesen")
    newphase.member("xMaxPlanWertSpesen") = oldphase.member("xMaxPlanWertSpesen")
    newphase.member("xPlanAuslagenWert") = oldphase.member("xPlanAuslagenWert")
    newphase.member("bearbeiterZuordnung") = oldphase.member("bearbeiterZuordnung")
    newphase.member("taetigkeitenZuordnung") = oldphase.member("taetigkeitenZuordnung")
    newphase.member("spesentypenZuordnung") = oldphase.member("spesentypenZuordnung")
    newphase.member("auslagetypenZuordnung") = oldphase.member("auslagetypenZuordnung")
    
    

End Sub

sub AddSubphasen (oldphase, newphase)
    dim oldsubphase
    dim newsubphase
    dim sublist
    dim k

    set sublist = oldphase.eval("subphasen")
    for k = 0 to sublist.count-1
        set oldsubphase = sublist.objects(k)
        set newsubphase = Vertec.createobject("Projektphase")
        newsubphase.member("parentphase") = newphase
        CopyPhasenMembers oldsubphase, newsubphase
        CopyZusatzfelder oldsubphase, newsubphase, "ProjektPhase"
        call CopyPhasenBearbeiter (oldsubphase, newsubphase)
        call CopyPhasenTaetigkeiten (oldsubphase, newsubphase)
        call CopyPhasenSpesentypen (oldsubphase, newsubphase)
        call CopyPhasenAuslagentypen (oldsubphase, newsubphase)
        AddSubphasen oldsubphase, newsubphase
    next
end sub

sub CopyPhasenSpesentypen (oldphase, newphase)
    dim srcList
    dim trgList
    dim ii

    set srcList = oldphase.eval("self.spesentypphaselink")
    for ii = 0 to srcList.count - 1
        set trgList = Vertec.CreateObject("SpesenTypPhaseLink")
        trgList.member("minPlanWertSpesen") = srcList.Objects(ii).member("minPlanWertSpesen")
        trgList.member("maxPlanWertSpesen") = srcList.Objects(ii).member("maxPlanWertSpesen")
        trgList.member("planKostenSpesen") = srcList.Objects(ii).member("planKostenSpesen")
        trgList.member("planWertSpesen") = srcList.Objects(ii).member("planWertSpesen")
        trgList.member("wertproeinheitext") = srcList.Objects(ii).member("wertproeinheitext")
        trgList.member("wertproeinheitint") = srcList.Objects(ii).member("wertproeinheitint")
        trgList.member("wertproeinheitkosten") = srcList.Objects(ii).member("wertproeinheitkosten")
        trgList.member("bezeichnung") = srcList.Objects(ii).member("bezeichnung")
        trgList.member("offertText") = srcList.Objects(ii).Member("offertText")
        set trgList.member("phasen") = newphase
        set trgList.member("spesentypen") = srcList.objects(ii).member("spesentypen")
        set trgList.member("bearbeiter") = srcList.objects(ii).member("bearbeiter")
    next
end sub

sub CopyPhasenAuslagentypen (oldphase, newphase)
    dim srcList
    dim trgList
    dim ii

    set srcList = oldphase.eval("self.auslagetypphaselink")
    for ii=0 to srcList.count - 1
        set trgList = Vertec.CreateObject("AuslageTypPhaseLink")
        trgList.member("minPlanWertAuslagen") = srcList.Objects(ii).member("minPlanWertAuslagen")
        trgList.member("PlanWertAuslagen") = srcList.Objects(ii).member("PlanWertAuslagen")
        trgList.member("maxPlanWertAuslagen") = srcList.Objects(ii).member("maxPlanWertAuslagen")
        trgList.member("PlanKostenAuslagen") = srcList.Objects(ii).member("PlanKostenAuslagen")
        trgList.member("maxPlanKostenAuslagen") = srcList.Objects(ii).member("maxPlanKostenAuslagen")
        trgList.member("minPlanKostenAuslagen") = srcList.Objects(ii).member("minPlanKostenAuslagen")
        trgList.member("wertproeinheitext") = srcList.Objects(ii).member("wertproeinheitext")
        trgList.member("wertproeinheitint") = srcList.Objects(ii).member("wertproeinheitint")
        trgList.member("wertproeinheitkosten") = srcList.Objects(ii).member("wertproeinheitkosten")
        trgList.member("bezeichnung") = srcList.Objects(ii).member("bezeichnung")
        trgList.member("offertText") = srcList.Objects(ii).Member("offertText")
        set trgList.member("phasen") = newphase
        set trgList.member("auslagetypen") = srcList.objects(ii).member("auslagetypen")
        set trgList.member("bearbeiter") = srcList.objects(ii).member("bearbeiter")
        CopyZusatzfelder srcList.objects(ii), trgList, "AuslageTypPhaseLink"
    next
end sub

sub CopyPhasenBearbeiter (oldphase, newphase)
    dim srcList
    dim trgList
    dim ii

    set srcList = oldphase.eval("bearbeiterphasen")
    for ii=0 to srcList.count - 1
       set trgList = Vertec.CreateObject("BearbeiterPhaseLink")
       trgList.member("Ansatzkosten") = srcList.Objects(ii).Member("Ansatzkosten")
       trgList.member("AnsatzBearbeiter") = srcList.Objects(ii).Member("AnsatzBearbeiter")
       trgList.member("TagesPauschaleExt") = srcList.Objects(ii).Member("TagesPauschaleExt")
       trgList.member("AnsatzExt") = srcList.Objects(ii).Member("AnsatzExt")
       trgList.member("Bearbeiter") = srcList.Objects(ii).Member("Bearbeiter")
       trgList.member("Bearbeiterstufe") = srcList.Objects(ii).Member("Bearbeiterstufe")
       newphase.member("Bearbeiterphasen").Add(trgList)
       CopyZusatzfelder srcList.objects(ii), trgList, "BearbeiterPhaseLink"
    next
end sub

sub CopyPhasenTaetigkeiten (oldphase, newphase)
    dim srcList
    dim trgList
    dim ii

    set srcList = oldphase.eval("taetigkeitphaselink")
    for ii=0 to srcList.count - 1
        set trgList = Vertec.CreateObject("TaetigkeitPhaseLink")
        trgList.member("planWertLeist") = srcList.Objects(ii).Member("planWertLeist")
        trgList.member("minPlanWertLeist") = srcList.Objects(ii).Member("minPlanWertLeist")
        trgList.member("stueckwert") = srcList.Objects(ii).Member("stueckwert")
        trgList.member("planWertLeist") = srcList.Objects(ii).Member("planWertLeist")
        trgList.member("tagesPauschaleExt") = srcList.Objects(ii).Member("tagesPauschaleExt")
        trgList.member("bezeichnung") = srcList.Objects(ii).Member("bezeichnung")
        trgList.member("ansatzExt") = srcList.Objects(ii).Member("ansatzExt")
        trgList.member("planMinutenInt") = srcList.Objects(ii).Member("planMinutenInt")
        trgList.member("maxPlanWertLeist") = srcList.Objects(ii).Member("maxPlanWertLeist")
        trgList.member("ansatzKosten") = srcList.Objects(ii).Member("ansatzKosten")
        trgList.member("ansatzBearbeiter") = srcList.Objects(ii).Member("ansatzBearbeiter")
        trgList.member("offertText") = srcList.Objects(ii).Member("offertText")
        set trgList.member("phasen") = newphase
        set trgList.member("taetigkeiten") = srcList.objects(ii).member("taetigkeiten")
        set trgList.member("bearbeiter") = srcList.objects(ii).member("bearbeiter")
        CopyZusatzfelder srcList.objects(ii), trgList, "TaetigkeitPhaseLink"
next
end sub

sub main
    Dim Name
    Dim source, target
    Dim adrlist1, adrlist2
    Dim i
    Dim srcList, trgList
    Dim phasenlist
    Dim oldphase, newphase
    dim BearbeiterLink

    'Überprüfe das aktuelle Objekt
    set source = Vertec.argobject
    if not source.IsOfType("Projekt") then
       Vertec.Msgbox "Sie müssen dieses Script auf einem einzelnen Projekt ausführen"
       Exit Sub
    end if

    'Evaluiere den Namen des neuen Projekts
    Name = Vertec.inputbox ("Vertec","Name des neuen Projektes:","")
    if Name = "" then exit sub

    'Erzeuge das Projekt und übernehme alle Werte
    set target = Vertec.createObject("Projekt")
    target.member("aktiv") = false
    target.Member("code") = Name
    target.member("sprache") = source.Member("sprache")
    CopyZusatzfelder source, target, "Projekt"

    target.member("xkostenstelleleistungen") = source.Member("xkostenstelleleistungen")
    target.member("xkostenstellespesen") = source.Member("xkostenstellespesen")
    target.member("xkostenstelleAuslagen") = source.Member("xkostenstelleAuslagen")
    target.member("xErtragskontoLeistungen") = source.Member("xErtragskontoLeistungen")
    target.member("xErtragskontoAuslagen") = source.Member("xErtragskontoAuslagen")
    target.member("xErtragskontoSpesen") = source.Member("xErtragskontoSpesen")

    target.member("xAnsatzExt") = source.member("xAnsatzExt")
    target.member("xAnsatzKosten") = source.member("xAnsatzKosten")
    target.member("xAnsatzBearbeiter") = source.member("xAnsatzBearbeiter")

    target.member("xDatenbankFibu") = source.member("xDatenbankFibu")
    target.member("xLoginFibu") = source.member("xLoginFibu")
    target.member("xPasswordFibu") = source.member("xPasswordFibu")
    target.member("xpersonenKonto") = source.Member("xpersonenKonto")
    target.member("kontaktPerson") = source.Member("kontaktPerson")
    target.member("Typ") = source.Member("Typ")
    target.member("rechnungsintervall") = source.Member("rechnungsintervall")
    target.member("bemerkung") = source.Member("bemerkung")
    target.member("xmwsttyp") = source.Member("xmwsttyp")
    target.member("betreffend") = source.Member("betreffend")
    target.member("xkostenstelleleistungen") = source.Member("xkostenstelleleistungen")
    target.member("projektleiter") = Vertec.user
    target.member("hb") = source.Member("hb")
    target.member("hbstv") = source.Member("hbstv")
    target.member("sekr") = source.Member("sekr")
    target.member("kunde") = source.Member("kunde")
    target.member("xrechnungsadresse") = source.Member("xrechnungsadresse")
    target.member("beschrieb") = source.Member("beschrieb")
    target.member("waehrung") = source.Member("waehrung")
    target.member("tarifstufe") = source.member("tarifstufe")
    target.member("projektnummer") = source.member("projektnummer")
    target.member("verflechtungen") = source.member("verflechtungen")
    target.member("gegenverflechtungen") = source.member("gegenverflechtungen")
    'Die Rechnungsvorgaben auf dem Projekt:
    target.member("rechRabatt") = source.member("rechRabatt")
    target.member("rechPauschal") = source.member("rechPauschal")
    target.member("rechRabattProzent") = source.member("rechRabattProzent")
    target.member("rechPauschalSpesenProzent") = source.member("rechPauschalSpesenProzent")
    target.member("rechPauschalBetrag") = source.member("rechPauschalBetrag")
    target.member("rechPauschalSpesen") = source.member("rechPauschalSpesen")
    target.member("rechPauschalSpesenBetrag") = source.member("rechPauschalSpesenBetrag")

    'hänge noch die gleichen Gegenparteien an...
    set adrlist1 = source.member("gegenparteien")
    set adrlist2 = target.member("gegenparteien")
    for i = 0 to adrlist1.count-1
        adrlist2.add adrlist1.objects(i)
    next

    ' BearbeiterLinks
    Set srcList = source.Eval("bearbeiterlinks")
    Set trgList = target.Eval("bearbeiterlinks")
    ' muss zuerst die bearbeiterlinkliste löschen
    ' da beim erzeugen automatisch der aktuelle
    ' Bearbeiter zugeordnet wird
    For i = trgList.Count - 1 To 0 Step -1
        trgList.Objects(i).delete
    Next
    ' Bearbeiterlinks kopieren
    For i = 0 To srcList.Count - 1
        Set BearbeiterLink = Vertec.CreateObject("BearbeiterLink")
        BearbeiterLink.Member("Bezeichnung") = srcList.Objects(i).Member("Bezeichnung")
        BearbeiterLink.Member("Ansatzkosten") = srcList.Objects(i).Member("Ansatzkosten")
        BearbeiterLink.Member("TagesPauschaleExt") = srcList.Objects(i).Member("TagesPauschaleExt")
        BearbeiterLink.Member("AnsatzBearbeiter") = srcList.Objects(i).Member("AnsatzBearbeiter")
        BearbeiterLink.Member("AnsatzExt") = srcList.Objects(i).Member("AnsatzExt")
        BearbeiterLink.Member("Bearbeiter") = srcList.Objects(i).Member("Bearbeiter")
        BearbeiterLink.Member("Bearbeiterstufe") = srcList.Objects(i).Member("Bearbeiterstufe")
        CopyZusatzfelder srcList.Objects(i), BearbeiterLink, "BearbeiterLink"
        trgList.Add BearbeiterLink
    Next

    'Nun kommen die Projektphasen dran
    set phasenlist = source.eval("phasen")
    for i = 0 to phasenlist.count-1
        set oldphase = phasenlist.objects(i)
        set newphase = Vertec.createObject("Projektphase")
        newphase.member("projekt") = target
        call CopyPhasenBearbeiter (oldphase, newphase)
        call CopyPhasenTaetigkeiten (oldphase, newphase)
        call CopyPhasenSpesentypen (oldphase, newphase)
        call CopyPhasenAuslagentypen (oldphase, newphase)
        CopyPhasenMembers oldphase, newphase
        CopyZusatzfelder oldphase, newphase, "ProjektPhase"
        AddSubphasen oldphase, newphase
    next

    '---GenericLinks kopieren
    call CopyGenericLinks(source, target)
    '---CuistomLinks kopieren
    call CopyCustomLinks(source, target)

    Vertec.ShowForm(target)

end sub

Sub CopyGenericLinks(vonProjekt, nachProjekt)
    dim Containers, Links
    dim Container, newContainer, linkObj
    dim i, j

    set Containers = vonProjekt.eval("genericContainers")
    '---Containers erstellen
    For i=0 to Containers.Count-1
        set Container = Containers.Objects(i)
        set newContainer = Vertec.CreateObject("GenericLinkContainer")
        newContainer.Member("rolle") = Container.Member("rolle")
        newContainer.Member("fromContainer") = nachProjekt
        set Links = Container.Member("links")
        for j=0 to Links.Count-1
            set linkObj = Links.Objects(j)
            newContainer.Member("links").Add linkObj
        next
    next
end sub

Sub CopyCustomLinks(vonProjekt, nachProjekt)
    ' getWithSql() ist performancemässig nicht ideal. Da aber eine Klasse sich selber als Linkobjekt halten kann, geht es nicht anders.
    dim oldLinks
    dim oldLink
    dim newLink
    dim i
    
    '---From one side...
    set oldLinks = vertec.getwithsql("Customlink", "customlinks=" & vonProjekt.eval("boldid.asstring"), "")
    for i = 0 to oldLinks.count -1
        set oldLink = oldLinks.objects(i)
        set newLink = vertec.createobject("Customlink")
        newLink.member("linktyp") = oldLink.eval("linktyp")
        newLink.member("customlinks") = nachProjekt
        newLink.member("fromcustomlinks") = oldLink.eval("fromcustomlinks")
    next
    
    '---...and from the other.
    set oldLinks = vertec.getwithsql("Customlink", "fromcustomlinks=" & vonProjekt.eval("boldid.asstring"), "")
    for i = 0 to oldLinks.count -1
        set oldLink = oldLinks.objects(i)
        set newLink = vertec.createobject("Customlink")
        newLink.member("linktyp") = oldLink.eval("linktyp")
        newLink.member("customlinks") = oldLink.eval("customlinks")
        newLink.member("fromcustomlinks") = nachProjekt
    next
end sub

call main

27.09.2013 | 15.03.2016: Script für Version 6.0 hinzugefügt.
Produktlinien: Expert
Module: Leistung & CRM