Files
d.velop/Assmann/41_functions_dbs_invoiceworkflow.jpl
2024-06-17 16:49:41 +02:00

1153 lines
48 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
// Hook for dbs | invoice
// => General Functions for Hooks and Workflow
// File-Encoding: UTF-8 without BOM( Test: ü,ä,ö )
//------------------------------------------------------------------------------
// Created/Edited | Description
//------------------------------------------------------------------------------
// 08.2017 | dbs | invoice workflow 1.1.0
////////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------------------------------------------------------------------------------
// checkDuplicates
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc checkDuplicates( pVendorNo, pInvoiceNo, pInvoiceYear, pDocId )
{
call api_log( gLOGLEVEL, "Start of checkDuplicates( :pVendorNo, :pInvoiceNo, :pInvoiceYear )" )
vars lReturnValue
vars lRetval = 0
vars lCountResults = -1
vars lCounter = -1
if( pVendorNo != "" && pInvoiceNo != "" && pInvoiceYear != "" )
{
// clear api document context
call api_clear_document_context()
// set search criteria in context
api_doc_type_short = gDTS_INVOICE
api_doc_field[ gDDF_CONTACT_ID ] = pVendorNo
api_doc_field[ gDDF_INVOICE_ID ] = pInvoiceNo
lReturnValue = api_function ("document_find_ids", "Master")
if( lReturnValue == 0 && api_single_info > 0 )
{
lCountResults = api_single_info
vars lResultList[lCountResults]
for lCounter = 1 while ( lCounter <= lCountResults ) step 1
{
lResultList[lCounter] = api_doc_ids[lCounter]
}
for lCounter = 1 while ( lCounter <= lCountResults ) step 1
{
if ( pDocId != lResultList[lCounter] )
{
// get attributes
call api_clear_document_context()
lReturnValue = api_function ("attribute_get_all", lResultList[lCounter], "Master")
if ( lReturnValue == 0 )
{
// Check invoice year and wfl status
if ( api_doc_field[ gDDF_INVOICE_DATE ](7,4) == pInvoiceYear && \
api_doc_field[ gDDF_WFL_STATUS ] != gWFL_STATUS_REFUSED ) // remark: this is not value-key-comparison because api_doc_field is holding key and not translated value (has been tested on 2013-03-19)
{
call api_log_error( ":gERR_IMPORT_DUPLICATE_FOUND - Duplicate invoice found" )
lRetval = gERR_IMPORT_DUPLICATE_FOUND
}
}
else
{
call api_log_error("Error during Api-Function attribute_get_all / lReturnValue :lReturnValue")
lRetval = gERR_IMPORT_DUPLICATE_ERR
}
}
}
}
else
{
if( lReturnValue != 0 )
{
call api_log_error("Error during Api-Function document_find_ids / lReturnValue :lReturnValue")
lRetval = gERR_IMPORT_DUPLICATE_ERR
}
else
{
call api_log_info("No documents for VendorNo ':pVendorNo' and InvoiceNo ':pInvoiceNo' found")
}
}
}
else
{
call api_log_error("missing mandatory fields for validation.")
lRetval = gERR_IMPORT_DUPLICATE_ERR
}
call api_log( gLOGLEVEL, "End of checkDuplicates / return value: :lRetval" )
// clear api document context
call api_clear_document_context()
return lRetval
}//end of checkDuplicatesApi
//---------------------------------------------------------------------------------------------------------------------------------------------------
// inherit attributes from doc_type gDTS_CREDITOR_TRANS_FOLDER to children
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc inheritCrdTrsFldAttributes( pDocId, pDocTypeShort, pNewChild )
{
call api_log( gLOGLEVEL, "Start inheritCrdTrsFldAttributes :pDocId :pDocTypeShort" )
// inherit invoice attributes
vars lReturnValue = 0
vars lCounterRows = 0
vars lNumberOfRows = 0
vars lCounterParents = 0
vars lNumberOfParents = 0
vars lCounterChilds = 0
vars lNumberOfChilds = 0
vars lTransactionDokuID = ""
vars lDokuIdChilds[1000]
vars lCostCenter[1000], lGlAccount[1000], lOrder[1000], lWflMember[1000]
vars lCompanyCode, lClient, lCreditorNo, lCreditorName, lStreet, lZipCode, lCity, lCountry, lCurrency, lInvoiceId
// backup invoice attributes
// initialize header data : CompanyCode, Client, CreditorNo, CreditorName, Street, Zip Code, City, Country, Currency, Invoice ID
lCompanyCode = dok_dat_feld[ gDDF_COMPANY_CODE ]
lClient = dok_dat_feld[ gDDF_CLIENT ]
lCreditorNo = dok_dat_feld[ gDDF_CONTACT_ID ]
lCreditorName = dok_dat_feld[ gDDF_CONTACT_NAME ]
lStreet = dok_dat_feld[ gDDF_STREET ]
lZipCode = dok_dat_feld[ gDDF_ZIP ]
lCity = dok_dat_feld[ gDDF_CITY ]
lCountry = dok_dat_feld[ gDDF_COUNTRY ]
lCurrency = dok_dat_feld[ gDDF_CURRENCY ]
lInvoiceId = dok_dat_feld[ gDDF_INVOICE_ID ]
// initialize pos data: CostCenter, GlAccount, Order, WflMember
for lCounterRows = 1 while( lCounterRows <= 1000 ) step 1
{
lCostCenter[lCounterRows] = dok_dat_feld_:(gDDF_COST_CENTER)[ lCounterRows ]
lGlAccount[lCounterRows] = dok_dat_feld_:(gDDF_GL_ACCOUNT)[ lCounterRows ]
lOrder[lCounterRows] = dok_dat_feld_:(gDDF_INTERNAL_ORDER)[ lCounterRows ]
lWflMember[lCounterRows] = dok_dat_feld_:(gDDF_WFL_MEMBER)[ lCounterRows ]
if ( lCostCenter[lCounterRows] == "" && lGlAccount[lCounterRows] == "" && lOrder[lCounterRows] == "" && lWflMember[lCounterRows] == "" )
{
lNumberOfRows = lCounterRows - 1
break
}
}
// if function is called with vendor transaction folder no search required
if( pDocTypeShort == gDTS_CREDITOR_TRANS_FOLDER )
{
lTransactionDokuID = pDocId
}
else
{
// identify parent documents ( in ideal case it is just one )
lReturnValue = api_function( "link_get_parents", pDocId, "Master" )
if( lReturnValue == 0 )
{
lNumberOfParents = api_single_info // keep in mind how many parent documents exists
for lCounterParents = 1 while( lCounterParents <= lNumberOfParents ) step 1
{
lReturnValue = api_function( "attribute_get_single", "doc_type_short", "", api_links[:lCounterParents], "Master" )
if( lReturnValue == 0 )
{
if( api_single_info == gDTS_CREDITOR_TRANS_FOLDER )
{
// vendor transaction folder found
lTransactionDokuID = api_links[:lCounterParents]
}
// vendor transaction folder found, cancel loop
break
}
}
}
}
if( lTransactionDokuID != "" )
{
// clear context
call api_clear_document_context()
// change attributes of documents contained in the folder
lReturnValue = api_function( "link_get_children", lTransactionDokuID, "Master" )
if( lReturnValue == 0 )
{
lNumberOfChilds = api_single_info // keep in mind how many child documents exists
for lCounterChilds = 1 while ( lCounterChilds <= lNumberOfChilds ) step 1
{
// keep ids of child document in mind
lDokuIdChilds[:lCounterChilds] = api_links[:lCounterChilds]
}
// add new child of folder to doc_ids when child will be added to folder after this hook
if( pNewChild != "")
{
lNumberOfChilds = lNumberOfChilds + 1
lDokuIdChilds[:lNumberOfChilds] = pNewChild
}
for lCounterChilds = 1 while ( lCounterChilds <= lNumberOfChilds ) step 1
{
// skip current invoice
if( lDokuIdChilds[:lCounterChilds] != pDocId )
{
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", lDokuIdChilds[:lCounterChilds], "Master" )
if( lReturnValue == 0 )
{
// just update invoices and invoice attachments contained in the vendor transaction folder
if( api_doc_type_short == gDTS_INVOICE || api_doc_type_short == gDTS_INVOICE_ATTACHMENT )
{
call sm_n_clear_array( "api_doc_field_:(gDDF_COST_CENTER)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_GL_ACCOUNT)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_INTERNAL_ORDER)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_WFL_MEMBER)" )
// copy the invoice attributes to context
api_doc_field[ gDDF_COMPANY_CODE ] = lCompanyCode
api_doc_field[ gDDF_CLIENT ] = lClient
api_doc_field[ gDDF_CONTACT_ID ] = lCreditorNo
api_doc_field[ gDDF_CONTACT_NAME ] = lCreditorName
api_doc_field[ gDDF_INVOICE_ID ] = lInvoiceId
if( api_doc_type_short == gDTS_INVOICE )
{
api_doc_field[ gDDF_STREET ] = lStreet
api_doc_field[ gDDF_ZIP ] = lZipCode
api_doc_field[ gDDF_CITY ] = lCity
api_doc_field[ gDDF_COUNTRY ] = lCountry
api_doc_field[ gDDF_CURRENCY ] = lCurrency
}
for lCounterRows = 1 while ( lCounterRows <= lNumberOfRows ) step 1
{
api_doc_field_:(gDDF_COST_CENTER)[lCounterRows] = lCostCenter[lCounterRows]
api_doc_field_:(gDDF_GL_ACCOUNT)[lCounterRows] = lGlAccount[lCounterRows]
api_doc_field_:(gDDF_INTERNAL_ORDER)[lCounterRows] = lOrder[lCounterRows]
api_doc_field_:(gDDF_WFL_MEMBER)[lCounterRows] = lWflMember[lCounterRows]
}
// in case of updating refused invoices stop hook execution to avoid an infinit loop
SERVER_API_NO_HOOKS = 1
call api_function( "attribute_update_all", lDokuIdChilds[:lCounterChilds], "Master" )
SERVER_API_NO_HOOKS = 0
}
}
call api_clear_document_context()
}
}
}
// --- START UPDATE the transaction folder
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", lTransactionDokuID, "Master" )
if( lReturnValue == 0 )
{
// only update the transaction folder
if( api_doc_type_short == gDTS_CREDITOR_TRANS_FOLDER )
{
call sm_n_clear_array( "api_doc_field_:(gDDF_COST_CENTER)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_GL_ACCOUNT)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_INTERNAL_ORDER)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_WFL_MEMBER)" )
// copy the invoice attributes to context
api_doc_field[ gDDF_COMPANY_CODE ] = lCompanyCode
api_doc_field[ gDDF_CLIENT ] = lClient
api_doc_field[ gDDF_CONTACT_ID ] = lCreditorNo
api_doc_field[ gDDF_CONTACT_NAME ] = lCreditorName
api_doc_field[ gDDF_INVOICE_ID ] = lInvoiceId
api_doc_field[ gDDF_STREET ] = lStreet
api_doc_field[ gDDF_ZIP ] = lZipCode
api_doc_field[ gDDF_CITY ] = lCity
api_doc_field[ gDDF_COUNTRY ] = lCountry
for lCounterRows = 1 while ( lCounterRows <= lNumberOfRows ) step 1
{
api_doc_field_:(gDDF_COST_CENTER)[lCounterRows] = lCostCenter[lCounterRows]
api_doc_field_:(gDDF_GL_ACCOUNT)[lCounterRows] = lGlAccount[lCounterRows]
api_doc_field_:(gDDF_INTERNAL_ORDER)[lCounterRows] = lOrder[lCounterRows]
api_doc_field_:(gDDF_WFL_MEMBER)[lCounterRows] = lWflMember[lCounterRows]
}
// stop hook execution to avoid an infinit loop
SERVER_API_NO_HOOKS = 1
call api_function( "attribute_update_all", lTransactionDokuID, "Master" )
SERVER_API_NO_HOOKS = 0
}
}
call api_clear_document_context()
// --- ENDE UPDATE the transaction folder
}
// clear context
call api_clear_document_context()
call api_log( gLOGLEVEL, "End inheritCrdTrsFldAttributes" )
}//end of inheritCrdTrsFldAttributes
//---------------------------------------------------------------------------------------------------------------------------------------------------
// inherit attributes from doc_type gDTS_CREDITOR_TRANS_FOLDER to new linked children
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc inheritImpCrdTrsFldAttr( pDocIdFather, pDocIdChild )
{
call api_log_info( "Start inheritImpCrdTrsFldAttr Father: :pDocIdFather Child: :pDocIdChild" )
vars lReturnValue, lNumberOfRows, lCounterRows
vars lWflMember[1000]
vars lDocTypeShortFather, lDocTypeShortChild, lTransactionIdFather, lTransactionIdChild
vars lCostCenter[1000], lGlAccount[1000], lOrder[1000], lWflMember[1000]
vars lCompanyCode, lClient, lCreditorNo, lCreditorName, lStreet, lZipCode, lCity, lCountry, lCurrency, lInvoiceId
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", pDocIdFather, "Master" )
// backup invoice attributes
// initialize header data : CompanyCode, Client, CreditorNo, CreditorName, Street, Zip Code, City, Country, Currency, Invoice ID
lDocTypeShortFather = api_doc_type_short
lTransactionIdFather = api_doc_field[ gDDF_TRANSACTION_ID ]
lCompanyCode = api_doc_field[ gDDF_COMPANY_CODE ]
lClient = api_doc_field[ gDDF_CLIENT ]
lCreditorNo = api_doc_field[ gDDF_CONTACT_ID ]
lCreditorName = api_doc_field[ gDDF_CONTACT_NAME ]
lInvoiceId = api_doc_field[ gDDF_INVOICE_ID ]
if( lDocTypeShortFather == gDTS_CREDITOR_TRANS_FOLDER && lTransactionIdFather != "" )
{
// initialize pos data: CostCenter, GlAccount, Order, WflMember
for lCounterRows = 1 while( lCounterRows <= 1000 ) step 1
{
lCostCenter[lCounterRows] = api_doc_field_:(gDDF_COST_CENTER)[ lCounterRows ]
lGlAccount[lCounterRows] = api_doc_field_:(gDDF_GL_ACCOUNT)[ lCounterRows ]
lOrder[lCounterRows] = api_doc_field_:(gDDF_INTERNAL_ORDER)[ lCounterRows ]
lWflMember[lCounterRows] = api_doc_field_:(gDDF_WFL_MEMBER)[ lCounterRows ]
if ( lCostCenter[lCounterRows] == "" && lGlAccount[lCounterRows] == "" && lOrder[lCounterRows] == "" && lWflMember[lCounterRows] == "" )
{
lNumberOfRows = lCounterRows - 1
break
}
}
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", pDocIdChild, "Master" )
lDocTypeShortChild = api_doc_type_short
lTransactionIdChild = api_doc_field[ gDDF_TRANSACTION_ID ]
if( lDocTypeShortChild == gDTS_INVOICE_ATTACHMENT && lTransactionIdFather == lTransactionIdChild )
{
call sm_n_clear_array( "api_doc_field_:(gDDF_COST_CENTER)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_GL_ACCOUNT)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_INTERNAL_ORDER)" )
call sm_n_clear_array( "api_doc_field_:(gDDF_WFL_MEMBER)" )
// copy the invoice attributes to context
api_doc_field[ gDDF_COMPANY_CODE ] = lCompanyCode
api_doc_field[ gDDF_CLIENT ] = lClient
api_doc_field[ gDDF_CONTACT_ID ] = lCreditorNo
api_doc_field[ gDDF_CONTACT_NAME ] = lCreditorName
api_doc_field[ gDDF_INVOICE_ID ] = lInvoiceId
for lCounterRows = 1 while ( lCounterRows <= lNumberOfRows ) step 1
{
api_doc_field_:(gDDF_COST_CENTER)[lCounterRows] = lCostCenter[lCounterRows]
api_doc_field_:(gDDF_GL_ACCOUNT)[lCounterRows] = lGlAccount[lCounterRows]
api_doc_field_:(gDDF_INTERNAL_ORDER)[lCounterRows] = lOrder[lCounterRows]
api_doc_field_:(gDDF_WFL_MEMBER)[lCounterRows] = lWflMember[lCounterRows]
}
// in case of updating refused invoices stop hook execution to avoid an infinit loop
SERVER_API_NO_HOOKS = 1
call api_function( "attribute_update_all", pDocIdChild, "Master" )
SERVER_API_NO_HOOKS = 0
}
}
call api_clear_document_context()
call api_log_info( "End inheritImpCrdTrsFldAttr Father: :pDocIdFather Child: :pDocIdChild" )
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
// set new transaction id to current document if generation of transaction id is configured
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc updateTransactionID( pDocId, pDocTypeShort )
{
call api_log( gLOGLEVEL, "Start updateTransactionID :pDocId :pDocTypeShort" )
if( dok_dat_feld[ gDDF_TRANSACTION_ID ] == "" )
{
// generate new transaction number ( transaction safe )
vars lMaxInt, lMaxCount, lSchemeClause, lReturnValue, lNewTransactionId
vars lCurrentYear = sm_sdtime("n%4y")
lNewTransactionId = "NoValueDefined"
//add scheme to from clause if set
if(gGMF_SCHEME_NAME_RUN_TIME != "")
{
lSchemeClause = ":(gGMF_SCHEME_NAME_RUN_TIME)."
}
else
{
lSchemeClause = ""
}
// ATTENTION: DB-TRANSACTIONS ARE ONLY ALLOWED TO BE USED IN THOSE HOOKS
// THAT ARE SERVER-INTERNALLY NOT USING TRANSACTIONS THEMSELVES
DBMS BEGIN
DBMS ALIAS lMaxInt
DBMS SQL SELECT maxint \
FROM :(lSchemeClause):(gGMF_TABLE_CUSTOM_COUNTER) \
WHERE cond1 = :+pDocTypeShort \
AND cond2 = :+lCurrentYear
lMaxCount = @dmrowcount
DBMS ALIAS
if( lMaxCount == 0 ) // no data setDatensatz -> new year
{
DBMS SQL INSERT INTO :(lSchemeClause):(gGMF_TABLE_CUSTOM_COUNTER) ( cond1, cond2, maxint ) \
VALUES ( :+pDocTypeShort, :+lCurrentYear, 1 )
}
else
{
DBMS SQL UPDATE :(lSchemeClause):(gGMF_TABLE_CUSTOM_COUNTER) \
SET maxint = maxint + 1 \
WHERE cond1 = :+pDocTypeShort \
AND cond2 = :+lCurrentYear
}
DBMS ALIAS lMaxInt
DBMS SQL SELECT maxint \
FROM :(lSchemeClause):(gGMF_TABLE_CUSTOM_COUNTER) \
WHERE cond1 = :+pDocTypeShort \
AND cond2 = :+lCurrentYear
lMaxCount = @dmrowcount
DBMS ALIAS
DBMS COMMIT
// ATTENTION: DB-TRANSACTIONS ARE ONLY ALLOWED TO BE USED IN THOSE HOOKS
// THAT ARE SERVER-INTERNALLY NOT USING TRANSACTIONS THEMSELVES
lReturnValue = api_function( "string_fill_leading_char", lMaxInt, "0", gGMF_TRANSACTION_ID_SIZE )
if( lReturnValue >= 0 )
{
lNewTransactionId = gGMF_TRANSACTION_ID_PRAEFIX ## lCurrentYear ## "-" ## api_converted_string
}
// in case of updating transaction is stop hook execution
SERVER_API_NO_HOOKS = 1
call api_function( "attribute_update_single", gDDF_TRANSACTION_ID, lNewTransactionId, 0, pDocId, "Master" )
SERVER_API_NO_HOOKS = 0
return lNewTransactionId
}
return -1
}//end of updateTransactionID
//---------------------------------------------------------------------------------------------------------------------------------------------------
// updates creditor data from database
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc updateCreditorData( pDocId )
{
call api_log( gLOGLEVEL, "Start of updateCreditorData( pDocId = :pDocId )" )
vars lReturnValue, lNumberOfResults = 0
vars lCompanyCode, lClient, lCreditorNo, lCreditorName, lStreet, lZipCode, lCity, lCountry, lCurrency, lWhere, lFromClause
vars lCurrCreditorId = dok_dat_feld[ gDDF_CONTACT_ID ]
vars lCurrCreditorName = dok_dat_feld[ gDDF_CONTACT_NAME ]
vars lCurrClient = dok_dat_feld[ gDDF_CLIENT ]
vars lCurrCompanyCode = dok_dat_feld[ gDDF_COMPANY_CODE ]
vars lCurrCurrency = dok_dat_feld[ gDDF_CURRENCY ]
if( lCurrCreditorId == "89999" )
{
return 0
}
// get creditor master data
if( lCurrCreditorId != "" || lCurrCreditorName != "" )
{
if( lCurrCreditorId != "" )
{
lWhere = "creditor_no = :+lCurrCreditorId"
}
else
{
lWhere = "name = :+lCurrCreditorName"
}
if( lCurrCompanyCode != "" )
{
lWhere = lWhere ## " AND company_code = :+lCurrCompanyCode"
}
if( lCurrClient != "" )
{
lWhere = lWhere ## " AND client = :+lCurrClient"
}
//add scheme to from clause if set
if(gGMF_SCHEME_NAME != "")
{
lFromClause = ":(gGMF_SCHEME_NAME).:(gGMF_TABLE_CREDITORS)"
}
else
{
lFromClause = ":gGMF_TABLE_CREDITORS"
}
DBMS ALIAS lCompanyCode, lClient, lCreditorNo, lCreditorName, lStreet, lZipCode, lCity, lCountry, lCurrency
DBMS SQL SELECT company_code, \
client, \
creditor_no, \
name, \
street, \
zip, \
city, \
country, \
currency \
FROM :lFromClause \
WHERE :lWhere
lNumberOfResults = @dmrowcount
DBMS ALIAS
if( lNumberOfResults != 0 && pDocId == "" )
{
dok_dat_feld[ gDDF_COMPANY_CODE ] = lCompanyCode
dok_dat_feld[ gDDF_CLIENT ] = lClient
dok_dat_feld[ gDDF_CONTACT_ID ] = lCreditorNo
dok_dat_feld[ gDDF_CONTACT_NAME ] = lCreditorName
dok_dat_feld[ gDDF_STREET ] = lStreet
dok_dat_feld[ gDDF_ZIP ] = lZipCode
dok_dat_feld[ gDDF_CITY ] = lCity
dok_dat_feld[ gDDF_COUNTRY ] = lCountry
if( lCurrCurrency == "" )
{
dok_dat_feld[ gDDF_CURRENCY ] = lCurrency
}
}
else if( lNumberOfResults != 0 && pDocId != "" )
{
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", pDocId, "Master" )
if( lReturnValue == 0 )
{
api_doc_field[ gDDF_COMPANY_CODE ] = lCompanyCode
api_doc_field[ gDDF_CLIENT ] = lClient
api_doc_field[ gDDF_CONTACT_ID ] = lCreditorNo
api_doc_field[ gDDF_CONTACT_NAME ] = lCreditorName
api_doc_field[ gDDF_STREET ] = lStreet
api_doc_field[ gDDF_ZIP ] = lZipCode
api_doc_field[ gDDF_CITY ] = lCity
api_doc_field[ gDDF_COUNTRY ] = lCountry
if( lCurrCurrency == "" )
{
api_doc_field[ gDDF_CURRENCY ] = lCurrency
}
// in case of updating refused invoices stop hook execution to avoid an infinit loop
SERVER_API_NO_HOOKS = 1
call api_function( "attribute_update_all", pDocId, "Master" )
SERVER_API_NO_HOOKS = 0
}
call api_clear_document_context()
}
}
call api_log( gLOGLEVEL, "End updateCreditorData" )
} //end of updateCreditorData
//===================================================================================================================================================
//========== FUNCTIONS WORKFLOW =====================================================================================================================
//===================================================================================================================================================
//---------------------------------------------------------------------------------------------------------------------------------------------------
// write state of workflow to erp interface
// pDocId, 'dbut', gWFL_STATUS_FINISHED, wfStep, wfWebServiceURL
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc write_state_webservicedll( pDocId, wfUser, wfState, wfStep, wfStepLvl, wfWebServiceURL )
{
vars lReturnCode, lReturnValue, lReturnCodeXML, lReturnMessageXML
vars lCurrentTimestamp = getCurrentTimestamp()
call api_clear_document_context()
lReturnValue = api_function ("attribute_get_all", pDocId, "")
if( lReturnValue == 0 )
{
// -----------------------------------------------------------
// create request
call d3ws_startSession()
call d3ws_xml_start()
call d3ws_xml_openNode( 'decsERPRequest' )
call d3ws_xml_addNode( 'context', gGMF_CONFIG_INTERFACE )
call d3ws_xml_addNode( 'function', 'writeState' )
call d3ws_xml_openNode( 'parameter' )
call d3ws_xml_addNode( 'ERPID', api_doc_field[gDDF_ERP_ID] )
call d3ws_xml_addNode( 'SYSID', api_doc_field[gDDF_SYSTEM_ID] )
call d3ws_xml_addNode( 'CLIENT', api_doc_field[gDDF_CLIENT] )
call d3ws_xml_addNode( 'COMPANY_CODE', api_doc_field[gDDF_COMPANY_CODE] )
call d3ws_xml_addNode( 'TIME_STAMP', lCurrentTimestamp )
call d3ws_xml_addNode( 'USER', wfUser )
call d3ws_xml_addNode( 'STATE', wfState )
call d3ws_xml_addNode( 'STEP', wfStep )
call d3ws_xml_addNode( 'STEPLVL', wfStepLvl )
call d3ws_xml_closeNode( 'parameter' )
call d3ws_xml_closeNode( 'decsERPRequest' )
call d3ws_xml_stop()
lReturnCode = d3ws_http_sendRequest( wfWebServiceURL )
lReturnCodeXML = d3ws_xml_getNodeValue( 'returnCode' )
lReturnMessageXML = d3ws_xml_getNodeValue( 'returnMessage' )
call d3ws_stopSession()
if( lReturnCode != "OK" || lReturnCodeXML != 0 )
{
call api_log_error( "Error while creating xml request: " ## lReturnCode )
call api_log_error( "Servlet returned error code: " ## lReturnCodeXML )
call api_log_error( "Servlet returned error message: " ## lReturnMessageXML )
return gERR_ERP_SVLT_WRITE_STATE
}
else
{
call api_log_info( "Created xml request for write_state(): " ## lReturnCode )
return 0
}
}
else
{
call api_log_error ("Errorcode :lReturnValue was returned!")
}
}//end of write_state
//---------------------------------------------------------------------------------------------------------------------------------------------------
// write current users of workflow to erp interface
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc write_user_webservicedll( pDocId, wfUsers, wfState, wfStep, wfStepLvl, wfWebServiceURL )
{
vars lReturnCode, lReturnValue,
global lReturnCodeDBSXML, lReturnMessageDBSXML
call api_clear_document_context()
lReturnValue = api_function ("attribute_get_all", pDocId, "")
if( lReturnValue == 0 )
{
// Variablendeklaration
vars lSplittedUsers // Number of returned values of function string_split
vars lUsersString = wfUsers // string to be splitted
vars lCharSplitter = ";" // split character
// call string_split
lSplittedUsers = api_function ("string_split", lUsersString, lCharSplitter)
// Ergebnisausgabe
if( lSplittedUsers > 0 )
{
call api_log_info ("String wfUsers was splitted in :lSplittedUsers Strings.")
// -----------------------------------------------------------
// create request
call d3ws_startSession()
call d3ws_xml_start()
call d3ws_xml_openNode( 'decsERPRequest' )
call d3ws_xml_addNode( 'context', gGMF_CONFIG_INTERFACE )
call d3ws_xml_addNode( 'function', 'writeUser' )
call d3ws_xml_openNode( 'parameter' )
call d3ws_xml_addNode( 'ERPID', api_doc_field[gDDF_ERP_ID] )
call d3ws_xml_addNode( 'SYSID', api_doc_field[gDDF_SYSTEM_ID] )
call d3ws_xml_addNode( 'CLIENT', api_doc_field[gDDF_CLIENT] )
call d3ws_xml_addNode( 'COMPANY_CODE', api_doc_field[gDDF_COMPANY_CODE] )
call d3ws_xml_addNode( 'STEP', wfStep )
call d3ws_xml_addNode( 'STEPLVL', wfStepLvl )
// start of for-loop --------------------------------------------------------------
vars lCount // counter for loop
vars lCurrentTimestamp = getCurrentTimestamp()
for lCount = 1 while( lCount <= lSplittedUsers ) step 1
{
call d3ws_xml_openNode( 'USERS' )
call d3ws_xml_addNode( 'TIME_STAMP', lCurrentTimestamp )
call d3ws_xml_addNode( 'USER', api_splitted_string[ lCount ] )
call d3ws_xml_addNode( 'STATE', wfState )
call d3ws_xml_closeNode( 'USERS' )
}
// end of for-loop ---------------------------------------------------------------
call d3ws_xml_closeNode( 'parameter' )
call d3ws_xml_closeNode( 'decsERPRequest' )
call d3ws_xml_stop()
lReturnCode = d3ws_http_sendRequest( wfWebServiceURL )
lReturnCodeXML = d3ws_xml_getNodeValue( 'returnCode' )
lReturnMessageXML = d3ws_xml_getNodeValue( 'returnMessage' )
call d3ws_stopSession()
if( lReturnCode != "OK" || lReturnCodeXML != 0 )
{
call api_log_error( "Error while creating xml request: " ## lReturnCode )
call api_log_error( "Servlet returned error code: " ## lReturnCodeXML )
call api_log_error( "Servlet returned error message: " ## lReturnMessageXML )
return gERR_ERP_SVLT_WRITE_USER
}
else
{
call api_log_info ( "Created xml request for write_user(): " ## lReturnCode )
}
}
else
{
if( lSplittedUsers < 0 )
{
call api_log_error ("No users could be determined with string_split in write_user()! Errorcode was :lSplittedUsers.")
}
}
return 0
}
else
{
call api_log_error ("Errorcode :lReturnValue was returned!")
}
}//end of write_user
//---------------------------------------------------------------------------------------------------------------------------------------------------
// write current state of workflow to erp interface via java class
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc write_state( pDocId, wfUser, wfState, wfStep, wfStepLvl, wfWebServiceURL )
{
vars lReturnCode, lReturnValue
vars lCurrentTimestamp = getCurrentTimestamp()
gDBS_RET_CODE_SERVLET_JAVA = ""
gDBS_RET_MSG_SERVLET_JAVA = ""
call api_clear_document_context()
lReturnValue = api_function ("attribute_get_all", pDocId, "")
if( lReturnValue == 0 )
{
// -----------------------------------------------------------
// add request params
lReturnValue = api_function ("java_add_param", wfWebServiceURL) // wfWebServiceURL
lReturnValue = api_function ("java_add_param", gGMF_CONFIG_INTERFACE)
lReturnValue = api_function ("java_add_param", "writeState")
lReturnValue = api_function ("java_add_param", "ERPID" ## "|" ## api_doc_field[gDDF_ERP_ID])
lReturnValue = api_function ("java_add_param", "SYSID" ## "|" ## api_doc_field[gDDF_SYSTEM_ID])
lReturnValue = api_function ("java_add_param", "CLIENT" ## "|" ## api_doc_field[gDDF_CLIENT])
lReturnValue = api_function ("java_add_param", "COMPANY_CODE" ## "|" ## api_doc_field[gDDF_COMPANY_CODE])
lReturnValue = api_function ("java_add_param", "TIME_STAMP" ## "|" ## lCurrentTimestamp)
lReturnValue = api_function ("java_add_param", "USER" ## "|" ## wfUser)
lReturnValue = api_function ("java_add_param", "STATE" ## "|" ## wfState)
lReturnValue = api_function ("java_add_param", "STEP" ## "|" ## wfStep)
lReturnValue = api_function ("java_add_param", "STEPLVL" ## "|" ## wfStepLvl)
lReturnCode = api_function ("java_call_static", "com/dvelop/decs/erp/servlet/javacall/DecsERPServletConnector", "executePost")
if( lReturnCode != 0 || gDBS_RET_CODE_SERVLET_JAVA != 0 )
{
call api_log_error( "Error while creating xml request: " ## lReturnCode )
call api_log_error( "Servlet returned error code: " ## gDBS_RET_CODE_SERVLET_JAVA )
call api_log_error( "Servlet returned error message: " ## gDBS_RET_MSG_SERVLET_JAVA )
return gERR_ERP_SVLT_WRITE_STATE
}
else
{
call api_log_info( "Created xml request for write_state(): " ## lReturnCode )
return 0
}
}
return 0
} // end of write_state
//---------------------------------------------------------------------------------------------------------------------------------------------------
// write current users of workflow to erp interface via java class
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc write_user( pDocId, wfUsers, wfState, wfStep, wfStepLvl, wfWebServiceURL )
{
vars lReturnCode, lReturnValue
gDBS_RET_CODE_SERVLET_JAVA = ""
gDBS_RET_MSG_SERVLET_JAVA = ""
call api_clear_document_context()
lReturnValue = api_function ("attribute_get_all", pDocId, "")
if( lReturnValue == 0 )
{
// Variablendeklaration
vars lSplittedUsers // Number of returned values of function string_split
vars lUsersString = wfUsers // string to be splitted
vars lCharSplitter = ";" // split character
// call string_split
lSplittedUsers = api_function ("string_split", lUsersString, lCharSplitter)
// Ergebnisausgabe
if( lSplittedUsers > 0 )
{
call api_log_info ("String wfUsers was splitted in :lSplittedUsers Strings.")
// -----------------------------------------------------------
// add request params
lReturnValue = api_function ("java_add_param", wfWebServiceURL) // wfWebServiceURL
lReturnValue = api_function ("java_add_param", gGMF_CONFIG_INTERFACE)
lReturnValue = api_function ("java_add_param", "writeUser")
lReturnValue = api_function ("java_add_param", "ERPID" ## "|" ## api_doc_field[gDDF_ERP_ID])
lReturnValue = api_function ("java_add_param", "SYSID" ## "|" ## api_doc_field[gDDF_SYSTEM_ID])
lReturnValue = api_function ("java_add_param", "CLIENT" ## "|" ## api_doc_field[gDDF_CLIENT])
lReturnValue = api_function ("java_add_param", "COMPANY_CODE" ## "|" ## api_doc_field[gDDF_COMPANY_CODE])
lReturnValue = api_function ("java_add_param", "STEP" ## "|" ## wfStep)
lReturnValue = api_function ("java_add_param", "STEPLVL" ## "|" ## wfStepLvl)
// start of for-loop --------------------------------------------------------------
vars lCount // counter for loop
vars lCurrentTimestamp = getCurrentTimestamp()
lReturnValue = api_function ("java_add_param", "USERS_TIME_STAMP" ## "|" ## lCurrentTimestamp)
lReturnValue = api_function ("java_add_param", "USERS_STATE" ## "|" ## wfState)
for lCount = 1 while( lCount <= lSplittedUsers ) step 1
{
lReturnValue = api_function ("java_add_param", "USERS_USER" ## "|" ## api_splitted_string[ lCount ])
}
// end of for-loop ---------------------------------------------------------------
lReturnCode = api_function ("java_call_static", "com/dvelop/decs/erp/servlet/javacall/DecsERPServletConnector", "executePost")
if( lReturnCode != 0 || gDBS_RET_CODE_SERVLET_JAVA != 0 )
{
call api_log_error( "Error while creating xml request: " ## lReturnCode )
call api_log_error( "Servlet returned error code: " ## gDBS_RET_CODE_SERVLET_JAVA )
call api_log_error( "Servlet returned error message: " ## gDBS_RET_MSG_SERVLET_JAVA )
return gERR_ERP_SVLT_WRITE_USER
}
else
{
call api_log_info ( "Created xml request for write_user(): " ## lReturnCode )
}
}
else
{
if( lSplittedUsers < 0 )
{
call api_log_error ("No users could be determined with string_split in write_user()! Errorcode was :lSplittedUsers.")
}
}
return 0
}
else
{
call api_log_error ("Errorcode :lReturnValue was returned!")
}
}//end of write_user
//---------------------------------------------------------------------------------------------------------------------------------------------------
// return current formatted timestamp, is especially formatted for erp interface -> yyyyMMddHHmmss (defined by erp-interface)
//---------------------------------------------------------------------------------------------------------------------------------------------------
string proc getCurrentTimestamp()
{
vars lReturnValue
// format of datetimestamp: yyyyMMddHHmmss (is defined by erp-interface)
vars lFormat = "%4y%0m%0d%0h%0M%0s"
lReturnValue = api_function ("get_current_datetime", lFormat)
call api_log_info ( "getCurrentTimestamp is formatted as :api_single_info" )
if( lReturnValue == 0 )
{
return api_single_info
}
else
{
call api_log_error ("Error no :lReturnValue was returned!")
return -1
}
}//end of getCurrentTimestamp
proc updateWFLMembers( pDocId, pRecipients )
{
vars lSplitReturn, lReturnValue, lCount, lCounterRows, lCurrentUser, lCurrentSubstitute, lCurrentWflMember, lArrayLength, lFound
// split string
lSplitReturn = api_function ("string_split", pRecipients, ";")
// return value
if ( lSplitReturn >= 0 )
{
call api_log_info("User list was splitted into :lSplitReturn users.")
for lCount = 1 while( lCount <= lSplitReturn ) step 1
{
lCurrentUser = api_splitted_string[lCount]
//CHECK USER
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", pDocId, "Master" )
lArrayLength = sm_n_num_occurs("api_doc_field_:gDDF_WFL_MEMBER")
lFound = 0
for lCounterRows = 1 while( lCounterRows <= lArrayLength ) step 1
{
lCurrentWflMember = api_doc_field_:(gDDF_WFL_MEMBER)[ lCounterRows ]
if ( lCurrentWflMember == lCurrentUser )
{
lFound=1
break
}
}
if(lFound == 0)
{
SERVER_API_NO_HOOKS = 1
lReturnValue = api_function ("attribute_update_single", gDDF_WFL_MEMBER, lCurrentUser, lArrayLength+1, pDocId, "")
SERVER_API_NO_HOOKS = 0
}
//CHECK SUBSTITUE
lCurrentSubstitute = getSubstitute( lCurrentUser )
if( lCurrentSubstitute != "" )
{
call api_clear_document_context()
lReturnValue = api_function( "attribute_get_all", pDocId, "Master" )
lArrayLength = sm_n_num_occurs("api_doc_field_:gDDF_WFL_MEMBER")
lFound = 0
for lCounterRows = 1 while( lCounterRows <= lArrayLength ) step 1
{
lCurrentWflMember = api_doc_field_:(gDDF_WFL_MEMBER)[ lCounterRows ]
if ( lCurrentWflMember == lCurrentSubstitute )
{
lFound=1
break
}
}
if(lFound == 0)
{
SERVER_API_NO_HOOKS = 1
lReturnValue = api_function ("attribute_update_single", gDDF_WFL_MEMBER, lCurrentSubstitute, lArrayLength+1, pDocId, "")
SERVER_API_NO_HOOKS = 0
}
}
}
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------
// return substitute of given user, returns "" when no substitute is given
//---------------------------------------------------------------------------------------------------------------------------------------------------
string proc getSubstitute( pUser )
{
vars lCheckoutText
vars lReturnValue
// call api
HIDE_API_ERROR_ONCE = "1"
lReturnValue = api_function ("user_get_data", pUser)
// TODO check this funtion
if ( lReturnValue == 0 )
{
// is user absent
if ( api_user_checkout_flag != 0)
{
lCheckoutText = api_user_checkout_text
if( lCheckoutText != "" )
{
lReturnValue = api_function ("string_split", lCheckoutText, "@@")
if(lReturnValue == 2)
{
vars lSubstitute
lSubstitute = api_splitted_string[2]
call api_log_info( "Found :+lSubstitute as substitute for user :+pUser" )
return lSubstitute
}
return ""
}
}
}
return ""
}
/*
//---------------------------------------------------------------------------------------------------------------------------------------------------
// return ERP id of given document id
//---------------------------------------------------------------------------------------------------------------------------------------------------
string proc getErpId( pDocId )
{
return getSingleAttributeByDocId( pDocId, gDDF_ERP_ID )
}//end of getErpId
//---------------------------------------------------------------------------------------------------------------------------------------------------
// return System id of given document id
//---------------------------------------------------------------------------------------------------------------------------------------------------
string proc getSystemId( pDocId )
{
return getSingleAttributeByDocId( pDocId, gDDF_SYSTEM_ID )
}//end of getSystemId
//---------------------------------------------------------------------------------------------------------------------------------------------------
// return client of given document id
//---------------------------------------------------------------------------------------------------------------------------------------------------
string proc getClient( pDocId )
{
return getSingleAttributeByDocId( pDocId, gDDF_CLIENT )
}//end of getClient
//---------------------------------------------------------------------------------------------------------------------------------------------------
// return value of given document id and attribute database position
//---------------------------------------------------------------------------------------------------------------------------------------------------
string proc getSingleAttributeByDocId( pDocId, pDDF )
{
vars lReturnValue
lReturnValue = api_function ("attribute_get_single", pDDF, 0, pDocId, "")
if( lReturnValue == 0 )
{
return api_single_info
}
else
{
call api_log_error ("Errorno :lReturnValue was returned!")
return -1
}
}//end of getSingleAttributeByDocId
*/
//---------------------------------------------------------------------------------------------------------------------------------------------------
// load webservice dll for connection with erp-interface
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc load_webservice_dll()
{
vars i, t, fct_name, fct_type
vars dll_name = "d3_webservice.dll"
call api_log_info ("Loading DLL :dll_name ...")
vars dll_step = ""
vars dll_error = 0
vars dll_functions[100]
dll_functions[1] = "s d3ws_startSession()"
dll_functions[2] = "s d3ws_xml_start()"
dll_functions[3] = "s d3ws_xml_openNode(s)"
dll_functions[4] = "s d3ws_xml_addNode(s,s)"
dll_functions[5] = "s d3ws_xml_closeNode(s)"
dll_functions[6] = "s d3ws_xml_stop()"
dll_functions[7] = "s d3ws_xml_saveToFile(s)"
dll_functions[8] = "s d3ws_xml_loadFromFile(s)"
dll_functions[9] = "s d3ws_http_addParameter(s,s)"
dll_functions[10] = "s d3ws_http_setTraceFile(s)"
dll_functions[11] = "s d3ws_http_sendRequest(s)"
dll_functions[12] = "s d3ws_http_getTraceData()"
dll_functions[13] = "s d3ws_xml_setRootNode()"
dll_functions[14] = "s d3ws_xml_setParentNode()"
dll_functions[15] = "s d3ws_xml_setNode(s)"
dll_functions[16] = "i d3ws_xml_countNodes()"
dll_functions[17] = "s d3ws_xml_getNodeName(i)"
dll_functions[18] = "s d3ws_xml_getNodeValue(s)"
dll_functions[19] = "s d3ws_stopSession()"
dll_functions[20] = ""
dll_step = "Loading of DLL :dll_name"
dll_error = sm_slib_load(dll_name)
for i=1 while i<100 step 1
{
if ( dll_functions[i] == "" )
break
if ( dll_error == 0 )
{
t = dll_functions[i]
fct_type = t(1,1)
fct_name = t(3,100)
dll_step = "Registration of function :fct_name (type=:fct_type)"
if ( fct_type == "i" )
dll_error = sm_slib_install(fct_name, SLIB_C, SLIB_INTFNC)
else
dll_error = sm_slib_install(fct_name, SLIB_C, SLIB_STRFNC)
}
}
if ( dll_error != 0 )
{
call api_log_error ("ERROR while loading of DLL :dll_name")
call api_log_error ("dll_step = :dll_step")
call api_log_error ("dll_error = :dll_error")
call api_log_error ("sm_slib_error = "##sm_slib_error())
return -1
}
call api_log_info ("DLL :dll_name has been loaded and registrated sucessfully")
return 0
}//end of load_webservice_dll
//---------------------------------------------------------------------------------------------------------------------------------------------------
// calculates days till escalation plus weekends
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc calculateWorkDaysInAbsoluteDays( pCountDays )
{
vars lReturnValue, lInitialEscalationDays, lRemainingEscalationDays, lDaysTillWeekend, lCountFullWeeks, lWeekdays, lCurrentDay
lInitialEscalationDays = pCountDays
lWeekdays = 5
lCurrentDay = sm_sdtime("n%.d")
lDaysTillWeekend = 7 - lCurrentDay
if( lDaysTillWeekend > lInitialEscalationDays )
{
return lInitialEscalationDays
}
else
{
lRemainingEscalationDays = lInitialEscalationDays - lDaysTillWeekend // Escalation days after first weekend
lCountFullWeeks = lRemainingEscalationDays / lWeekdays
lReturnValue = api_function( "string_split", lCountFullWeeks, "." )
if( lReturnValue > 0 )
{
lCountFullWeeks = api_splitted_string[1]
}
lRemainingEscalationDays = calcModulo( lRemainingEscalationDays, lWeekdays )
lReturnValue = lDaysTillWeekend + 2 + ( lCountFullWeeks * 7 ) + lRemainingEscalationDays
return lReturnValue
}
}// end of calculateWorkDaysInAbsoluteDays
//---------------------------------------------------------------------------------------------------------------------------------------------------
// calcModulo-Function (Rest of division)
//---------------------------------------------------------------------------------------------------------------------------------------------------
proc calcModulo( pDivident, pDivisor )
{
vars lReturnValue, lCount
lCount = pDivident/pDivisor
lReturnValue = api_function( "string_split", lCount, "." )
if( lReturnValue > 0 )
{
lCount = api_splitted_string[1]
}
lReturnValue = pDivident - (pDivisor * lCount)
return lReturnValue
}// end of calcModulo