Script: Vertec Projekt kopieren

Aktuelles Projekt kopieren

Standard

|

Expert

CLOUD ABO

|

ON-PREMISES

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erstellt: 27.09.2013
Aktualisiert: 02.10.2023 | Member xResourcePlanPhases aus Script ab Version 6.7 entfernt.

Inhalt

Erstellt ein neues Projekt in Vertec 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 Version Besonderheiten Version Script
Ab 6.1.0.10

Kopiert auch BearbeiterLinks, Keys und Tags. Der Projektcode wird über die Inputbox abgefragt.

Das Script muss registriert und mit erweiterten Berechtigungen ausgeführt werden.

ProjektKopieren61.py
Ab 6.7 Gleich wie das Script oben, ausser dass xResourcePlanPhases von den Projektvorgaben nicht mehr kopiert wird (das Member wurde mit Vertec 6.7 entfernt). ProjektKopieren67.py

Scripttext

Der (neuste) Scripttext wird hier dargestellt, um die Volltextsuche zu ermöglichen.

# coding: windows-1252
#
#---Bezeichnung: Projekt kopieren
#   Klassen: Projekt
#   CondExpression:
#   ObjectScript: Y
#   ContainerScript: N
#   EventType: -
#   EventClass: -
#   EventMembers: -
#   ExtendedRights: Y
#
#---Erstellt ein neues Projekt und kopiert die Einstellungen vom Quellen-Projekt
#---2017-12-17, UOS: Aus Vorlage erstellt
#---09.08.2018, sth: Kopiert nun auch BearbeiterLinks, CustomLinks, Keys und Tags.
#   Der Projektcode wird über die Inputbox abgefragt.
#---29.11.2018, tka: Subphasenhandling: Projekt wird nur gesetzt, wenn Parentphase.
#---30.01.2019, sth: Bugfix beim Kopieren von Zusatzfeldern.
#---04.09.2020, sth: Bugfix beim Kopieren von CustomLinks.
#---27.01.2022, sth: Script aus Plug-in Projektvorlagen extrahiert. Budgetwerte auf Bearbeiterphaselinks werden ebenfalls kopiert.
#---19.09.2023, sth: Member xResourcePlanPhases aus Projektvorgaben entfernt (wurde mit Vertec 6.7 gelöscht).

