Include (KZLibrary, KZISSetup)
///
Projekt: KZIS
///
Author : M. Brousek
///
Created: 10.9.2010
///
Description: Služba pro přenos dat ze SAPu předaných prostřednictvím CSV souboru.
///
Viz též výkonná metoda OnProcessInput
///
Třída zachycuje a zpracovává události typu KZIS.Data.TS.Events.ekCSVFile
Class KZIS.BS.SAP.SHandleCSVFile Extends Ens.BusinessService [ ProcedureBlock ]
{
Parameter ADAPTER = "EnsLib.File.InboundAdapter";
/// Přesune soubor ze sdílené složky do interní složky systému k následnému zpracování.
Method MoveFile(pIncomingFile As %String, pFileName As %String)
{
set tDataFileName = $$$KZISDataFullPath_$$$SAPIncomingDir_pFileName
if ##class(%File).Exists(tDataFileName) do ##class(%File).Delete(tDataFileName)
set tSC = ##class(%File).Rename(pIncomingFile, tDataFileName)
if 'tSC $$$LOGERROR("Could not move '"_pIncomingFile_"' to KZIS internal directory: "_tDataFileName)
}
/// Spustí proces, který importuje data do interní DB systému následně je v rámci téže transakce přenese do systému Apothéké.
/// Přenášená datová entita (a tedy i daný soubor) je dána kódem typu příslušné transakce,
/// zdanému v parametru pTansKindCode
Method ProcessSAPCodebooksToApo(pTansKindCode As %String)
{
set tRequest = ##class(KZIS.Msg.MW.BPDataRequest).%New()
set tRequest.TransactionKindCode = pTansKindCode
set tRequest.Event = ##class(KZIS.Data.TS.Events.ekCSVFile).MarkEvent()
// Call operation async
set tSC = ..SendRequestSync("PSAPCodebooksToApo", tRequest)
// Quit on error
if $$$ISERR(tSC) {
do %System.Status.Decompose(tSC, .tErrList)
$$$LOGERROR(.tErrList)
quit tSC
}
quit tSC
}
/// Spustí proces, který importuje data do interní DB systému.
/// Přenášená datová entita (a tedy i daný soubor) je dána kódem typu příslušné transakce,
/// zdanému v parametru pTansKindCode
Method ProcessSAPImportCSVFile(pTansKindCode As %String)
{
set tRequest = ##class(KZIS.Msg.MW.BPDataRequest).%New()
set tRequest.TransactionKindCode = pTansKindCode
set tRequest.Event = ##class(KZIS.Data.TS.Events.ekCSVFile).MarkEvent()
// Call operation async
set tSC = ..SendRequestSync("PSAPImportCodebookFiles", tRequest)
// Quit on error
if $$$ISERR(tSC) {
do %System.Status.Decompose(tSC, .tErrList)
$$$LOGERROR(.tErrList)
quit tSC
}
quit tSC
}
/// Zkontroluje délku souboru, jehož jméno je zadáno v parametru pFileName
/// V případě, že je daný soubor prázdný nebo neexistuje vrátí hodnotu True a zapíše
/// informaci do logu jako WARNING. V případě existující neprázdného souboru vraci False.
Method CheckEmptyFile(pFileName As %String) As %Boolean
{
q:(##class(%File).GetFileSize(pFileName)>0) 0
$$$LOGWARNING("SAP incoming file error: File is empty '"_pFileName_"'")
q 1
}
/// Zpracovává soubory, nacházející se ve sdílené složce vyhrazené systému SAP.
/// Názvy složek, kde se soubory očekávají, a maska názvů souborů jsou uloženy v definici
/// KZISSetup.inc a v setupu projektu KZIS.MW.Setup.
/// Defaultní název cesty je "shared_files/kzis/sap/in", defaultní hodnota masky pak "SAP_*".
///
Zpracovávané soubory jsou přesunuty do interní složky systému a následně je spuštěn proces,
/// který dané soubory zpracuje. Ze zpracování jsou vyloučeny soubory s nulovou délkou.
/// Jejich výskyt je zaznamenán do logu jako WARNING. Stejně tak jsou do logu zaznamenány soubory,
/// jejichž název neodpovídá žádnému zpracovávanému souboru.
Method OnProcessInput(pInput As %FileCharacterStream, pOutput As %RegisteredObject) As %Status
{
set FileName = ##class(%File).GetFilename(pInput.Filename)
if FileName = $$$SAPCostCentersFileName
{
q:..CheckEmptyFile(pInput.Filename) $$$OK
do ..MoveFile(pInput.Filename, $$$SAPCostCentersFileName)
do ..ProcessSAPCodebooksToApo($$$tkcSAPCostCenters)
}
elseif FileName = $$$SAPVendorsFileName
{
q:..CheckEmptyFile(pInput.Filename) $$$OK
do ..MoveFile(pInput.Filename, $$$SAPVendorsFileName)
do ..ProcessSAPCodebooksToApo($$$tkcSAPVendors)
}
elseif FileName = $$$SAPCustomersFileName
{
q:..CheckEmptyFile(pInput.Filename) $$$OK
do ..MoveFile(pInput.Filename, $$$SAPCustomersFileName)
do ..ProcessSAPCodebooksToApo($$$tkcSAPCustomers)
}
elseif FileName = $$$SAPBookingOrdersFileName
{
q:..CheckEmptyFile(pInput.Filename) $$$OK
do ..MoveFile(pInput.Filename, $$$SAPBookingOrdersFileName)
do ..ProcessSAPCodebooksToApo($$$tkcSAPBookingOrders)
}
elseif FileName = $$$SAPMGroupXBClassFileName
{
q:..CheckEmptyFile(pInput.Filename) $$$OK
do ..MoveFile(pInput.Filename, $$$SAPMGroupXBClassFileName)
do ..ProcessSAPImportCSVFile($$$tkcSAPMGroupXBClass)
}
else
{
$$$LOGWARNING("SAP incoming file error: Unexpected filename '"_pInput.Filename_"'")
}
quit $$$OK
}
/// Callback method called just after %OnNew()
///
Metoda zajistí načtení nastavení (settings) FilePath a FileSpec z hodnot,
/// uložených v definici KZISSetup.inc a v Setupu projektu (globals).
/// Viz též třída KZIS.MW.Setup,
/// která zprostředkovává přístup k hodnotám stupu, uložených v golobals.
Method OnInit() As %Status
{
set ..Adapter.FilePath = $$$SharedFilesFullPath_$$$SAPIncomingDir
set ..Adapter.FileSpec = $$$SAPIncomingCSVFilesSpec
$$$LOGINFO("SAP incoming files full path: "_..Adapter.FilePath)
$$$LOGINFO("SAP incoming codebook files spec: "_..Adapter.FileSpec)
Quit $$$OK
}
}