6.7.0.1ClassSettings.allInstances->select(klasse='ZusatzKlasse28')->reject(eintragid='ClassSettingsZK28LicenceProduct')->size = 0Timsession.allinstances->first.licproduct=2ClassSettingsPhaseLicences<Page Override="ProjectPhase">
<TextArea Override="Remarks" Lines="2" />
<AdditionalFieldComboBox Name="AdditionalFieldComboBoxLicenseKind" PlaceAfter="CodeChargeableActiveGroup" ValueExpression="zusatzfeldint('lic_kindPhase')" Label="{ Translate 'Kind'}" WidthFraction="0.5"/>
</Page>ProjektPhase17truetrueProjektPhase00falsecodefalse0Codetrue90falsefalse01falsebeschreibungfalse0Descriptiontrue149falsefalse010clgreenfalse''false0true3falsefalse111trueauslagen->select(typ.zusatzfeldint('lic_kindPurchasetype')=1).wertext->sumfalse0Turnover licence saletrue105falsefalse112trueauslagen->select(typ.zusatzfeldint('lic_kindPurchasetype')=2).wertext->sumfalse0Turnover service contractstrue125falsefalse02false<OfferComboBox ShowNavLinkButton="True" ShowRemoveButton="True"/>offertefalse0Offertrue90falsefalse03cmbVerantwortlicherfalseverantwortlicherfalse0ProjectResponsibletrue90falsefalse04cmbStatusfalsestatusfalse0Statustrue80falsefalse25rndbooleanfalsepauschalfalse0Lumpsumtrue60falsefalse16dbmTIM.BudgetWertRenderertrueplanWertExtfalse0Fees budget_cstrue90falsefalse17truesumWertExtfalse0Actualfalse90falsefalse18if (planwertext>0) and (planwertext-sumwertext<=0) then 'clRed' else 'clWindowtext' endiftrueplanwertext-sumwertextfalse0Remaining budgetfalse90falsefalse19truesumWertExtOffenfalse0Open feesfalse90falsefalseClassSettingsZK28LicenceProductzusatzfeld('zk28_licProductname')ZusatzKlasse28'Lizenzprodukt'17truetrueZusatzKlasse2801falsezusatzfeld('zk28_licProductname')false1Nametrue150falsefalse02falsezusatzfeld('zk28_licManufacturer')false0Manufacturertrue150falsefalseFolderAnnualOverviewServiceContractsAnnual overview of service contracts6650falsetrue17falsefalse00falsetrue1Clienttrue180falsefalse01clgreenfalsefalse0true3falsefalse110if encodedate(varYear->round, 8, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 8, 1))false0Augusttrue65falsefalse111if encodedate(varYear->round, 9, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 9, 1))false0Septembertrue65falsefalse112if encodedate(varYear->round, 10, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 10, 1))false0Octobertrue65falsefalse113if encodedate(varYear->round, 11, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 11, 1))false0Novembertrue65falsefalse114if encodedate(varYear->round, 12, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 12, 1))false0Decembertrue65falsefalse12if encodedate(varYear->round, 1, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 1, 1))false0Januarytrue65falsefalse14if encodedate(varYear->round, 2, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 2, 1))false0Februarytrue65falsefalse15if encodedate(varYear->round, 3, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 3, 1))false0Marchtrue65falsefalse16if encodedate(varYear->round, 4, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 4, 1))false0Apriltrue65falsefalse17if encodedate(varYear->round, 5, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 5, 1))false0Maytrue65falsefalse18if encodedate(varYear->round, 6, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 6, 1))false0Junetrue65falsefalse19if encodedate(varYear->round, 7, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueself->callCurrDate('module_licences.get_amount_service_contracts', encodedate(varYear->round, 7, 1))false0Julytrue65falsefalseAdresseintrag{"IsInstantSearch":false,"DisableShowInactive":true,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"bold_id in (select kunde from projekt where bold_id in (select projekt from projektphase where bold_id in (select phasen from auslagetypphaselink where auslagetypen in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 2) and bold_id in (select usereintrag from zusatzfeld where MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicStartdate') and (extract(year from wertDatum)<=\\1) and (bold_id not in (select usereintrag from zusatzfeld where MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicEnddate')) or bold_id in (select usereintrag from zusatzfeld where MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicEnddate') and (extract(year from wertDatum)>=\\1)))))))","SearchFields":[{"Name":"Year","Type":1,"Default":"date.year"}]}]}falsetrueFolderAnnualOverviewSoldLicencesAnnual overview of sold licences6630falsetrue17falsefalse00falsetrue1Clienttrue180falsefalse01clgreenfalsefalse0true3falsefalse110if encodedate(varYear->round, 9, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 9, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 9, 1).lastOfMonth).planwertauslagen->sumfalse0Septembertrue65falsefalse111if encodedate(varYear->round, 10, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 10, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 10, 1).lastOfMonth).planwertauslagen->sumfalse0Octobertrue65falsefalse112if encodedate(varYear->round, 11, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 11, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 11, 1).lastOfMonth).planwertauslagen->sumfalse0Novembertrue65falsefalse113if encodedate(varYear->round, 12, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 12, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 12, 1).lastOfMonth).planwertauslagen->sumfalse0Decembertrue65falsefalse12if encodedate(varYear->round, 1, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 1, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 1, 1).lastOfMonth).planwertauslagen->sumfalse0Januarytrue65falsefalse13if encodedate(varYear->round, 2, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 2, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 2, 1).lastOfMonth).planwertauslagen->sumfalse0Februarytrue65falsefalse14if encodedate(varYear->round, 3, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 3, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 3, 1).lastOfMonth).planwertauslagen->sumfalse0Marchtrue65falsefalse15if encodedate(varYear->round, 4, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 4, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 4, 1).lastOfMonth).planwertauslagen->sumfalse0Apriltrue65falsefalse16if encodedate(varYear->round, 5, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 5, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 5, 1).lastOfMonth).planwertauslagen->sumfalse0Maytrue65falsefalse17if encodedate(varYear->round, 6, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 6, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 6, 1).lastOfMonth).planwertauslagen->sumfalse0Junetrue65falsefalse18if encodedate(varYear->round, 7, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 7, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 7, 1).lastOfMonth).planwertauslagen->sumfalse0Julytrue65falsefalse19if encodedate(varYear->round, 8, 1)>=date then 'clnavy' else 'clwindowtext' endiftrueprojekte.allephasen.auslagetypphaselink
->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)->select(zusatzfelddate('lic_startdate')>=encodedate(varYear->round, 8, 1))
->select(zusatzfelddate('lic_startdate')<=encodeDate(varYear->round, 8, 1).lastOfMonth).planwertauslagen->sumfalse0Augusttrue65falsefalseAdresseintrag{"IsInstantSearch":false,"DisableShowInactive":true,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"bold_id in (select kunde from projekt where bold_id in (select projekt from projektphase where bold_id in (select phasen from auslagetypphaselink where \r\nauslagetypen in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 1) \r\nand bold_id in (select usereintrag from zusatzfeld where MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicStartdate') and (extract(year from wertDatum)=\\1)))))","SearchFields":[{"Name":"Year","Type":1,"Default":"date.year"}]}]}falsetrueFolderInvoicingInvoicing_cs940falsetruetruefalsefalsetruefalse0FolderInvoicingLicenceSaleLicence invoices91040falsetrueRechnung{"IsInstantSearch":false,"DisableShowInactive":false,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"projekt in (select bold_id from projekt where ((code like '\\2') and ('\\1'='' or kunde in (select bold_id from adresseintrag where name like '%\\1%' or alias like '%\\1%')))) and\r\n\r\n(bold_id in (select rechnung from offeneauslage where typ in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 1)) or \r\nbold_id in (select rechnung from verrechneteauslage where typ in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 1))) and\r\n\r\n('\\3'='' or datum >= '\\3') and ('\\4'='' or datum <= '\\4') ","SearchFields":[{"Name":"Client","Type":0},{"Name":"Project","Type":0},{"Name":"From date","Type":2,"Default":"date.firstofmonth"},{"Name":"To date","Type":2,"Default":"date.lastofmonth"}]}]}falsetrueFolderInvoicingServiceContractsInvoices service contracts91050falsetrueRechnung{"IsInstantSearch":false,"DisableShowInactive":false,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"projekt in (select bold_id from projekt where ((code like '\\2') and ('\\1'='' or kunde in (select bold_id from adresseintrag where name like '%\\1%' or alias like '%\\1%')))) and\r\n\r\n(bold_id in (select rechnung from offeneauslage where typ in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 2)) or \r\nbold_id in (select rechnung from verrechneteauslage where typ in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 2))) and\r\n\r\n\r\n('\\3'='' or datum >= '\\3') and ('\\4'='' or datum <= '\\4') ","SearchFields":[{"Name":"Client","Type":0},{"Name":"Projekt","Type":0},{"Name":"From date","Type":2,"Default":"date.firstofmonth"},{"Name":"To date","Type":2,"Default":"date.lastofmonth"}]}]}falsetrueFolderLicenceProductsLicence products8520falsetrueZusatzKlasse28zusatzklasse28FolderLicenceSalesLicence sale8520falsetrue17truetrue00falsephasen.phasegetprojekt.kundefalse0Clienttrue100falsefalse01falsephasen.phasegetprojektfalse0Projecttrue100falsefalse110falsezusatzfeldcurr('lic_discount')false0Discount amounttrue70falsefalse111falsewertProEinheitExt-zusatzfeldcurr('lic_discount')false0Price incl. discounttrue95falsefalse012clgreenfalse''false0true3falsefalse113truezusatzfeldcurr('lic_amount')false0Quantitytrue50falsefalse114trueplanwertauslagenfalse0Totaltrue60falsefalse015clGreenfalse''false0true3falsefalse016false<DatePicker/>zusatzfelddate('lic_startDate')false0Purchase datetrue100falsefalse117falsesumwertextfalse0Chargedtrue60falsefalse02cmbTypfalse<ComboBox Override="cmbTyp" ShowNavLinkButton="True" ListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=1)" GhostrowListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=1)" />auslagetypenfalse0Purchase typetrue100falsefalse03falseauslagetypen.zusatzfeldasstring('lic_product')false0Producttrue80falsefalse04falsebezeichnungfalse0Designationtrue120falsefalse05clGreenfalse''false0true3falsefalse16falsewertProEinheitIntfalse0Purchase pricetrue70falsefalse17falseauslagetypen.wertProEinheitExttrue0List selling pricetrue95falsefalse18falsewertProEinheitExtfalse0Selling pricetrue70falsefalse19falsezusatzfeldcurr('lic_discountPercentage')false0Discount %true70falsefalseAuslageTypPhaseLink{"IsInstantSearch":false,"DisableShowInactive":false,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"phasen in (select bold_id from Projektphase where projekt in (select bold_id from projekt where ((code like '\\2') and ('\\1'='' or kunde in (select bold_id from adresseintrag where name like '%\\1%' or alias like '%\\1%'))))) and\r\nauslagetypen in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 1) and\r\n\r\n(auslagetypen in (SELECT userEintrag FROM Zusatzfeld WHERE MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicProduct') AND wertobject in (select usereintrag from zusatzfeld where metazusatzfeld in (select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_zk28LicProductname') and wert = '\\3')) or ('\\3'='')) and\r\n\r\n(bold_id in (SELECT userEintrag FROM Zusatzfeld WHERE MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicStartdate') AND ('\\4'='' or WertDatum >= '\\4') and ('\\5'='' or wertdatum<='\\5')) or ('\\4'='' and '\\5'=''))","SearchFields":[{"Name":"Client","Type":0},{"Name":"Project","Type":0},{"Name":"Product","Type":5,"Expression":"''->union(Zusatzklasse28.allinstances->orderby(zusatzfeld('zk28_licProductName')).zusatzfeld('zk28_licProductName'))"},{"Name":"From date","Type":2,"Default":"date.firstofmonth"},{"Name":"To date","Type":2,"Default":"date.lastofmonth"}]}]}falsetrueFolderPurchasesFremdkosten5270falsetruetruefalsefalsetruefalseFolderSalesVerkauf8820falsetruetruefalsefalsetruefalse0FolderSalesLicenceSaleAndServiceContractsLicence sale and service contracts-11030falsetruetruefalsefalsetruefalse0FolderSalesProjectsLicenceSaleAndServiceContractsProjects licence sale and service contracts610falsetrue17falsefalse01falsecodetrue1Project-codetrue102falsefalse02falsebeschriebtrue0Project descriptiontrue164falsefalse03falsebetreffendtrue0Regardingtrue149falsefalse04falsetypfalse0Project typetrue80falsefalse05falseprojektleiterfalse0Project managertrue90falsefalseProjektProjekt{"IsInstantSearch":false,"DisableShowInactive":false,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"bold_id in (select projekt from Projektphase where bold_id in (select phasen from auslagetypphaselink where auslagetypen in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and ((wertinteger = 1) or (wertinteger = 2)))))"}]}truefalseFolderServiceContractsServiceverträge8520falsetrue17truetrue00falsephasen.phasegetprojekt.kundefalse0Clienttrue100falsefalse01falsephasen.phasegetprojektfalse0Projecttrue100falsefalse110truezusatzfeldcurr('lic_discount')false0Discount amounttrue70falsefalse111truewertProEinheitExt-zusatzfeldcurr('lic_discount')false0Price incl. discountfalse95falsefalse012clgreenfalse''false0true3falsefalse113truezusatzfeldcurr('lic_amount')false0Quantitytrue50falsefalse114falseplanwertauslagenfalse0Totaltrue60falsefalse015clGreenfalse''false0true3falsefalse016false<DatePicker/>zusatzfelddate('lic_startDate')false0Start datetrue60falsefalse017cmbzusatzfeldrndzusatzfeldfalsezusatzfeldint('lic_accountingInterval')false0Invoice periodtrue100falsefalse018falsegetlinks('LnkAuslageAuslagetypphaselink_B').oclastype(Auslage).rechnung->orderby(datum)->last.datumfalse0Date of last invoicetrue115falsefalse119falsesumwertextfalse0Chargedtrue60falsefalse02cmbTypfalse<ComboBox Override="cmbTyp" ShowNavLinkButton="True" ListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=2)" GhostrowListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=2)" />auslagetypenfalse0Purchase typetrue100falsefalse03falseauslagetypen.zusatzfeldasstring('lic_product')false0Producttrue80falsefalse04falsebezeichnungfalse0Designationtrue120falsefalse05clGreenfalse''false0true3falsefalse16falsewertProEinheitIntfalse0Purchase pricetrue70falsefalse17falseauslagetypen.wertProEinheitExttrue0List selling pricetrue95falsefalse18falsewertProEinheitExtfalse0Selling pricetrue70falsefalse19falsezusatzfeldcurr('lic_discountPercentage')false0Discount %true70falsefalseAuslageTypPhaseLink{"IsInstantSearch":false,"DisableShowInactive":false,"SearchDefinitions":[{"Name":"Neue Abfrage","Template":"phasen in (select bold_id from Projektphase where projekt in (select bold_id from projekt where ((code like '\\2') and ('\\1'='' or kunde in (select bold_id from adresseintrag where name like '%\\1%' or alias like '%\\1%'))))) and\r\nauslagetypen in (select usereintrag from zusatzfeld where metazusatzfeld in \r\n(select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_LicKindPurchaseType') and wertinteger = 2) and\r\n\r\n(auslagetypen in (SELECT userEintrag FROM Zusatzfeld WHERE MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicProduct') AND wertobject in (select usereintrag from zusatzfeld where metazusatzfeld in (select bold_id from zusatzfeldklasse where eintragid = 'AdditionalField_zk28LicProductname') and wert = '\\3')) or ('\\3'='')) and\r\n\r\nbold_id in (SELECT userEintrag FROM Zusatzfeld WHERE MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicStartdate') AND ('\\4'='' or WertDatum <= '\\4')) and \r\n(bold_id not in (SELECT userEintrag FROM Zusatzfeld WHERE MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicEnddate')) or (bold_id in (SELECT userEintrag FROM Zusatzfeld WHERE MetaZusatzfeld in (select bold_id from zusatzfeldklasse where eintragid='AdditionalField_LicEnddate') AND ('\\4'='' or WertDatum >= '\\4' or WertDatum is NULL))))","SearchFields":[{"Name":"Client","Type":0},{"Name":"Project","Type":0},{"Name":"Product","Type":5,"Expression":"''->union(Zusatzklasse28.allinstances->orderby(zusatzfeld('zk28_licProductname')).zusatzfeld('zk28_licProductname'))"},{"Name":"Effective date","Type":2,"Default":"date"}]}]}falsetrueLinktypPhaseAuslagetyplinktruetruefalsefalse300truefalseauslagetypphaselinkAuslageTypPhaseLink49WrapperLinkContainerAuslagentypenfalsetrueauslagetypphaselink->reject(auslagetypen.zusatzfeldint('lic_kindPurchaseType')>0)falsefalsefalse0falsefalseProjektPhase-1WrapperLinkContainerPhasentruetruephasenfalseLnkAuslageAuslagetypphaselinktruetruefalsefalse0falsefalseAuslageTypPhaseLink-1Verkauf / Vertragtruetruefalsefalse0falsefalseAuslage-1AuslagentruetrueLnkOffertePhasentruetruetruefalse100truefalseProjektPhase32WrapperLinkContainerPhasentruetrue17truetrue00falsecodefalse0Codetrue90falsefalse01falsebeschreibungfalse0Descriptiontrue149falsefalse110truesumWertExtOffenfalse0Open feesfalse90falsefalse02cmbzusatzfeldrndzusatzfeldfalsezusatzfeldint('lic_kindPhase')false0Kindtrue100falsefalse03false<OfferComboBox ShowNavLinkButton="True" ShowRemoveButton="True"/>offertefalse0Offertrue90falsefalse04cmbVerantwortlicherfalseverantwortlicherfalse0ProjectResponsibletrue90falsefalse05cmbStatusfalsestatusfalse0Statustrue80falsefalse26rndbooleanfalsepauschalfalse0Lumpsumtrue60falsefalse17dbmTIM.BudgetWertRenderertrueplanWertExtfalse0Fees budget_cstrue90falsefalse18truesumWertExtfalse0Actualfalse90falsefalse19if (planwertext>0) and (planwertext-sumwertext<=0) then 'clRed' else 'clWindowtext' endiftrueplanwertext-sumwertextfalse0Remaining budgetfalse90falsefalsephasenfalsefalsefalse0falsefalseOfferte-1WrapperLinkContainerOffertefalsetrueoffertefalseLnkProjektPhasetruefalsetruefalse100truefalseProjektPhase32WrapperLinkContainerPhasentruetrue17truetrue00falsecodefalse0Codetrue90falsefalse01falsebeschreibungfalse0Descriptiontrue149falsefalse110truesumWertExtOffenfalse0Open feesfalse90falsefalse02cmbzusatzfeldrndzusatzfeldfalsezusatzfeldint('lic_kindPhase')false0Kindtrue100falsefalse03false<OfferComboBox ShowNavLinkButton="True" ShowRemoveButton="True"/>offertefalse0Offertrue90falsefalse04cmbVerantwortlicherfalseverantwortlicherfalse0ProjectResponsibletrue90falsefalse05cmbStatusfalsestatusfalse0Statustrue80falsefalse26rndbooleanfalsepauschalfalse0Lumpsumtrue60falsefalse17dbmTIM.BudgetWertRenderertrueplanWertExtfalse0Fees budget_cstrue90falsefalse18truesumWertExtfalse0Actualfalse90falsefalse19if (planwertext>0) and (planwertext-sumwertext<=0) then 'clRed' else 'clWindowtext' endiftrueplanwertext-sumwertextfalse0Remaining budgetfalse90falsefalsephasenfalsefalsefalse1500falsefalseProjekt6WrapperLinkContainerProjekttruetrueprojektfalseScript_CalculatePriceFromLicenceSalecalculate_price_from_licencesfalse# coding: windows-1252
#
#---Bezeichnung: calculate_price_from_licences
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType:
# EventClass:
# EventMembers:
#---Calculates the price of the service contract dependig on licence sales
import module_licences
module_licences.calculate_price_from_licences(argobject)NonefalsefalsefalsePythonScript_ChargeLicencesCharge licencesAuslageTypPhaseLink,Projekt,ProjektPhasetrue(if oclistypeof(Projekt) then oclastype(Projekt).allephasen.auslagetypphaselink else if oclistypeof(Projektphase) then oclastype(Projektphase).auslagetypphaselink else oclastype(Auslagetypphaselink)->asset endif endif)->select(hastag('licence'))->select(getlinks('LnkAuslageAuslagetypphaselink_B')->size=0)->size>0# coding: windows-1252
#
#---Bezeichnung: Charge licences
# Klassen: AuslageTypPhaseLink,Projekt,ProjektPhase
# CondExpression: (if oclistypeof(Projekt) then oclastype(Projekt).allephasen.auslagetypphaselink else if oclistypeof(Projektphase) then oclastype(Projektphase).auslagetypphaselink else oclastype(Auslagetypphaselink)->asset endif endif)->select(hastag('licence'))->select(getlinks('LnkAuslageAuslagetypphaselink_B')->size=0)->size>0
# ObjectScript: Y
# ContainerScript: Y
# EventType: Kein
# EventClass:
# EventMembers:
# ExtendedRights: N
#
#---Creates one invoice per project with one purchases for every licence without purchase entry
#
#---2021-06-03, UHE: initial version
import module_licences
module_licences.charge_licences(argobject)
NonetruefalsefalsePythonScript_ChargeServiceContractsCharge service contractsAuslageTypPhaseLink,Projekt,ProjektPhasetrue(if oclistypeof(Projekt) then oclastype(Projekt).allephasen.auslagetypphaselink else if oclistypeof(Projektphase) then oclastype(Projektphase).auslagetypphaselink else oclastype(Auslagetypphaselink)->asset endif endif)->select(hastag('servicecontract'))->select(zusatzfeldasstring('lic_startdate')<>'')->size>0# coding: windows-1252
#
#---Bezeichnung: Charge service contracts
# Klassen: Projektphase
# CondExpression: (if oclistypeof(Projekt) then oclastype(Projekt).allephasen.auslagetypphaselink else if oclistypeof(Projektphase) then oclastype(Projektphase).auslagetypphaselink else oclastype(Auslagetypphaselink)->asset endif endif)->select(hastag('servicecontract'))->select(zusatzfeldasstring('lic_startdate')<>'')->size>0
# ObjectScript: Y
# ContainerScript: Y
# EventType:
# EventClass:
# EventMembers:
#---Script charges service contracts.
#---Looks through all entries in the current list to see if there is a need to create an invoice
import module_licences
module_licences.charge_service_contracts(argobject)
NonetruetruefalsePythonScript_DeleteLicenceInvoiceEvent: Delete licence invoiceRechnungfalse# coding: windows-1252
#
#---Bezeichnung: Delete licence invoice
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType: Löschen
# EventClass: Rechnung
# EventMembers:
#---Deletes automatically created purchases on the invoice.
# Otherwise, when deleting licence invoices, the purchases would remain in Vertec as open purchases
import module_licences
module_licences.delete_licence_invoice(argobject)
DeletefalsetruefalsePythonScript_moduleLicencesmodule_licencesfalse# coding: windows-1252
#
#---Bezeichnung: module_licences
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType: Kein
# EventClass:
# EventMembers:
# ExtendedRights: N
#
#---Contains functions for licence sales and service contracts
#
#---2021-06-03, UHE: initial version
#---2023-09-28, WCA: changed handling of VAT types
import vtcapp
import calendar
import locale
locale.setlocale(locale.LC_ALL, '')
# custom jinja filter for formatting numbers
def number_format(value):
return locale.format("%.2f",value, 1)
def remove_objects_from_invoice(invoice):
# Removes all entries from the invoice
# This must be done after the period has been set
# so that no entries are subsequently added to the invoice by the period
for obj in list(invoice.evalocl("leistungen")):
obj.rechnung = None
for obj in list(invoice.evalocl("spesen")):
obj.rechnung = None
for obj in list(invoice.evalocl("auslagen")):
obj.rechnung = None
for obj in list(invoice.evalocl("pauschalphasen")):
obj.rechnung = None
for obj in list(invoice.evalocl("vorschuesseaufrechnung")):
obj.vorschussRechnung = None
for obj in list(invoice.evalocl("vorschuesse")):
obj.rechnungen.remove(invoice)
def charge_licences(obj):
# depending on where the script is executed we select purchasetypphaselinks
purchasetypePhaseLinkList = vtcapp.createlist("Auslagetypphaselink")
if obj.evalocl("ocliskindof(Container)"):
if obj.evalocl("eintraege->first.ocliskindof(Projekt)"):
purchasetypePhaseLinkList.extend(obj.eval("eintraege.list->select(oclIsTypeOf(Projekt))->oclAsType(Projekt).allephasen->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)"))
elif obj.evalocl("eintraege->first.ocliskindof(Projektphase)"):
purchasetypePhaseLinkList.extend(obj.eval("eintraege.list->select(oclIsTypeOf(Projektphase))->oclAsType(Projektphase)->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)"))
else:
purchasetypePhaseLinkList = obj.eval("eintraege.oclastype(Auslagetypphaselink)->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)")
else:
if obj.evalocl("oclistypeof(Projekt)"):
purchasetypePhaseLinkList.extend(obj.eval("oclAsType(Projekt).allephasen->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)"))
elif obj.evalocl("oclistypeof(Projektphase)"):
purchasetypePhaseLinkList.extend(obj.eval("oclastype(Projektphase)->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)"))
else:
purchasetypePhaseLinkList = obj.eval("oclastype(Auslagetypphaselink)->asset->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)")
countInvoices = 0
# only take purchasetypphaselinks without purchases (-> not charged already)
purchasetypePhaseLinkList = purchasetypePhaseLinkList.evalocl("self->reject(getlinks('LnkAuslageAuslagetypphaselink_B')->size>0)")
if purchasetypePhaseLinkList:
# create purchases
for project in purchasetypePhaseLinkList.eval("phasen.phasegetprojekt->asset"):
licencePurchases = []
for purchaseTypePhaseLink in purchasetypePhaseLinkList:
if purchaseTypePhaseLink.eval("phasen.phasegetprojekt") == project:
purchase = vtcapp.createobject('OffeneAuslage')
purchase.addtag("licence")
purchase.projekt = purchaseTypePhaseLink.phasen.eval('phasegetprojekt')
purchase.phase = purchaseTypePhaseLink.phasen
purchase.bearbeiter = vtcapp.currentlogin()
purchase.linkto(purchaseTypePhaseLink, "LnkAuslageAuslagetypphaselink_A")
purchase.typ = purchaseTypePhaseLink.auslagetypen
purchase.anzahl = purchaseTypePhaseLink.lic_amount
purchase.wertproeinheitint = purchaseTypePhaseLink.wertproeinheitint
purchase.wertproeinheitext = purchaseTypePhaseLink.wertproeinheitext
purchase.lieferant = purchaseTypePhaseLink.lic_supplier
purchase.text = purchaseTypePhaseLink.eval("if offerttext='' then auslagetypen.text else offerttext endif + ' ' + bezeichnung")
if purchaseTypePhaseLink.lic_discountPercentage:
purchase.rabattProzent = purchaseTypePhaseLink.lic_discountPercentage
else:
if purchaseTypePhaseLink.lic_amount:
purchase.xrabattbetrag = purchaseTypePhaseLink.lic_discount*purchaseTypePhaseLink.lic_amount
else:
purchase.xrabattbetrag = purchaseTypePhaseLink.lic_discount
if not purchaseTypePhaseLink.lic_startdate:
purchaseTypePhaseLink.lic_startdate = vtcapp.currentdate()
else:
purchase.datum = purchaseTypePhaseLink.lic_startdate
# save licence
licencePurchases.append(purchase)
if licencePurchases:
# create invoice
invoice = vtcapp.createobject('Rechnung')
countInvoices += 1
invoice.von = None
invoice.bis = None
invoice.projekt = project
# remove all objects from invoice
remove_objects_from_invoice(invoice)
# add all purchases
for purchase in licencePurchases:
purchase.rechnung = invoice
if countInvoices == 0:
vtcapp.msgbox(vtcapp.translate("No licences available for invoicing."))
elif countInvoices == 1:
vtcapp.showdetailform(invoice)
else:
vtcapp.msgbox(vtcapp.translate("The process was successfully completed. {} invoices were created.").format(countInvoices))
else:
vtcapp.msgbox(vtcapp.translate("No licences available for invoicing."))
def date_as_monthtext(monthDate):
if monthDate:
# Returns text in format "July 2021"
locale.setlocale(locale.LC_ALL, '')
return calendar.month_name[monthDate.month] + ' ' + str(monthDate.year)
else:
return ""
def generate_period_text(startmonth, factor):
# Calculates a text that returns the period, e.g. January 2020 - March 2020.
if factor == 1:
# only one mont
return date_as_monthtext(startmonth)
else:
# factor-1, because we count from the first month and then, for example, for the quarter of from July only
endmonth = vtcapp.incmonth(startmonth, factor-1)
return date_as_monthtext(startmonth) + " - " + date_as_monthtext(endmonth)
def charge_service_contracts(obj):
# Python Script für Custom Dialog
dlgDefinition="""
<Dialog Title="{Translate 'Charge service contracts'}" Width="300" >
<DatePicker Name="InvoiceDate" Label="{Translate 'Invoice date'}"/>
<Dialog.Buttons>
<Button Text="OK" IsAccept="True" Command="{Binding OkCommand}" />
<Button Text="{Translate 'Cancel'}" IsCancel="True" Command="{Binding CancelCommand}" />
</Dialog.Buttons>
</Dialog>
"""
initValues = {}
initValues["InvoiceDate"] = vtcapp.currentdate()
ok, values = vtcapp.showcustomdialog(dlgDefinition, initValues)
if ok:
invoiceDate = values["InvoiceDate"]
period_start = vtcapp.incmonth(vtcapp.firstdayofmonth(invoiceDate), 1)
# depending on where the script is executed we select purchasetypphaselink and decide, if we show a dialog or not
purchasetypePhaseLinkList = vtcapp.createlist("Auslagetypphaselink")
showDialog = False
if obj.evalocl("ocliskindof(Container)"):
if obj.evalocl("eintraege->first.ocliskindof(Projekt)"):
purchasetypePhaseLinkList.extend(obj.eval("eintraege.list->select(oclIsTypeOf(Projekt))->oclAsType(Projekt).allephasen->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)"))
elif obj.evalocl("eintraege->first.ocliskindof(Projektphase)"):
purchasetypePhaseLinkList.extend(obj.eval("eintraege.list->select(oclIsTypeOf(Projektphase))->oclAsType(Projektphase)->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)"))
else:
purchasetypePhaseLinkList = obj.eval("eintraege.oclastype(Auslagetypphaselink)->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)")
showDialog = True
else:
if obj.evalocl("oclistypeof(Projekt)"):
purchasetypePhaseLinkList.extend(obj.eval("oclAsType(Projekt).allephasen->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)"))
showDialog = True
elif obj.evalocl("oclistypeof(Projektphase)"):
purchasetypePhaseLinkList.extend(obj.eval("oclastype(Projektphase)->select(ismemberreadable('auslagetypPhaseLink')).auslagetypPhaseLink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)"))
showDialog = True
else:
purchasetypePhaseLinkList = obj.eval("oclastype(Auslagetypphaselink)->asset->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)")
countInvoices = 0
purchasetypePhaseLinkListMakeInvoice = vtcapp.createlist("Auslagetypphaselink")
for purchasetypePhaseLink in purchasetypePhaseLinkList:
factor = check_contract(purchasetypePhaseLink, period_start)
if factor:
# Is there alredy a purchase for this month?
if not check_if_purchase_entry_exists(period_start, purchasetypePhaseLink):
# if no, create new purchase entry and link to invoice for phase afterwards
purchasetypePhaseLinkListMakeInvoice.append(purchasetypePhaseLink)
if purchasetypePhaseLinkListMakeInvoice:
dlgDefinition="""
<Dialog Title="{Translate 'Charge service contracts'}" Width="600">
<TextBlock Text="{{invoiceDateStr}}" Appearance="Info"/>
<TextBlock Text="{Translate 'Please select which contracts are to be invoiced.'}" Appearance="Info"/>
<Group>
<TextBlock Text="{Translate 'Service contract'}" Appearance="Info"/>
<TextBlock Text="{Translate 'Invoice period'}"/>
<TextBlock Text="{Translate 'Date of last invoice'}"/>
</Group>
{% for purchasetypephaselink in purchasetypePhaseLinkList %}
<Group>
<CheckBox ShowLabel="False" Help="{{purchasetypephaselink.eval("auslagetypen.text") + " " + purchasetypephaselink.bezeichnung| e }}" Name="{{"Check{}".format(purchasetypephaselink.objid)}}" Text="{{purchasetypephaselink.eval("auslagetypen.text") + " " + purchasetypephaselink.bezeichnung| e }}"/>
<TextBlock Text="{{purchasetypephaselink.eval("zusatzfeldasstring('lic_accountingInterval')")}}"/>
<TextBlock Text="{{purchasetypephaselink.eval("getlinks('LnkAuslageAuslagetypphaselink_B').oclastype(Auslage).rechnung->orderby(datum)->last.datum.asstring") | e}}" />
</Group>
{% endfor %}
<Dialog.Buttons>
<Button Text="OK" IsAccept="True" Command="{Binding OkCommand}" />
<Button Text="{Translate 'Cancel'}" IsCancel="True" Command="{Binding CancelCommand}" />
</Dialog.Buttons>
</Dialog>
"""
invoiceDateStr = vtcapp.translate("The following contracts are due for invoicing on {}.").format(invoiceDate.strftime("%d.%m.%Y"))
dlgDefinition = vtcapp.rendertemplate(dlgDefinition, invoiceDateStr = invoiceDateStr, purchasetypePhaseLinkList = purchasetypePhaseLinkListMakeInvoice)
initValues = {}
for purchasetypephaselink in purchasetypePhaseLinkListMakeInvoice:
initValues["Check" + str(purchasetypephaselink.objid)] = True
if showDialog:
ok, values = vtcapp.showcustomdialog(dlgDefinition, initValues)
if ok:
purchasetypePhaseLinkListEff = vtcapp.createlist("Auslagetypphaselink")
for purchasetypephaselink in purchasetypePhaseLinkListMakeInvoice:
if values["Check" + str(purchasetypephaselink.objid)]:
purchasetypePhaseLinkListEff.append(purchasetypephaselink)
else:
return
else:
purchasetypePhaseLinkListEff = purchasetypePhaseLinkListMakeInvoice
for project in purchasetypePhaseLinkListEff.evalocl("phasen.phasegetprojekt->asset"):
purchaseList = []
for purchasetypephaselink in purchasetypePhaseLinkListEff:
if purchasetypephaselink.eval("phasen.phasegetprojekt") == project:
number_of_months = check_contract(purchasetypephaselink, period_start)
period_end_date = calculate_period_end_date(period_start, number_of_months)
purchaseEntry = vtcapp.createobject("OffeneAuslage")
purchaseEntry.phase = purchasetypephaselink.phasen
purchaseEntry.typ = purchasetypephaselink.auslagetypen
vat_periods_list = calculate_vat_periods(period_start, period_end_date, purchaseEntry.mwstTyp)
for vat_period in vat_periods_list:
if not purchaseEntry:
purchaseEntry = vtcapp.createobject("OffeneAuslage")
purchaseEntry.addtag("licence")
purchaseEntry.bearbeiter = vtcapp.currentlogin()
purchaseEntry.typ = purchasetypephaselink.auslagetypen
purchaseEntry.phase = purchasetypephaselink.phasen
purchaseEntry.linkto(purchasetypephaselink, "LnkAuslageAuslagetypphaselink_A")
purchaseEntry.datum = vat_period.period_start
purchaseEntry.margin = None
purchaseEntry.lieferant = purchasetypephaselink.lic_supplier
purchaseEntry.wertproeinheitext = purchasetypephaselink.wertproeinheitext
purchaseEntry.wertproeinheitint = purchasetypephaselink.wertproeinheitint
if purchasetypephaselink.lic_amount:
purchaseEntry.anzahl = purchasetypephaselink.lic_amount * vat_period.partial_vat_factor
else:
purchaseEntry.xwertext = purchasetypephaselink.planwertauslagen * vat_period.partial_vat_factor
if purchasetypephaselink.lic_discountPercentage:
purchaseEntry.rabattProzent = purchasetypephaselink.lic_discountPercentage
elif purchasetypephaselink.lic_discount:
if purchasetypephaselink.lic_amount:
purchaseEntry.xrabattbetrag = purchasetypephaselink.lic_discount * purchasetypephaselink.lic_amount * vat_period.partial_vat_factor
else:
purchaseEntry.xrabattbetrag = purchasetypephaselink.lic_discount * vat_period.partial_vat_factor
else:
purchaseEntry.xrabattbetrag = 0
period_text = generate_period_text(vat_period.period_start, vat_period.period_end_date, project.evalocl("sprache.asstring"))
# if we have a pro rata purchase because of partial vat period we want to change the period text
if vat_period.partial_vat_factor != 1:
if purchaseEntry.anzahl:
period_text = "{} x {}".format(int(purchasetypephaselink.lic_amount), locale.format("%.2f", purchaseEntry.wertproeinheitext-purchaseEntry.rabattbetrag/purchaseEntry.anzahl, 1)) + " pro rata " + period_text
else:
period_text = "{} pro rata ".format(locale.format("%.2f",purchasetypephaselink.planwertauslagen, 1)) + " " + period_text
purchaseEntry.setkeyvalue("periodText", period_text)
purchaseEntry.text = purchasetypephaselink.eval("if offerttext='' then auslagetypen.text else offerttext endif + ' ' + bezeichnung")
purchaseList.append(purchaseEntry)
purchaseEntry = None
if len(purchaseList) > 0:
invoice = vtcapp.createobject("Rechnung")
countInvoices += 1
invoice.projekt = project
invoice.von = None
invoice.bis = None
invoice.datum = invoiceDate
remove_objects_from_invoice(invoice)
for purchaseEntry in purchaseList:
purchaseEntry.rechnung = invoice
if countInvoices == 0:
vtcapp.msgbox(vtcapp.translate("There are no contracts due for invoicing on {}.").format(invoiceDate.strftime("%d.%m.%Y")))
elif countInvoices == 1:
vtcapp.showdetailform(invoice)
else:
vtcapp.msgbox(vtcapp.translate("The process was successfully completed. {} invoices were created.").format(countInvoices))
def check_if_purchase_entry_exists(month, purchasetypephaselink):
# Checks if there is already a linked purchase entry in this month
# no matter if open or charged.
if month:
startdate = vtcapp.firstdayofmonth(month)
enddate = vtcapp.lastdayofmonth(month)
purchases = purchasetypephaselink.eval("getlinks('LnkAuslageAuslagetypphaselink_B').oclastype(Auslage)->select(datum>={})->select(datum<={})".format(vtcapp.ocldate(startdate), vtcapp.ocldate(enddate)))
else:
purchases = purchasetypephaselink.eval("getlinks('LnkAuslageAuslagetypphaselink_B').oclastype(Auslage)")
return (len(purchases) > 0)
def purchasetype_changes_on_purchasetypePhaselink(purchasetypephaselink):
# we only want to set values for licences and service contracts
typ = purchasetypephaselink.auslagetypen
if not typ:
return
if not (typ.lic_kindPurchaseType == 1 or typ.lic_kindPurchaseType == 2):
return
# we add tags to easily identify the object as licence sales or service contract
if typ.lic_kindPurchaseType == 1:
purchasetypephaselink.addtag("licence")
else:
purchasetypephaselink.removetag("licence")
if typ.lic_kindPurchaseType == 2:
purchasetypephaselink.addtag("servicecontract")
else:
purchasetypephaselink.removetag("servicecontract")
purchasetypephaselink.offertText = typ.text
purchasetypephaselink.wertProEinheitInt = typ.wertProEinheitInt
purchasetypephaselink.wertproeinheitkosten = typ.wertproeinheitkosten
purchasetypephaselink.wertproeinheitext = typ.wertproeinheitext
purchasetypephaselink.lic_supplier = typ.lic_supplier
if typ.lic_kindPurchaseType == 2:
purchasetypephaselink.lic_active = True
purchasetypephaselink.lic_accountingInterval = typ.lic_accountingInterval
def value_changes_on_purchasetypephaselink(purchasetypephaselink, eventmember):
if not purchasetypephaselink:
return
phase = purchasetypephaselink.phasen
if not phase:
return
projekt = phase.owningprojekt
if not projekt:
return
# we only want to calculate rates for licences and service contracts
typ = purchasetypephaselink.auslagetypen
if not typ:
return
if not (typ.lic_kindPurchaseType == 1 or typ.lic_kindPurchaseType == 2):
return
#---------------------------------------------------------------------------
if not purchasetypephaselink.lic_discount:
# we always want to remove discount without check, therefore it is set to zero when None
purchasetypephaselink.lic_discount = 0
if eventmember == "planWertAuslagen":
# if total is set manually, remove discount, amount and unit values
purchasetypephaselink.lic_discountPercentage = None
purchasetypephaselink.lic_discount = 0
purchasetypephaselink.wertProEinheitExt = None
purchasetypephaselink.lic_amount = None
purchasetypephaselink.lic_calcPrice = False
purchasetypephaselink.setkeyvalue("lic_textlicences", "")
return
if eventmember == "wertProEinheitExt":
# if unit value is set, calculate discount and total
if purchasetypephaselink.wertProEinheitExt:
if purchasetypephaselink.lic_discountPercentage:
purchasetypephaselink.lic_discount = purchasetypephaselink.wertProEinheitExt * purchasetypephaselink.lic_discountPercentage/100
if purchasetypephaselink.lic_amount:
purchasetypephaselink.planWertAuslagen = purchasetypephaselink.lic_amount * (purchasetypephaselink.wertProEinheitExt - purchasetypephaselink.lic_discount)
else:
purchasetypephaselink.planwertauslagen = 0
return
if eventmember == "lic_discountPercentage":
# if discount percentage is set, calculate discount and total
if purchasetypephaselink.lic_discountPercentage and purchasetypephaselink.wertProEinheitExt:
if purchasetypephaselink.lic_discountPercentage:
purchasetypephaselink.lic_discount = purchasetypephaselink.wertProEinheitExt * purchasetypephaselink.lic_discountPercentage/100
else:
purchasetypephaselink.lic_discount = 0
if purchasetypephaselink.lic_amount:
purchasetypephaselink.planWertAuslagen = purchasetypephaselink.lic_amount * (purchasetypephaselink.wertProEinheitExt - purchasetypephaselink.lic_discount)
else:
purchasetypephaselink.lic_discount = 0
if purchasetypephaselink.lic_amount and purchasetypephaselink.wertProEinheitExt:
purchasetypephaselink.planWertAuslagen = purchasetypephaselink.lic_amount * purchasetypephaselink.wertProEinheitExt
return
if eventmember == "lic_amount":
# if amount is set, calculate discount and total
if purchasetypephaselink.lic_amount and purchasetypephaselink.wertproeinheitext:
if purchasetypephaselink.lic_discountPercentage:
purchasetypephaselink.lic_discount = purchasetypephaselink.wertProEinheitExt * purchasetypephaselink.lic_discountPercentage/100
if purchasetypephaselink.wertProEinheitExt:
purchasetypephaselink.planWertAuslagen = purchasetypephaselink.lic_amount * (purchasetypephaselink.wertProEinheitExt - purchasetypephaselink.lic_discount)
else:
purchasetypephaselink.planwertauslagen = 0
return
if eventmember == "lic_discount":
# if discount is set, remove discount percentage and calculate total
purchasetypephaselink.lic_discountPercentage = None
if purchasetypephaselink.lic_amount and purchasetypephaselink.wertProEinheitExt:
purchasetypephaselink.planWertAuslagen = purchasetypephaselink.lic_amount * (purchasetypephaselink.wertProEinheitExt - purchasetypephaselink.lic_discount)
return
if eventmember == "lic_calcPrice":
# activated, set all pervios calulations to zero
if purchasetypephaselink.lic_calcPrice:
purchasetypephaselink.lic_discountPercentage = None
purchasetypephaselink.lic_discount = 0
purchasetypephaselink.wertProEinheitExt = None
purchasetypephaselink.lic_amount = None
purchasetypephaselink.planwertauslagen = 0
else:
purchasetypephaselink.wertproeinheitext = typ.wertproeinheitext
purchasetypephaselink.setkeyvalue("licpercent", None)
purchasetypephaselink.setkeyvalue("lictotal", None)
purchasetypephaselink.setkeyvalue("lic_textlicences", None)
purchasetypephaselink.planwertauslagen = 0
def new_purchasetypephaselink(purchasetypephaselink):
phase = purchasetypephaselink.phasen
if not phase:
return
if phase.eval("zusatzfeldint('lic_kindPhase')") == 1:
purchasetypephaselink.addtag("licence")
if phase.eval("zusatzfeldint('lic_kindPhase')") == 2:
purchasetypephaselink.addtag("servicecontract")
def calculate_price_from_licences(obj):
dialog="""
<Dialog Title="{Translate 'Select licences' }" Width="750">
<TextBlock Text="{Translate 'Please select the licences from which the price is to be calculated.' }" Appearance="Info" FitMode="Wrap"/>
<TextBlock ShowLabel="True" IsBold="True" Label="{Translate 'Project' }" Text="{{project| e}}" Appearance="Info"/>
<TextBlock ShowLabel="True" IsBold="True" Label="{Translate 'Product' }" Text="{{product| e}}" Appearance="Info"/>
<Spacer Height="10"/>
<Group>
<TextBlock IsBold="True" Text="{Translate 'Licence sale'}" Appearance="Info" HorizontalAlignment="Left" FlexWidth="6"/>
<TextBlock IsBold="True" Text="{Translate 'Purchase date'}" Appearance="Info" HorizontalAlignment="Left" FlexWidth="2"/>
<TextBlock IsBold="True" Text="{Translate 'Quantity'}" Appearance="Info" HorizontalAlignment="Right"/>
{% if isInclDiscount %}
<TextBlock IsBold="True" Text="{Translate 'Price incl. discount'}" Appearance="Info" HorizontalAlignment="Right" FlexWidth="2"/>
{% else %}
<TextBlock IsBold="True" Text="{Translate 'Price'}" Appearance="Info" HorizontalAlignment="Right"/>
{% endif %}
<TextBlock IsBold="True" Text="{Translate 'Total'}" Appearance="Info" HorizontalAlignment="Right" FlexWidth="2"/>
</Group>
{% for licence in licences %}
<Group>
<CheckBox Name="{{"Check"+licence.eval("objid.asstring")}}" FlexWidth="6" Text="{{licence.eval("if offerttext='' then auslagetypen.text else offerttext endif + ' ' + bezeichnung")| e}}" ShowLabel="False" HorizontalAlignment="Left"/>
<TextBlock Text="{{licence.eval("zusatzfeldasstring('lic_startdate')")}}" Appearance="Info" HorizontalAlignment="Left" FlexWidth="2"/>
<TextBlock Text="{{licence.eval("zusatzfeldasstring('lic_amount')")}}" Appearance="Info" HorizontalAlignment="Right"/>
{% if isInclDiscount %}
<TextBlock Text="{{number_format(licence.eval("wertproeinheitext - zusatzfeldcurr('lic_discount')"))}}" Appearance="Info" FlexWidth="2" HorizontalAlignment="Right"/>
{% else %}
<TextBlock Text="{{licence.eval("wertproeinheitext.asstring")}}" Appearance="Info" HorizontalAlignment="Right"/>
{% endif %}
{% if isInclDiscount %}
<TextBlock Text="{{licence.eval("planWertAuslagen.asstring")}}" Appearance="Info" HorizontalAlignment="Right" FlexWidth="2"/>
{% else %}
<TextBlock Text="{{number_format(licence.eval("if wertproeinheitext.notNull then wertproeinheitext * zusatzfeldcurr('lic_amount') else planWertAuslagen endif"))}}" Appearance="Info" HorizontalAlignment="Right" FlexWidth="2"/>
{% endif %}
</Group>
{% endfor %}
<Spacer Height="10"/>
<TextBlock Text="{Translate 'Please enter the percentage of the licence amount (sum of the selected entries) to be charged in the service contract.' }" Appearance="Info" FitMode="Wrap"/>
<TextBox Name="Percentage" IsLabelBold="True" ContentAlignment="Right" Label="{Translate 'Percent'}" WidthFraction="0.3"/>
<Dialog.Buttons>
<Button Text="OK" IsAccept="True" Command="{Binding OkCommand}" />
<Button Text="{Translate 'Cancel'}" IsCancel="True" Command="{Binding CancelCommand}" />
</Dialog.Buttons>
</Dialog>
"""
serviceContract = obj
project = serviceContract.eval("phasen.phasegetprojekt")
product = serviceContract.eval("auslagetypen.zusatzfeldobj('lic_product')")
if not product:
licenceList = serviceContract.eval("phasen.phasegetprojekt.allephasen.auslagetypphaselink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)")
productname = ""
else:
licenceList = serviceContract.eval("phasen.phasegetprojekt.allephasen.auslagetypphaselink->select(auslagetypen.zusatzfeldobj('lic_product').objid={})->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)".format(str(product.objid)))
productname = product.zk28_licProductname
if not licenceList:
vtcapp.msgbox(vtcapp.translate("There are no licence sales for this product."))
return
isInclDiscount = serviceContract.auslagetypen.lic_calcInclDiscount
dialog = vtcapp.rendertemplate(dialog, vtcapp = vtcapp, project = project.code, product = productname, licences = licenceList, isInclDiscount = isInclDiscount, number_format = number_format)
initValues = {}
initValues["Percentage"] = serviceContract.eval("auslagetypen.zusatzfeldcurr('lic_percentageOfSoldLicences').asstring")
for licence in licenceList:
initValues["Check"+licence.eval("objid.asstring")] = True
ok, values = vtcapp.showcustomdialog(dialog, initValues)
if ok:
total = 0
for licence in licenceList:
if values["Check"+licence.eval("objid.asstring")]:
if serviceContract.auslagetypen.lic_calcInclDiscount or not (licence.lic_amount and licence.wertProEinheitExt):
total += licence.planwertAuslagen
else:
total += licence.lic_amount*licence.wertProEinheitExt
try:
percent = float(values["Percentage"].replace(",", "."))/100.0
except:
vtcapp.msgbox(vtcapp.translate("Invalid percentage"))
return
calculated_text = (locale.format("%.2f",percent*100, 1) + " " + vtcapp.translate("% of licence total") + " " + locale.format("%.2f",total, 1)) + " = " + locale.format("%.2f",total*percent, 1)
vtcapp.disableevents()
serviceContract.planwertAuslagen = total*percent
serviceContract.setkeyvalue("lic_textlicences", calculated_text)
serviceContract.setkeyvalue("licpercent", percent)
serviceContract.setkeyvalue("lictotal", total)
serviceContract.lic_amount = None
serviceContract.lic_discount = None
serviceContract.lic_discountPercentage = None
serviceContract.wertproeinheitext = None
vtcapp.enableevents()
def get_amount_service_contracts(client, monthdate):
result = 0
purchasetypePhaseLinkList = client.eval("projekte.allephasen.auslagetypphaselink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)")
for purchasetypphaselink in purchasetypePhaseLinkList:
# check if contract is active and due tue charge
if check_contract(purchasetypphaselink, monthdate):
result += purchasetypphaselink.planwertauslagen
return result
def check_contract(purchasetypphaselink, monthdate):
# check if contract is active
if (purchasetypphaselink.lic_startdate and purchasetypphaselink.lic_startdate <= vtcapp.firstdayofmonth(monthdate)) and \
(not purchasetypphaselink.lic_enddate or purchasetypphaselink.lic_enddate >= vtcapp.lastdayofmonth(monthdate)):
# contract is active, now we check if contract has to be charged this month
if purchasetypphaselink.lic_accountingInterval == 0:
factor = 1
elif purchasetypphaselink.lic_accountingInterval == 1:
factor = 3
elif purchasetypphaselink.lic_accountingInterval == 2:
factor = 6
else:
factor = 12
# the first month is the month with the startdate
# then again after <<factor>> months
# so if we divide the difference by <<factor>> we should get an integer (and no rest)
# Important: This is not the charging date, but the first month of the period for which the contract is charged!
# i.e. for May we charge in April!
if (purchasetypphaselink.lic_startdate.month-monthdate.month) % factor:
factor = 0
return factor
def delete_licence_invoice(invoice):
# if invoice is deleted, delete all purchases that where create by script "Charge servicecontracts" or "Charge licences"
if invoice.auslagen:
uniList = list(invoice.eval("auslagen->select(hastag('licence'))"))
for purchase in uniList:
purchase.delete()
def get_classname(user):
vtcapp.beginsystemcontext()
scripttext = vtcapp.evalocl("scripteintrag->select(bezeichnung='tag_new_purchasetypephaselink')->first.scripttext")
vtcapp.scriptexecute(scripttext)
text = user.getkeystring("tmpkey")
user.setkeyvalue("tmpkey", "")
return text
vtcapp.endsystemcontext()
locale.setlocale(locale.LC_ALL, '')
def date_as_monthtext(monthDate, language):
if monthDate:
# Returns text in format "July 2021"
locale.setlocale(locale.LC_ALL, '')
return vtcapp.translate(calendar.month_name[monthDate.month], language) + ' ' + str(monthDate.year)
else:
return ""
def generate_period_text(startmonth, endmonth, language):
# Calculates a text that returns the period, e.g. January 2020 - March 2020.
if startmonth.month == endmonth.month:
# only one month
return date_as_monthtext(startmonth, language)
else:
return date_as_monthtext(startmonth, language) + " - " + date_as_monthtext(endmonth, language)
class VATPeriod():
""" Class for VAT periods """
def __init__(self, period_start, period_end_date, partial_vat_factor):
self.period_start = period_start
self.partial_vat_factor = partial_vat_factor
self.period_end_date = period_end_date
def get_months_diff(date1, date2):
# calculates the difference in months between two dates and returns result as float
return float(date2.year*12 + date2.month+1 - (date1.year*12 + date1.month))
def calculate_vat_periods(startmonth, endmonth, vat_type):
# calculates vat periods in Vertec depending on vat changes (class MWSTDetail)
# first we search for all possible changes in the given interval
possible_vat_changes_list = vat_type.evalocl("details->select(satz.notNull)->select(datum.notNull)\
->select(datum>={})\
->select(datum<={})->orderby(datum)".format(vtcapp.ocldate(startmonth), vtcapp.ocldate(endmonth)))
# we start with the given startmonth, but as we have to compare to dates later on, we remove the time part of the datetime
actual_startdate = startmonth.date()
vat_periods_list = []
# we create an object for the first entry or only entry if no changes exist
vat_period_obj = VATPeriod(startmonth, endmonth, 1)
vat_periods_list.append(vat_period_obj)
# the end of each period is defined by the start of the next one. So we have to edit each previous object when we reach the next one.
prev_obj = vat_period_obj
for vat_change in possible_vat_changes_list:
vat_change_date = vat_change.datum
# we only take into account periods with length > 0, i.e., the start date of the new period must be > (not >=) than the start date of the last period
# if there is more than one object with same change date one of them is ignored (randomly)
if actual_startdate <= vat_change_date and vat_change_date > prev_obj.period_start.date():
# the end date for the previous period is one day before the start date of the actual period
last_end_date = vtcapp.incday(vat_change_date, -1)
actual_startdate = vat_change_date
vat_period_obj = VATPeriod(actual_startdate, None, None)
vat_periods_list.append(vat_period_obj)
if prev_obj:
prev_obj.period_end_date = last_end_date
# for each object we calcualate, which part the time intervall has in relation to the whole given period.
# this gives us a factor that we can use to calculate the amount that has to be charged for this part of the period later
prev_obj.partial_vat_factor = (get_months_diff(prev_obj.period_start, last_end_date))/(get_months_diff(startmonth, endmonth))
# when we step to the next period the actual object becomes the new previous object
prev_obj = vat_period_obj
# the very last object in the list is now stored in prev_obj and we set the end date ob the period as end date
# also for the last part of the period we have to calculate the part of the intervall
# if there where no changes at all, period_start and period_end_date are the same as startmonth and endmonth and the factor is 1
prev_obj.period_end_date = endmonth
prev_obj.partial_vat_factor = (get_months_diff(prev_obj.period_start, endmonth))/(get_months_diff(startmonth, endmonth))
return vat_periods_list
def calculate_period_end_date(period_start, number_of_months):
return vtcapp.incday(vtcapp.incmonth(period_start, number_of_months),-1)
NonefalsetruefalsePythonScript_NewPurchasetypephaselinkNew purchasetypephaselinkAuslageTypPhaseLinkfalse# coding: windows-1252
#
#---Bezeichnung: New purchasetypephaselink
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType: Neu
# EventClass: AuslageTypPhaseLink
# EventMembers:
#---Set tag for licence or servicecontract on purchasetypephaselink
import module_licences
module_licences.new_purchasetypephaselink(argobject)
CreatefalsefalsefalsePythonScript_PurchasetypeChangesOnPurchasetypephaselinkEvent: Purchasetype changes on purchasetypephaselinkauslagetypenAuslageTypPhaseLinkfalse# coding: windows-1252
#
#---Bezeichnung: Purchasetype changes on purchasetypephaselink
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType: Geändert
# EventClass: AuslageTypPhaseLink
# EventMembers: auslagetypen
#---Set default values on purchasetypephaselink
import module_licences
module_licences.purchasetype_changes_on_purchasetypePhaselink(argobject)
ChangedfalsefalsefalsePythonScript_tmp_tag_new_purchasetypephaselinktag_new_purchasetypephaselinkfalse# coding: windows-1252
#
#---Bezeichnung: tag_new_purchasetypephaselink
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType:
# EventClass:
# EventMembers:
#---Set tmpkey for licence or servicecontract on currentlogin
vtcapp.beginsystemcontext()
user = vtcapp.evalocl("Timsession.allinstances.login->first")
text = ""
if argobject.eval("oclistypeof(Projektphase)") or argobject.eval("oclistypeof(Auslagetypphaselink)"):
if argobject.hastag("licence") or argobject.eval("zusatzfeldint('lic_kindPhase')") == 1:
text = "Licence sale"
if argobject.hastag("servicecontract") or argobject.eval("zusatzfeldint('lic_kindPhase')") == 2:
text = "Service contract"
user.setkeyvalue("tmpkey", text)
vtcapp.endsystemcontext()
NonefalsetruefalsePythonScript_ValueChangesOnPurchasetypephaselinkEvent: Value changes on purchasetypephaselinklic_amount, wertProEinheitInt, wertproeinheitext, planWertAuslagen, lic_discountPercentage, lic_discount, lic_calcPriceAuslageTypPhaseLinkfalse# coding: windows-1252
#
#---Bezeichnung: Value changes on purchasetypephaselink
# Klassen:
# CondExpression:
# ObjectScript:
# ContainerScript:
# EventType: Geändert
# EventClass: purchasetypephaselink
# EventMembers: lic_amount, wertProEinheitInt, wertproeinheitext, planWertAuslagen, lic_discountPercentage, lic_discount
#---Calculates rates and dicsounts
import module_licences
try:
# we disable events here, because we set values that would trigger this script as well
vtcapp.disableevents()
module_licences.value_changes_on_purchasetypephaselink(argobject, args.eventmember)
finally:
vtcapp.enableevents()
ChangedfalsetruefalsePythonWrapperLinkTyp_LizenzverkaufPhasetruetruefalsefalse0falsefalseProjektPhase-1WrapperLinkContainerPhasefalsetruephasenfalsefalsefalse0falsefalseauslagetypphaselinkAuslageTypPhaseLink85WrapperLinkContainerLicence saletruetrue17truetrue00cmbTypfalse<ComboBox Override="cmbTyp" ShowNavLinkButton="True" ListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=1)" GhostrowListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=1)" />auslagetypenfalse0Purchase typetrue100falsefalse01falsebezeichnungfalse0Designationtrue120falsefalse110truezusatzfeldcurr('lic_amount')false0Quantitytrue50falsefalse111trueplanwertauslagenfalse0Totaltrue60falsefalse012clGreenfalse''false0true3falsefalse013false<DatePicker/>zusatzfelddate('lic_startDate')false0Purchase datetrue100falsefalse114falsesumwertextfalse0Chargedtrue60falsefalse02clGreenfalse''false0true3falsefalse13falsewertProEinheitIntfalse0Purchase pricetrue70falsefalse14falseauslagetypen.wertProEinheitExttrue0List selling pricetrue95falsefalse15falsewertProEinheitExtfalse0Selling pricetrue70falsefalse16falsezusatzfeldcurr('lic_discountPercentage')false0Discount %true70falsefalse17falsezusatzfeldcurr('lic_discount')false0Discount amounttrue70falsefalse18falsewertProEinheitExt-zusatzfeldcurr('lic_discount')false0Price incl. discounttrue95falsefalse09clgreenfalse''false0true3falsefalseauslagetypphaselink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=1)falseWrapperLinkTyp_PhaseServicevertraegetruetruefalsefalse0falsefalseauslagetypphaselinkAuslageTypPhaseLink85WrapperLinkContainerService contractstruetrue17truetrue00cmbTypfalse<ComboBox Override="cmbTyp" ShowNavLinkButton="True" ListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=2)" GhostrowListExpression="Auslagetyp.allinstances->select(aktiv)->select(zusatzfeldint('lic_kindPurchaseType')=2)" />auslagetypenfalse0Purchase typetrue100falsefalse01falsebezeichnungfalse0Designationtrue120falsefalse110truezusatzfeldcurr('lic_amount')false0Quantitytrue50falsefalse111falseplanwertauslagenfalse0Totaltrue60falsefalse012clGreenfalse''false0true3falsefalse013false<DatePicker/>zusatzfelddate('lic_startDate')false0Start datetrue60falsefalse014cmbzusatzfeldrndzusatzfeldfalsezusatzfeldint('lic_accountingInterval')false0Invoice periodtrue100falsefalse015falsegetlinks('LnkAuslageAuslagetypphaselink_B').oclastype(Auslage).rechnung->orderby(datum)->last.datumfalse0Date of last invoicetrue115falsefalse116falsesumwertextfalse0Chargedtrue60falsefalse02clGreenfalse''false0true3falsefalse13falsewertProEinheitIntfalse0Purchase pricetrue70falsefalse14falseauslagetypen.wertProEinheitExttrue0List selling pricetrue95falsefalse15falsewertProEinheitExtfalse0Selling pricetrue70falsefalse16falsezusatzfeldcurr('lic_discountPercentage')false0Discount %true70falsefalse17truezusatzfeldcurr('lic_discount')false0Discount amounttrue70falsefalse18truewertProEinheitExt-zusatzfeldcurr('lic_discount')false0Price incl. discountfalse95falsefalse09clgreenfalse''false0true3falsefalseauslagetypphaselink->select(auslagetypen.zusatzfeldint('lic_kindPurchaseType')=2)falsefalsefalse0falsefalseProjektPhase-1WrapperLinkContainerPhasefalsetruephasenfalse