def main(Vprojekt):

    def copySubPhasen(phase, parentPhase, project):
        subPhasen = phase.subphasen
        if len(subPhasen) > 0:
            for subPhase in subPhasen:
                newPhase = copyPhase(subPhase, parentPhase, project)
                copySubPhasen(subPhase, newPhase, project)

    def copyPhase(sourcePhase, parentPhase, project):

        # if there exists already an active phase with same code, do not copy, but return existing phase to copy subphases
        existingPhase = None
        if parentPhase:
            existingPhase = parentPhase.eval("subphasen->select(aktiv)->select(code='{}')->first".format(sourcePhase.code))
        elif project:
            existingPhase = project.eval("phasen->select(aktiv)->select(code='{}')->first".format(sourcePhase.code))
        if existingPhase:
            return existingPhase       
        else:
            newPhase = vtcapp.createobject("Projektphase")

        # set parentphase or project
        if parentPhase:
            newPhase.parentphase = parentPhase
        else:
            newPhase.projekt = project

        # set attributes    
        newPhase.code = sourcePhase.code
        newPhase.xAktiv = sourcePhase.Aktiv
        newPhase.verantwortlicher = sourcePhase.verantwortlicher
        newPhase.verrechenbar = sourcePhase.verrechenbar
        newPhase.status = sourcePhase.status
        newPhase.Beschreibung = sourcePhase.Beschreibung
        newPhase.bemerkung = sourcePhase.bemerkung
        newPhase.pauschal = sourcePhase.pauschal
        newPhase.pauschalspesen = sourcePhase.pauschalspesen
        newPhase.pauschalauslagen = sourcePhase.pauschalauslagen
        newPhase.orderidx = sourcePhase.orderidx

        # budget
        newPhase.xplanMinutenInt = sourcePhase.xplanMinutenInt
        newPhase.xplanWertExt = sourcePhase.xplanWertExt
        newPhase.xplanWertInt = sourcePhase.xplanWertInt
        newPhase.xplanKostenLeistung = sourcePhase.xplanKostenLeistung
        newPhase.xplanSpesenWert = sourcePhase.xplanSpesenWert
        newPhase.xplanKostenSpesen = sourcePhase.xplanKostenSpesen
        newPhase.xplanAuslagenWert = sourcePhase.xplanAuslagenWert
        newPhase.xplanKostenAuslagen = sourcePhase.xplanKostenAuslagen

        # set prerequisites
        newPhase.ansatzext = sourcePhase.ansatzext
        newPhase.ansatzkosten = sourcePhase.ansatzkosten
        newPhase.ansatzbearbeiter = sourcePhase.ansatzbearbeiter
        newPhase.tagespauschaleext = sourcePhase.tagespauschaleext
        newPhase.bearbeiterzuordnung = sourcePhase.bearbeiterzuordnung
        newPhase.taetigkeitenzuordnung = sourcePhase.taetigkeitenzuordnung
        newPhase.spesentypenzuordnung = sourcePhase.spesentypenzuordnung
        newPhase.auslagetypenzuordnung = sourcePhase.auslagetypenzuordnung

        # accounting
        newPhase.ertragskontoleistungen = sourcePhase.ertragskontoleistungen
        newPhase.ertragskontospesen = sourcePhase.ertragskontospesen
        newPhase.ertragskontoauslagen = sourcePhase.ertragskontoauslagen
        newPhase.kostenstelleleistungen = sourcePhase.kostenstelleleistungen
        newPhase.kostenstellespesen = sourcePhase.kostenstellespesen
        newPhase.kostenstelleauslagen = sourcePhase.kostenstelleauslagen

        # links
        copyPhaseUserLink(sourcePhase, newPhase)
        copyPhaseServiceTypes(sourcePhase, newPhase)
        copyPhaseExpenseTypes(sourcePhase, newPhase)
        copyPhasePurchaseTypes(sourcePhase, newPhase)

        # additional fields
        copyAdditionalFields(sourcePhase, newPhase)

        return newPhase

    def copyPhaseExpenseTypes(sourcePhase, newPhase):
        phaseExpenseTypeList = sourcePhase.eval("self.spesentypphaselink")
        for sourcePhaseExpenseType in phaseExpenseTypeList:
            newPhaseExpenseType = vtcapp.createobject("SpesenTypPhaseLink")
            newPhaseExpenseType.minPlanWertSpesen = sourcePhaseExpenseType.minPlanWertSpesen
            newPhaseExpenseType.maxPlanWertSpesen = sourcePhaseExpenseType.maxPlanWertSpesen
            newPhaseExpenseType.planKostenSpesen = sourcePhaseExpenseType.planKostenSpesen
            newPhaseExpenseType.planWertSpesen = sourcePhaseExpenseType.planWertSpesen
            newPhaseExpenseType.wertproeinheitext = sourcePhaseExpenseType.wertproeinheitext
            newPhaseExpenseType.wertproeinheitint = sourcePhaseExpenseType.wertproeinheitint
            newPhaseExpenseType.wertproeinheitkosten = sourcePhaseExpenseType.wertproeinheitkosten
            newPhaseExpenseType.bezeichnung = sourcePhaseExpenseType.bezeichnung
            newPhaseExpenseType.offertText = sourcePhaseExpenseType.offertText
            newPhaseExpenseType.phasen = newPhase
            newPhaseExpenseType.spesentypen = sourcePhaseExpenseType.spesentypen
            newPhaseExpenseType.bearbeiter = sourcePhaseExpenseType.bearbeiter
            # additional fields
            copyAdditionalFields(sourcePhaseExpenseType, newPhaseExpenseType)

    def copyPhasePurchaseTypes(sourcePhase, newPhase):
        PhasePurchaseTypeList = sourcePhase.eval("self.auslagetypphaselink")
        for sourcePhasePurchaseType in PhasePurchaseTypeList:
            newPhasePurchaseType = vtcapp.createobject("AuslageTypPhaseLink")
            newPhasePurchaseType.minPlanWertAuslagen = sourcePhasePurchaseType.minPlanWertAuslagen
            newPhasePurchaseType.PlanWertAuslagen = sourcePhasePurchaseType.PlanWertAuslagen
            newPhasePurchaseType.maxPlanWertAuslagen = sourcePhasePurchaseType.maxPlanWertAuslagen
            newPhasePurchaseType.PlanKostenAuslagen = sourcePhasePurchaseType.PlanKostenAuslagen
            newPhasePurchaseType.maxPlanKostenAuslagen = sourcePhasePurchaseType.maxPlanKostenAuslagen
            newPhasePurchaseType.minPlanKostenAuslagen = sourcePhasePurchaseType.minPlanKostenAuslagen
            newPhasePurchaseType.wertproeinheitext = sourcePhasePurchaseType.wertproeinheitext
            newPhasePurchaseType.wertproeinheitint = sourcePhasePurchaseType.wertproeinheitint
            newPhasePurchaseType.wertproeinheitkosten = sourcePhasePurchaseType.wertproeinheitkosten
            newPhasePurchaseType.bezeichnung = sourcePhasePurchaseType.bezeichnung
            newPhasePurchaseType.offertText = sourcePhasePurchaseType.offertText
            newPhasePurchaseType.phasen = newPhase
            newPhasePurchaseType.auslagetypen = sourcePhasePurchaseType.auslagetypen
            newPhasePurchaseType.bearbeiter = sourcePhasePurchaseType.bearbeiter
            # additional fields
            copyAdditionalFields(sourcePhasePurchaseType, newPhasePurchaseType)

    def copyPhaseUserLink(sourcePhase, newPhase):
        PhaseUserList = sourcePhase.eval("bearbeiterphasen")
        for sourcePhaseUser in PhaseUserList:
            newPhaseUser = vtcapp.createobject("BearbeiterPhaseLink")
            newPhaseUser.Ansatzkosten = sourcePhaseUser.Ansatzkosten
            newPhaseUser.AnsatzBearbeiter = sourcePhaseUser.AnsatzBearbeiter
            newPhaseUser.TagesPauschaleExt = sourcePhaseUser.TagesPauschaleExt
            newPhaseUser.AnsatzExt = sourcePhaseUser.AnsatzExt
            newPhaseUser.Bearbeiter = sourcePhaseUser.Bearbeiter
            newPhaseUser.xplanWertExt = sourcePhaseUser.xplanWertExt
            newPhaseUser.xplanwertint = sourcePhaseUser.xplanwertint
            newPhaseUser.xplanminutenint = sourcePhaseUser.xplanminutenint
            newPhaseUser.xplanauslagenwert = sourcePhaseUser.xplanauslagenwert
            newPhaseUser.xplankostenauslagen = sourcePhaseUser.xplankostenauslagen
            newPhaseUser.xplankostenleistung = sourcePhaseUser.xplankostenleistung
            newPhaseUser.xplankostenspesen = sourcePhaseUser.xplankostenspesen
            newPhaseUser.xplanspesenwert = sourcePhaseUser.xplanspesenwert
            newPhaseUser.bearbeiterstufe = sourcePhaseUser.bearbeiterstufe

            newPhaseUser.Phase = newPhase
            # additional fields
            copyAdditionalFields(sourcePhaseUser, newPhaseUser)

    def copyPhaseServiceTypes(sourcePhase, newPhase):
        PhaseServiceTypeList = sourcePhase.eval("taetigkeitphaselink")
        for sourcePhaseServiceType in PhaseServiceTypeList:
            newPhaseServiceType = vtcapp.createobject("TaetigkeitPhaseLink")
            newPhaseServiceType.planWertLeist = sourcePhaseServiceType.planWertLeist
            newPhaseServiceType.minPlanWertLeist = sourcePhaseServiceType.minPlanWertLeist
            newPhaseServiceType.stueckwert = sourcePhaseServiceType.stueckwert
            newPhaseServiceType.tagesPauschaleExt = sourcePhaseServiceType.tagesPauschaleExt
            newPhaseServiceType.bezeichnung = sourcePhaseServiceType.bezeichnung
            newPhaseServiceType.ansatzExt = sourcePhaseServiceType.ansatzExt
            newPhaseServiceType.planMinutenInt = sourcePhaseServiceType.planMinutenInt
            newPhaseServiceType.maxPlanWertLeist = sourcePhaseServiceType.maxPlanWertLeist
            newPhaseServiceType.ansatzKosten = sourcePhaseServiceType.ansatzKosten
            newPhaseServiceType.ansatzBearbeiter = sourcePhaseServiceType.ansatzBearbeiter
            newPhaseServiceType.offertText = sourcePhaseServiceType.offertText
            newPhaseServiceType.phasen = newPhase
            newPhaseServiceType.taetigkeiten = sourcePhaseServiceType.taetigkeiten
            newPhaseServiceType.bearbeiter = sourcePhaseServiceType.bearbeiter
            # additional fields
            copyAdditionalFields(sourcePhaseServiceType, newPhaseServiceType)

    def copyAdditionalFields (source, target):
        additionalFieldList = source.eval("zusatzfelder.metaZusatzfeld")
        for additionalField in additionalFieldList:
            additionalFieldname = additionalField.eval("fieldname")
            sourceValue = getattr(source, additionalFieldname)
            setattr(target, additionalFieldname, sourceValue)

    def copyUserLink(source, target):
        # when a project is created, the current user is automatically assigned and has to be deleted manually
        for user in list(target.evalocl("bearbeiterlink")):
            user.delete()

        userList = source.evalocl("bearbeiterlink")
        for sourceUser in userList:
            newUser = vtcapp.createobject("BearbeiterLink")
            newUser.Ansatzkosten = sourceUser.Ansatzkosten
            newUser.AnsatzBearbeiter = sourceUser.AnsatzBearbeiter
            newUser.TagesPauschaleExt = sourceUser.TagesPauschaleExt
            newUser.AnsatzExt = sourceUser.AnsatzExt
            newUser.Bearbeiter = sourceUser.Bearbeiter
            newUser.Bearbeiterstufe = sourceUser.Bearbeiterstufe
            target.bearbeiterlinks.append(newUser)

    def copyCustomLinks(source, target):

        # customlink
        oldLinks = vtcapp.getwithsql("Customlink", "customlinks={}".format(source.objid), "")
        for oldLink in oldLinks:
            newLink = vtcapp.createobject("Customlink")
            newLink.linktyp = oldLink.linktyp
            newLink.customlinks = target
            newLink.fromcustomlinks = oldLink.fromcustomlinks

        # fromcustomlink
        oldLinks = vtcapp.getwithsql("Customlink", "fromcustomlinks={}".format(source.objid), "")
        for oldLink in oldLinks:
            newLink = vtcapp.createobject("Customlink")
            newLink.linktyp = oldLink.linktyp
            newLink.customlinks = oldLink.customlinks
            newLink.fromcustomlinks = target

    def copyProjectSettings(source, target):

        # set attributes
        target.kunde = source.kunde
        target.bemerkung = source.bemerkung
        target.betreffend = source.betreffend
        target.beschrieb = source.beschrieb
        target.tarifstufe = source.tarifstufe
        target.waehrung = source.waehrung
        target.rechnungsIntervall = source.rechnungsIntervall
        target.xrechnungsadresse = source.xrechnungsadresse
        target.sprache = source.sprache
        target.kontaktPerson = source.kontaktPerson
        target.xmwsttyp = source.xmwsttyp
        target.hb = source.hb
        target.hbstv = source.hbstv
        target.sekr = source.sekr
        target.keys = source.keys
        target.tags = source.tags
        target.verflechtungen = source.verflechtungen
        target.gegenverflechtungen = source.gegenverflechtungen

        # add counterparties
        adrlist = target.gegenparteien
        adrlist += source.gegenparteien
        
        # budget
        target.xplanMinutenInt = source.xplanMinutenInt
        target.xplanWertExt = source.xplanWertExt
        target.xplanWertInt = source.xplanWertInt
        target.xplanKostenLeistung = source.xplanKostenLeistung
        target.xplanSpesenWert = source.xplanSpesenWert
        target.xplanKostenSpesen = source.xplanKostenSpesen
        target.xplanAuslagenWert = source.xplanAuslagenWert
        target.xplanKostenAuslagen = source.xplanKostenAuslagen

        # invoice settings
        target.rechRabatt = source.rechRabatt
        target.rechPauschal = source.rechPauschal
        target.rechRabattProzent = source.rechRabattProzent
        target.rechPauschalSpesenProzent = source.rechPauschalSpesenProzent
        target.rechPauschalBetrag = source.rechPauschalBetrag
        target.rechPauschalSpesen = source.rechPauschalSpesen
        target.rechPauschalSpesenBetrag = source.rechPauschalSpesenBetrag
        target.rechProforma = source.rechProforma
        target.rechUseSpesen = source.rechUseSpesen
        target.rechRabattBetrag = source.rechRabattBetrag

        # prerequisites
        target.xansatzext = source.xansatzext
        target.xansatzkosten = source.xansatzkosten
        target.xansatzbearbeiter = source.xansatzbearbeiter
        target.xtagesPauschaleExt = source.xtagesPauschaleExt
        target.xauslagenWeiterleiten = source.xauslagenWeiterleiten
        target.xdebikondition = source.xdebikondition

        # payment conditions
        target.xDebiKondition = source.xDebiKondition

        # accounting
        target.xDatenbankFibu = source.xDatenbankFibu
        target.xLoginFibu = source.xLoginFibu
        target.xPasswordFibu = source.xPasswordFibu
        target.xPersonenkonto =source.xPersonenkonto
        target.xErtragskontoLeistungen = source.xErtragskontoLeistungen
        target.xErtragskontoSpesen = source.xErtragskontoSpesen
        target.xErtragskontoAuslagen = source.xErtragskontoAuslagen
        target.xDebitorkonto = source.xDebitorkonto
        target.xVorschusskonto = source.xVorschusskonto
        target.xKostenstelleLeistungen = source.xKostenstelleLeistungen
        target.xKostenstelleSpesen = source.xKostenstelleSpesen
        target.xKostenstelleAuslagen = source.xKostenstelleAuslagen
        target.xZahlungstyp = source.xZahlungstyp
        
        # additional fields
        copyAdditionalFields (source, target)

        # assigned users
        copyUserLink(source, target)

        # custom links
        copyCustomLinks(source, target)

    if not Vprojekt.eval("oclistypeof(Projekt)"):
        vtcapp.msgbox("Das Script kann nur auf einem Projekt ausgeführt werden")
        return

    projektcode = vtcapp.inputbox('Vertec','Geben Sie den Code des neuen Projekts an','')
    if projektcode != "":
        #Erzeuge das neue Projekt
        projekt = vtcapp.createobject("Projekt")
        projekt.code = projektcode

        #Projekteinstellungen übernehmen
        copyProjectSettings(Vprojekt, projekt)

        #Phasen kopieren, falls vorhanden
        if Vprojekt.eval("allephasen.list->size>0"):
            PhasenStufe1 = Vprojekt.phasen
            for vorlagePhase in PhasenStufe1:
                newPhase = copyPhase(vorlagePhase, vorlagePhase.parentphase, projekt)
                copySubPhasen(vorlagePhase, newPhase, projekt)

        #Stichwörter übernehmen
        Stichwoerter = Vprojekt.eval("ordner->select(parentordner.stichwort)")
        for StOrdner in Stichwoerter:
            projekt.ordner.append(StOrdner)

        vtcapp.showdetailform (projekt)

main(argobject)

 

 

Bitte wählen Sie Ihren Standort