Author: nmalin
Date: Fri Aug 31 17:29:55 2018 New Revision: 1839778 URL: http://svn.apache.org/viewvc?rev=1839778&view=rev Log: Improved: Convert InvoiceServices.xml mini lang to groovy (OFBIZ-9986) Convert services getNextInvoiceId, invoiceSequenceEnforced and invoiceSequenceRestart from minilang to groovy. This is a subtask of OFBIZ-9350 Deprecate Mini Lang Thanks to Leila Mekika for this issue Added: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy (with props) Modified: ofbiz/ofbiz-framework/trunk/applications/accounting/minilang/invoice/InvoiceServices.xml ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_invoice.xml Added: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy?rev=1839778&view=auto ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy (added) +++ ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy Fri Aug 31 17:29:55 2018 @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.ofbiz.base.util.Debug +import org.apache.ofbiz.base.util.UtilDateTime +import org.apache.ofbiz.base.util.UtilValidate +import org.apache.ofbiz.entity.GenericValue +import org.apache.ofbiz.service.ServiceUtil + +import java.sql.Timestamp + +def getNextInvoiceId() { + result = success() + + // try to find PartyAcctgPreference for parameters.partyId, see if we need any special invoice number sequencing + GenericValue partyAcctgPreference = from('PartyAcctgPreference').where(parameters).queryOne() + if (Debug.infoOn()) Debug.logInfo("In getNextInvoiceId partyId is [${parameters.partyId}], partyAcctgPreference: ${partyAcctgPreference}", 'InvoiceServices.groovy') + + String customMethodName = null; + String invoiceIdPrefix = ''; + if (partyAcctgPreference) { + invoiceIdPrefix = partyAcctgPreference.invoiceIdPrefix + //see OFBIZ-3765 beware of OFBIZ-3557 + GenericValue customMethod = partyAcctgPreference.getRelatedOne('InvoiceCustomMethod', true) + if (customMethod) { + customMethodName = customMethod.customMethodName + } else { + //retrieve service from deprecated enumeration see OFBIZ-3765 beware of OFBIZ-3557 + if ('INVSQ_ENF_SEQ' == partyAcctgPreference.oldInvoiceSequenceEnumId) { + customMethodName = 'invoiceSequenceEnforced' + } + if ('INVSQ_RESTARTYR' == partyAcctgPreference.oldInvoiceSequenceEnumId) { + customMethodName = 'invoiceSequenceRestart' + } + } + } else { + Debug.logWarning('Acctg preference not defined for partyId [${parameters.partyId}]', 'InvoiceServices.groovy') + } + + String invoiceIdTemp = '' + if (customMethodName) { + parameters.partyAcctgPreference = partyAcctgPreference + Map serviceResult = run service: customMethodName, with: parameters + if (ServiceUtil.isError(serviceResult)) return serviceResult + invoiceIdTemp = serviceResult.invoiceId + } else { + Debug.logInfo('In createInvoice sequence enum Standard', 'InvoiceServices.groovy') + //default to the default sequencing: INVSQ_STANDARD + invoiceIdTemp = parameters.invoiceId + if (!invoiceIdTemp) { + invoiceIdTemp = delegator.getNextSeqId('Invoice', 1) + } else { + //check the provided ID + errorMsg = UtilValidate.checkValidDatabaseId(invoiceIdTemp) + if (errorMsg != null) { + return error("In getNextInvoiceId ${errorMsg}") + } + } + } + + // use invoiceIdTemp along with the invoiceIdPrefix to create the real ID + String invoiceId = invoiceIdPrefix + invoiceIdTemp + result.invoiceId = invoiceId + return result +} + +def invoiceSequenceEnforced() { + result = success() + + Debug.logInfo('In createInvoice sequence enum Enforced', 'InvoiceServices.groovy') + GenericValue partyAcctgPreference = parameters.partyAcctgPreference + //this is sequential sequencing, we can't skip a number, also it must be a unique sequence per partyIdFrom + + Long lastInvoiceNumber = 1 + if (partyAcctgPreference.lastInvoiceNumber) { + lastInvoiceNumber = partyAcctgPreference.lastInvoiceNumber + 1 + } + + partyAcctgPreference.lastInvoiceNumber = lastInvoiceNumber + delegator.store(partyAcctgPreference) + result.invoiceId = lastInvoiceNumber + return result +} + +def invoiceSequenceRestart() { + result = success() + + Debug.logInfo('In createInvoice sequence enum Enforced', 'InvoiceServices.groovy') + GenericValue partyAcctgPreference = parameters.partyAcctgPreference + //this is sequential sequencing, we can't skip a number, also it must be a unique sequence per partyIdFrom + + Timestamp nowTimestamp = UtilDateTime.nowTimestamp() + if (!partyAcctgPreference.lastInvoiceRestartDate) { + //if no lastInvoiceRestartDate then it's easy, just start now with 1 + partyAcctgPreference.lastInvoiceNumber = 1l + partyAcctgPreference.lastInvoiceRestartDate = nowTimestamp + } else { + //first figure out if we need to reset the lastInvoiceNumber; is the lastInvoiceRestartDate after the fiscalYearStartMonth/Day for this year? + curYearFiscalStartDate = UtilDateTime.getYearStart(nowTimestamp, partyAcctgPreference.fiscalYearStartDay, partyAcctgPreference.fiscalYearStartMonth, 0l) + if (partyAcctgPreference.lastInvoiceRestartDate < curYearFiscalStartDate && nowTimestamp >= curYearFiscalStartDate) { + //less than fiscal year start, we need to reset it + partyAcctgPreference.lastInvoiceNumber = 1l + partyAcctgPreference.lastInvoiceRestartDate = nowTimestamp + } else { + //greater than or equal to fiscal year start or nowTimestamp hasn't yet hit the current year fiscal start date, we're okay, just increment + partyAcctgPreference.lastInvoiceNumber += 1l + } + } + delegator.store(partyAcctgPreference) + + //get the current year string for prefix, etc; simple 4 digit year date string (using system defaults) + Integer curYearString = UtilDateTime.getYear(partyAcctgPreference.lastInvoiceRestartDate, timeZone, locale) + result.invoiceId = "${curYearString}-${partyAcctgPreference.lastInvoiceNumber}" + return result +} + Propchange: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/ofbiz-framework/trunk/applications/accounting/groovyScripts/invoice/InvoiceServices.groovy ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ofbiz/ofbiz-framework/trunk/applications/accounting/minilang/invoice/InvoiceServices.xml URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/minilang/invoice/InvoiceServices.xml?rev=1839778&r1=1839777&r2=1839778&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/accounting/minilang/invoice/InvoiceServices.xml (original) +++ ofbiz/ofbiz-framework/trunk/applications/accounting/minilang/invoice/InvoiceServices.xml Fri Aug 31 17:29:55 2018 @@ -21,127 +21,6 @@ under the License. <simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ofbiz.apache.org/Simple-Method" xsi:schemaLocation="http://ofbiz.apache.org/Simple-Method http://ofbiz.apache.org/dtds/simple-methods.xsd"> - <simple-method method-name="getNextInvoiceId" short-description="Get Next invoiceId"> - <!-- try to find PartyAcctgPreference for parameters.partyId, see if we need any special invoice number sequencing --> - <entity-one entity-name="PartyAcctgPreference" value-field="partyAcctgPreference" auto-field-map="false"> - <field-map field-name="partyId" from-field="parameters.partyId"/> - </entity-one> - <log level="info" message="In getNextInvoiceId partyId is [${parameters.partyId}], partyAcctgPreference: ${partyAcctgPreference}"/> - - <if-not-empty field="partyAcctgPreference"> - <!-- see OFBIZ-3765 beware of OFBIZ-3557 --> - <get-related-one relation-name="InvoiceCustomMethod" value-field="partyAcctgPreference" to-value-field="customMethod"/> - <else> - <log level="warning" message="Acctg preference not defined for partyId [${parameters.partyId}]"/> - </else> - </if-not-empty> - - <if-not-empty field="customMethod"> - <set field="customMethodName" from-field="customMethod.customMethodName"/> - <else><!-- retrieve service from deprecated enumeration see OFBIZ-3765 beware of OFBIZ-3557 --> - <if-compare operator="equals" value="INVSQ_ENF_SEQ" field="partyAcctgPreference.oldInvoiceSequenceEnumId"> - <set field="customMethodName" value="invoiceSequenceEnforced"/> - </if-compare> - <if-compare operator="equals" value="INVSQ_RESTARTYR" field="partyAcctgPreference.oldInvoiceSequenceEnumId"> - <set field="customMethodName" value="invoiceSequenceRestart"/> - </if-compare> - </else> - </if-not-empty> - - <if-not-empty field="customMethodName"> - <set-service-fields service-name="${customMethodName}" map="parameters" to-map="customMethodMap"/> - <set field="customMethodMap.partyAcctgPreference" from-field="partyAcctgPreference"/> - <call-service service-name="${customMethodName}" in-map-name="customMethodMap"> - <result-to-field result-name="invoiceId" field="invoiceIdTemp"/> - </call-service> - <else> - <log level="info" message="In createInvoice sequence enum Standard"/> - <!-- default to the default sequencing: INVSQ_STANDARD --> - <set from-field="parameters.invoiceId" field="invoiceIdTemp"/> - <if-empty field="invoiceIdTemp"> - <sequenced-id sequence-name="Invoice" field="invoiceIdTemp"/> - <else> - <!-- check the provided ID --> - <check-id field="invoiceIdTemp"/> - <check-errors/> - </else> - </if-empty> - </else> - </if-not-empty> - - <!-- use invoiceIdTemp along with the invoiceIdPrefix to create the real ID --> - <set field="invoiceId" value="${partyAcctgPreference.invoiceIdPrefix}${str:toString(invoiceIdTemp)}"/> - <field-to-result field="invoiceId" result-name="invoiceId"/> - </simple-method> - - <simple-method method-name="invoiceSequenceEnforced" short-description="Enforced Sequence (no gaps, per organization)"> - <log level="info" message="In createInvoice sequence enum Enforced"/> - <set field="partyAcctgPreference" from-field="parameters.partyAcctgPreference"/> - <!-- this is sequential sequencing, we can't skip a number, also it must be a unique sequence per partyIdFrom --> - - <if-not-empty field="partyAcctgPreference.lastInvoiceNumber"> - <calculate field="partyAcctgPreference.lastInvoiceNumber" type="Long"> - <calcop operator="add" field="partyAcctgPreference.lastInvoiceNumber"/> - <number value="1"/> - </calculate> - <else> - <calculate field="partyAcctgPreference.lastInvoiceNumber" type="Long"><number value="1"/></calculate> - </else> - </if-not-empty> - <store-value value-field="partyAcctgPreference"/> - <set from-field="partyAcctgPreference.lastInvoiceNumber" field="invoiceId"/> - <field-to-result field="invoiceId" result-name="invoiceId"/> - </simple-method> - - <simple-method method-name="invoiceSequenceRestart" short-description="Restart on Fiscal Year (no gaps, per org, reset to 1 each year)"> - <log level="info" message="In createInvoice sequence enum Restart"/> - <set field="partyAcctgPreference" from-field="parameters.partyAcctgPreference"/> - <!-- this is sequential sequencing, we can't skip a number; except that it is restarted each fiscal year --> - - <now-timestamp field="nowTimestamp"/> - <if-empty field="partyAcctgPreference.lastInvoiceRestartDate"> - <!-- if no lastInvoiceRestartDate then it's easy, just start now with 1 --> - <calculate field="partyAcctgPreference.lastInvoiceNumber" type="Long"><number value="1"/></calculate> - <set from-field="nowTimestamp" field="partyAcctgPreference.lastInvoiceRestartDate"/> - <else> - <!-- first figure out if we need to reset the lastInvoiceNumber; is the lastInvoiceRestartDate after the fiscalYearStartMonth/Day for this year? --> - <calculate field="zeroLong" type="Long"><number value="0"/></calculate> - <call-class-method class-name="org.apache.ofbiz.base.util.UtilDateTime" method-name="getYearStart" ret-field="curYearFiscalStartDate"> - <field field="nowTimestamp" type="java.sql.Timestamp"/> - <field field="partyAcctgPreference.fiscalYearStartDay" type="java.lang.Number"/> - <field field="partyAcctgPreference.fiscalYearStartMonth" type="java.lang.Number"/> - <field field="zeroLong" type="java.lang.Number"/> - </call-class-method> - <if> - <condition> - <and> - <if-compare-field field="partyAcctgPreference.lastInvoiceRestartDate" to-field="curYearFiscalStartDate" operator="less" type="Timestamp"/> - <if-compare-field field="nowTimestamp" to-field="curYearFiscalStartDate" operator="greater-equals" type="Timestamp"/> - </and> - </condition> - <then> - <!-- less than fiscal year start, we need to reset it --> - <calculate field="partyAcctgPreference.lastInvoiceNumber" type="Long"><number value="1"/></calculate> - <set from-field="nowTimestamp" field="partyAcctgPreference.lastInvoiceRestartDate"/> - </then> - <else> - <!-- greater than or equal to fiscal year start or nowTimestamp hasn't yet hit the current year fiscal start date, we're okay, just increment --> - <calculate field="partyAcctgPreference.lastInvoiceNumber" type="Long"> - <calcop operator="add" field="partyAcctgPreference.lastInvoiceNumber"/> - <number value="1"/> - </calculate> - </else> - </if> - </else> - </if-empty> - <store-value value-field="partyAcctgPreference"/> - - <!-- get the current year string for prefix, etc; simple 4 digit year date string (using system defaults) --> - <set field="curYearString" value="${str:toString(date:year(partyAcctgPreference.lastInvoiceRestartDate, util:defaultTimeZone(), util:defaultLocale()))}"/> - <set field="invoiceId" value="${curYearString}-${str:toString(partyAcctgPreference.lastInvoiceNumber)}"/> - <field-to-result field="invoiceId" result-name="invoiceId"/> - </simple-method> - <simple-method method-name="createInvoice" short-description="Create a new Invoice"> <now-timestamp field="nowTimestamp"/> Modified: ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_invoice.xml URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_invoice.xml?rev=1839778&r1=1839777&r2=1839778&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_invoice.xml (original) +++ ofbiz/ofbiz-framework/trunk/applications/accounting/servicedef/services_invoice.xml Fri Aug 31 17:29:55 2018 @@ -25,23 +25,23 @@ under the License. <version>1.0</version> - <service name="getNextInvoiceId" engine="simple" - location="component://accounting/minilang/invoice/InvoiceServices.xml" invoke="getNextInvoiceId"> + <service name="getNextInvoiceId" engine="groovy" + location="component://accounting/groovyScripts/invoice/InvoiceServices.groovy" invoke="getNextInvoiceId"> <description>Get the Next Invoice ID According to Settings on the PartyAcctgPreference Entity for the given Party</description> <implements service="createInvoice"/> <attribute name="partyId" type="String" mode="IN" optional="false"/> <attribute name="invoiceId" type="String" mode="OUT" optional="false"/> </service> - <service name="invoiceSequenceEnforced" engine="simple" - location="component://accounting/minilang/invoice/InvoiceServices.xml" invoke="invoiceSequenceEnforced"> + <service name="invoiceSequenceEnforced" engine="groovy" + location="component://accounting/groovyScripts/invoice/InvoiceServices.groovy" invoke="invoiceSequenceEnforced"> <implements service="getNextInvoiceId"/> <attribute name="partyAcctgPreference" type="org.apache.ofbiz.entity.GenericValue" mode="IN"/> <override name="invoiceId" type="Long" mode="OUT"/> </service> - <service name="invoiceSequenceRestart" engine="simple" - location="component://accounting/minilang/invoice/InvoiceServices.xml" invoke="invoiceSequenceRestart"> + <service name="invoiceSequenceRestart" engine="groovy" + location="component://accounting/groovyScripts/invoice/InvoiceServices.groovy" invoke="invoiceSequenceRestart"> <implements service="getNextInvoiceId"/> <attribute name="partyAcctgPreference" type="org.apache.ofbiz.entity.GenericValue" mode="IN"/> </service> |
Free forum by Nabble | Edit this page |