Script: Vertec Projekt kopieren

Produktlinien: Expert
Module: Leistung & CRM
Erstellt: 27.09.2013, Änderung:
Python Script ersetzt: Projekt wird nur bei Oberphasen gesetzt.
Mehr ansehen

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
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
ProjektKopieren60.py
Ab 6.1.0.10

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

ProjektKopieren61.py

Scripttext

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

# 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.


def main(Vprojekt):

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

    def copyPhase(vorlagePhase, parentPhase, projekt):
        newPhase = vtcapp.createobject("Projektphase")
                                  
        # Phasen unterhalb des Projektes haben keine Parentphase.
        if parentPhase != None:
            newPhase.parentphase = parentPhase
        else:
            newPhase.projekt = projekt
        newPhase.code = vorlagePhase.code
        newPhase.xAktiv = vorlagePhase.Aktiv
        newPhase.verrechenbar = vorlagePhase.verrechenbar
        newPhase.status = vorlagePhase.status
        newPhase.Beschreibung = vorlagePhase.Beschreibung
        newPhase.bemerkung = vorlagePhase.bemerkung
        newPhase.pauschal = vorlagePhase.pauschal
        newPhase.pauschalspesen = vorlagePhase.pauschalspesen
        newPhase.pauschalauslagen = vorlagePhase.pauschalauslagen
        newPhase.orderidx = vorlagePhase.orderidx

        # Vorgaben
        newPhase.ansatzext = vorlagePhase.ansatzext
        newPhase.ansatzkosten = vorlagePhase.ansatzkosten
        newPhase.ansatzbearbeiter = vorlagePhase.ansatzbearbeiter
        newPhase.tagespauschaleext = vorlagePhase.tagespauschaleext
        newPhase.bearbeiterzuordnung = vorlagePhase.bearbeiterzuordnung
        newPhase.taetigkeitenzuordnung = vorlagePhase.taetigkeitenzuordnung
        newPhase.spesentypenzuordnung = vorlagePhase.spesentypenzuordnung
        newPhase.auslagetypenzuordnung = vorlagePhase.auslagetypenzuordnung

        # Buchhaltung
        newPhase.ertragskontoleistungen = vorlagePhase.ertragskontoleistungen
        newPhase.ertragskontospesen = vorlagePhase.ertragskontospesen
        newPhase.ertragskontoauslagen = vorlagePhase.ertragskontoauslagen
        newPhase.kostenstelleleistungen = vorlagePhase.kostenstelleleistungen
        newPhase.kostenstellespesen = vorlagePhase.kostenstellespesen
        newPhase.kostenstelleauslagen = vorlagePhase.kostenstelleauslagen

        #Links
        CopyPhasenBearbeiter(vorlagePhase, newPhase)
        CopyPhasenTaetigkeiten(vorlagePhase, newPhase)
        CopyPhasenSpesentypen(vorlagePhase, newPhase)
        CopyPhasenAuslagentypen(vorlagePhase, newPhase)

        # Zusatzfelder
        CopyZusatzfelder(vorlagePhase, newPhase)

        return newPhase

    def CopyPhasenSpesentypen(oldPhase, newPhase):
        PhaseSpesentypenListe = oldPhase.eval("self.spesentypphaselink")
        for oldPhasenSpesentyp in PhaseSpesentypenListe:
            newPhasenSpesentyp = vtcapp.createobject("SpesenTypPhaseLink")
            newPhasenSpesentyp.minPlanWertSpesen = oldPhasenSpesentyp.minPlanWertSpesen
            newPhasenSpesentyp.maxPlanWertSpesen = oldPhasenSpesentyp.maxPlanWertSpesen
            newPhasenSpesentyp.planKostenSpesen = oldPhasenSpesentyp.planKostenSpesen
            newPhasenSpesentyp.planWertSpesen = oldPhasenSpesentyp.planWertSpesen
            newPhasenSpesentyp.wertproeinheitext = oldPhasenSpesentyp.wertproeinheitext
            newPhasenSpesentyp.wertproeinheitint = oldPhasenSpesentyp.wertproeinheitint
            newPhasenSpesentyp.wertproeinheitkosten = oldPhasenSpesentyp.wertproeinheitkosten
            newPhasenSpesentyp.bezeichnung = oldPhasenSpesentyp.bezeichnung
            newPhasenSpesentyp.offertText = oldPhasenSpesentyp.offertText
            newPhasenSpesentyp.phasen = newPhase
            newPhasenSpesentyp.spesentypen = oldPhasenSpesentyp.spesentypen
            newPhasenSpesentyp.bearbeiter = oldPhasenSpesentyp.bearbeiter
            # Zusatzfelder
            CopyZusatzfelder(oldPhase, newPhase)

    def CopyPhasenAuslagentypen(oldPhase, newPhase):
        PhaseAuslagentypenListe = oldPhase.eval("self.auslagetypphaselink")
        for oldPhasenAuslagentyp in PhaseAuslagentypenListe:
            newPhasenAuslagentyp = vtcapp.createobject("AuslageTypPhaseLink")
            newPhasenAuslagentyp.minPlanWertAuslagen = oldPhasenAuslagentyp.minPlanWertAuslagen
            newPhasenAuslagentyp.PlanWertAuslagen = oldPhasenAuslagentyp.PlanWertAuslagen
            newPhasenAuslagentyp.maxPlanWertAuslagen = oldPhasenAuslagentyp.maxPlanWertAuslagen
            newPhasenAuslagentyp.PlanKostenAuslagen = oldPhasenAuslagentyp.PlanKostenAuslagen
            newPhasenAuslagentyp.maxPlanKostenAuslagen = oldPhasenAuslagentyp.maxPlanKostenAuslagen
            newPhasenAuslagentyp.minPlanKostenAuslagen = oldPhasenAuslagentyp.minPlanKostenAuslagen
            newPhasenAuslagentyp.wertproeinheitext = oldPhasenAuslagentyp.wertproeinheitext
            newPhasenAuslagentyp.wertproeinheitint = oldPhasenAuslagentyp.wertproeinheitint
            newPhasenAuslagentyp.wertproeinheitkosten = oldPhasenAuslagentyp.wertproeinheitkosten
            newPhasenAuslagentyp.bezeichnung = oldPhasenAuslagentyp.bezeichnung
            newPhasenAuslagentyp.offertText = oldPhasenAuslagentyp.offertText
            newPhasenAuslagentyp.phasen = newPhase
            newPhasenAuslagentyp.auslagetypen = oldPhasenAuslagentyp.auslagetypen
            newPhasenAuslagentyp.bearbeiter = oldPhasenAuslagentyp.bearbeiter
            # Zusatzfelder
            CopyZusatzfelder(oldPhase, newPhase)

    def CopyPhasenBearbeiter(oldPhase, newPhase):
        PhaseBearbeiterListe = oldPhase.eval("bearbeiterphasen")
        for oldPhasenBearbeiter in PhaseBearbeiterListe:
            newPhasenBearbeiter = vtcapp.createobject("BearbeiterPhaseLink")
            newPhasenBearbeiter.Ansatzkosten = oldPhasenBearbeiter.Ansatzkosten
            newPhasenBearbeiter.AnsatzBearbeiter = oldPhasenBearbeiter.AnsatzBearbeiter
            newPhasenBearbeiter.TagesPauschaleExt = oldPhasenBearbeiter.TagesPauschaleExt
            newPhasenBearbeiter.AnsatzExt = oldPhasenBearbeiter.AnsatzExt
            newPhasenBearbeiter.Bearbeiter = oldPhasenBearbeiter.Bearbeiter
            newPhasenBearbeiter.Phase = newPhase
            # Zusatzfelder
            CopyZusatzfelder(oldPhase, newPhase)

    def CopyPhasenTaetigkeiten(oldPhase, newPhase):
        PhaseTaetigkeitenListe = oldPhase.eval("taetigkeitphaselink")
        for oldPhasenTaetigkeit in PhaseTaetigkeitenListe:
            newPhasenTaetigkeit = vtcapp.createobject("TaetigkeitPhaseLink")
            newPhasenTaetigkeit.planWertLeist = oldPhasenTaetigkeit.planWertLeist
            newPhasenTaetigkeit.minPlanWertLeist = oldPhasenTaetigkeit.minPlanWertLeist
            newPhasenTaetigkeit.stueckwert = oldPhasenTaetigkeit.stueckwert
            newPhasenTaetigkeit.tagesPauschaleExt = oldPhasenTaetigkeit.tagesPauschaleExt
            newPhasenTaetigkeit.bezeichnung = oldPhasenTaetigkeit.bezeichnung
            newPhasenTaetigkeit.ansatzExt = oldPhasenTaetigkeit.ansatzExt
            newPhasenTaetigkeit.planMinutenInt = oldPhasenTaetigkeit.planMinutenInt
            newPhasenTaetigkeit.maxPlanWertLeist = oldPhasenTaetigkeit.maxPlanWertLeist
            newPhasenTaetigkeit.ansatzKosten = oldPhasenTaetigkeit.ansatzKosten
            newPhasenTaetigkeit.ansatzBearbeiter = oldPhasenTaetigkeit.ansatzBearbeiter
            newPhasenTaetigkeit.offertText = oldPhasenTaetigkeit.offertText
            newPhasenTaetigkeit.phasen = newPhase
            newPhasenTaetigkeit.taetigkeiten = oldPhasenTaetigkeit.taetigkeiten
            newPhasenTaetigkeit.bearbeiter = oldPhasenTaetigkeit.bearbeiter
            # Zusatzfelder
            CopyZusatzfelder(oldPhase, newPhase)

    def CopyZusatzfelder (quelle, ziel):
        zusatzfeldlist = quelle.eval("zusatzfelder.metaZusatzfeld")
        for zusatzfeld in zusatzfeldlist:
            print zusatzfeld
            zusatzfeldname = zusatzfeld.eval("fieldname")
            print zusatzfeldname
            quellwert = getattr(quelle, zusatzfeldname)
            setattr(ziel, zusatzfeldname, quellwert)

    def CopyBearbeiterLink(source, target):
        # da beim erzeugen des Projekts automatisch der aktuelle Bearbeiter zugeordnet wird,
        # muss dieser zuerst gelöscht werden:
        for bearb in list(target.evalocl("bearbeiterlink")):
          bearb.delete()

        bearbeiterListe = source.evalocl("bearbeiterlink")
        for srcBearb in bearbeiterListe:
            trgBearb = vtcapp.createobject("BearbeiterLink")
            trgBearb.Ansatzkosten = srcBearb.Ansatzkosten
            trgBearb.AnsatzBearbeiter = srcBearb.AnsatzBearbeiter
            trgBearb.TagesPauschaleExt = srcBearb.TagesPauschaleExt
            trgBearb.AnsatzExt = srcBearb.AnsatzExt
            trgBearb.Bearbeiter = srcBearb.Bearbeiter
            trgBearb.Bearbeiterstufe = srcBearb.Bearbeiterstufe
            target.bearbeiterlinks.append(trgBearb)

    def CopyCustomLinks(source, target):

        vtcapp.beginsystemcontext()

        #---Eine Seite
        oldLinks = vertec.getwithsql("Customlink", "customlinks=" & source.eval("boldid.asstring"), "")
        for oldLink in oldLinks:
            newlink = vtcapp.createobject("Customlink")
            newLink.linktyp = oldLink.linktyp
            newLink.customlinks = target
            newLink.fromcustomlinks = oldLink.fromcustomlinks

        #---Andere Seite
        oldLinks = vertec.getwithsql("Customlink", "fromcustomlinks=" & source.eval("boldid.asstring"), "")
        for oldLink in oldLinks:
            newlink = vtcapp.createobject("Customlink")
            newLink.linktyp = oldLink.linktyp
            newLink.customlinks = oldLink.customlinks
            newLink.fromcustomlinks = target
            
                                          

        vtcapp.endsystemcontext()

    def CopyProjekteinstellungen(source, target):
        # Diverse Felder
        target.kunde = source.kunde
        target.bemerkung = source.bemerkung
        target.betreffend = source.betreffend
        target.beschrieb = source.beschrieb
        target.tarifstufe = source.tarifstufe
        target.rechnungsIntervall = source.rechnungsIntervall
        target.projektnummer = source.projektnummer
        target.xrechnungsadresse = source.xrechnungsadresse
        target.sprache = source.sprache
        target.kontaktPerson = source.kontaktPerson
        target.typ = source.typ
        target.xmwsttyp = source.xmwsttyp
        target.projektleiter = vtcapp.currentlogin()
        target.aktiv = False
        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
        # hänge noch die gleichen Gegenparteien an...
        adrlist = target.gegenparteien
        adrlist += source.gegenparteien
        #Rechnungsvorgaben
        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
        #Vorgaben
        target.xansatzext = source.xansatzext
        target.xansatzkosten = source.xansatzkosten
        target.xansatzbearbeiter = source.xansatzbearbeiter
        target.xtagesPauschaleExt = source.xtagesPauschaleExt
        #Zahlungskonditionen
        target.xDebiKondition = source.xDebiKondition
        #Buchhaltung
        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
        # Zusatzfelder
        CopyZusatzfelder (source, target)
        # angehängte bearbeiter kopieren
        CopyBearbeiterLink(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
        CopyProjekteinstellungen(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)

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

        vtcapp.showdetailform (projekt)

main(argobject)