Script: Vertec Projekt kopieren

Aktuelles Projekt kopieren

Produktlinie

Standard

|

Expert

Betriebsart

CLOUD ABO

|

ON-PREMISES

Module

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erstellt: 27.09.2013
Aktualisiert: 10.10.2024 | Neues Script für selectedobjects ab Vertec 6.7.0.12.

Die Zusatzfunktion Projektvorlagen  ermöglicht es, Projekte aufgrund von hinterlegten Projektvorlagen zu erstellen. Falls Sie mit Projektvorlagen arbeiten möchten, empfehlen wir Ihnen, diese Zusatzfunktion zu laden.

Das Script in diesem Artikel erstellt ein neues Projekt in Vertec aufgrund des aktuellen Projekts:

  • Es werden alle Werte ausser Leistungen, Spesen und Vorschüsse übernommen.
  • Inhaltliche Angaben wie Ordnerreferenzen oder Ressourcenplanwerte werden nicht übernommen.
  • Erstellt die gleichen Phasen in der gleichen Reihenfolge sowie deren verschiedene Zuordnungen und Berechtigungen.
  • Die Phasenbudgets werden übernommen, jedoch nicht die BudgetChange Objekte.
  • Als Projektleiter wird der Benutzer eingefügt, der das Script ausführt.
  • Der Name des neuen Projektes wird abgefragt.
  • Das neue Projekt wird inaktiv gesetzt.
Version Beschreibung Script
6.1.0.10 Kopiert auch BearbeiterLinks, Keys und Tags. Der Projektcode wird über die Inputbox abgefragt. ProjektKopieren61.py
6.7 xResourcePlanPhases werden nicht mehr kopiert (das Member wurde mit Vertec 6.7 entfernt).
Script für Vertec Versionen vor 6.7.0.12 sowie zur Ausführung im Script Editor für alle Versionen.
projektkopieren67.py
6.7.0.12 Verwendet selectedobjects . CopyProject.py

Ausführen

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

Scripttext

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

 # coding: windows-1252
#
#---Bezeichnung: Projekt kopieren
#   Klassen: Projekt
#   Selectedobjectsscript: Yes
#   Condexpression: self->size = 1
#   EventType: Kein
#   EventClass: 
#   EventMembers: 
#   ExtendedRights:
#
#---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 Config Set Projektvorlagen extrahiert. Budgetwerte auf Bearbeiterphaselinks werden ebenfalls kopiert.
#---19.09.2023, sth: Member xResourcePlanPhases aus Projektvorgaben entfernt (wurde mit Vertec 6.7 gelöscht).
#   10.10.2024, sth: Angepasst an selectedobjects und Vertec 6.7.0.12

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)
        
def main(projectlist):        
    for Vprojekt in projectlist:
        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(selectedobjects)

 

 

Bitte wählen Sie Ihren Standort