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
|
Auf dem Projekt, das kopiert werden soll. Bitte verwenden Sie jeweils das Script, welches zu Ihrer aktuellen Vertec Version passt.
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)