//"wydr_inc.sci","Wydruki - include","\",0,2.0.14,SYSTEM
/////////////////////////////////////////
// Wydruki - include
// wydr_inc.sci

// ##########################################################################################
// UWAGA :
// 1) dokumenty sprzedazy (z define'm SHOWGTU) moga byc drukowane z GTU
//    wszystkie inne drukowane sa bez GTU
// 2) zaleznie od powyzszego podpowiedz (cmbPC) ma 4 lub 5 elementow
// 3) wybor uzytkownika currPC (gdy wydruki bez GTU) jest przekodowywany
//    po wyjsciu z okna ustawien wydruku :
//                 1 -> 1
//                 2 -> 2
//                 3 -> 4
//                 4 -> 5
//    wpp currPC pozostaje bez zmian
// 4) currPC jest zapisywane do INI z przekodowana wartoscia
// ##########################################################################################

#ifndef SHOW_GTU_DEFINED
#define SHOW_GTU_DEFINED
	Int show_gtu
#endif

#ifndef OMNIBUS_BARCODE_DEFINED
#define OMNIBUS_BARCODE_DEFINED
    Int omnibus_barcode
#endif
#ifdef OMNIBUS
	omnibus_barcode = OMNIBUS
#endif

#ifdef SHOWGTU
	// wydruki sprzedazy z GTU
	show_gtu = 1
#else
	// wydruki inne bez GTU
	show_gtu = 0
#endif

#define TiPozycjaMg 0x2BDD

#ifndef _WYDRUKI_INC
#define _WYDRUKI_INC

// Ten plik zawiera funkcje, ktore moga byc wykorzystane w raportach drukujacych dane

String cmb(3) = "W osobnej kolumnie","Obok nazwy towaru","Nie pokazuj"

// ################################################################################################
// ####################             PC - product classification                ####################
// ####################     klasyfikacje towarow prezentowane na wydrukach     ####################
// ################################################################################################

// aktualnie obslugiwane
// 1 - tylko PKWiU
// 2 - tylko CN
// 3 - tylko GTU
// 4 - CN dla towarow lub PKWiU dla uslug oraz GTU
// 5 - CN i PKWiU oraz GTU
String cmbPC(5) = "PKWiU", "CN", "GTU", "CN/PKWiU, GTU", "CN, PKWiU, GTU"
If !show_gtu Then
	// inna podpowiedz z mniejsza iloscia elementow
	cmbPC(3) = "CN/PKWiU"
	cmbPC(4) = "CN, PKWiU"
	Shrink cmbPC, 1
EndIf

If omnibus_barcode Then
	Grow cmbPC, 1
	cmbPC(5) = "Kod paskowy"
EndIf

// domyslnie : GTU lub PKWiU gdy wydruki bez GTU
Int Sub defaultPC()

	defaultPC = IIF(show_gtu, 3, 1)

EndSub

Int currPC = defaultPC()

String sSWW_ = cmbPC(currPC)

// odczytaj CN i/lub PKWiU oraz GTU          - w przypadku pozycji dokumentu
String Sub getPC(Dispatch documentPosition, Int sendAggregated)

	Dispatch parameters
	Dispatch product
    String pkwiu

	If (currPC == 2) || (documentPosition.flagi & 512) || (documentPosition.flagi & 4096) || currPC == 5 Then
		// CN odczytywany z towaru
		parameters = xFactory.NewObject("XParams")
		parameters.kod = documentPosition.kod
		product = xFactory.GetObject("BTowar", parameters)
        If !product Then
            // gdy nie znaleziono produktu prezentujemy puste CN, PKWiU, etc.
            product = xFactory.NewObject("BTowar")
        EndIf
	EndIf

    If (TiPozycjaMg == documentPosition.objId) Then
	    // dla magazynu PKWiU z towaru
	    pkwiu = product.PKWiU
    Else
	    // wydruki inne - z pozycji dokumentu
	    pkwiu = documentPosition.PKWiU
    Endif

	Select Case currPC
		Case 1
					getPC = pkwiu
		Case 2
					getPC = product.CNpelny
		Case 3
					getPC = ""
		Case 4
					getPC = IIF((documentPosition.flagi & 512) || (documentPosition.flagi & 4096), product.CNpelny, pkwiu)
		Case 5
					getPC = product.CNpelny + IIF(((product.CNpelny != "") && (pkwiu != "")), ", ", "") + pkwiu
		Case Else
					getPC = ""
	EndSelect

	If (show_gtu == 1) && (currPC >= 3) && (currPC <= 5) && (documentPosition.objId == 0x2BDA) && (documentPosition.JPK_V7 != "") Then
		// atrybut JPK_V7 posiada tylko pozycja sprzedazy (0x2BDA) i zakupu
		If getPC != "" Then getPC += ", "
		getPC += IIF(sendAggregated, AggregatedGTU(), documentPosition.JPK_V7)
	Endif

EndSub

// odczytaj CN i/lub PKWiU oraz GTU          - w przypadku towaru
String Sub getProductPC(Dispatch product)

	Select Case currPC
		Case 1
					getProductPC = product.PKWiU
		Case 2
					getProductPC = product.CNpelny
		Case 3
					getProductPC = ""
		Case 4
					getProductPC = IIF(product.typext != 1, product.CNpelny, product.PKWiU)
		Case 5
					getProductPC = product.CNpelny + IIF(((product.CNpelny != "") && (product.PKWiU != "")), ", ", "") + product.PKWiU
		Case Else
					getProductPC = ""
	EndSelect

	If (show_gtu == 1) && (currPC >= 3) && (currPC <= 5) && (product.JPK_V7 != "") Then
		If getProductPC != "" Then getProductPC += ", "
		getProductPC += product.JPK_V7
	Endif

EndSub

// odczytaj CN i/lub PKWiU oraz GTU          - w przypadku pomocniczej struktury InfoPoz
String Sub getInfoPozPC(Int flags, String productName, String classification, String gtu)

	Dispatch parameters
	Dispatch product

	If (currPC == 2) || (flags & 512) || (flags & 4096) || currPC == 5 Then
		// CN odczytywany z towaru
		parameters = xFactory.NewObject("XParams")
		parameters.kod = productName
		product = xFactory.GetObject("BTowar", parameters)
        If !product Then
            // gdy nie znaleziono produktu prezentujemy puste CN, PKWiU, etc.
            product = xFactory.NewObject("BTowar")
        EndIf
	EndIf

	Select Case currPC
		Case 1
					getInfoPozPC = classification
		Case 2
					getInfoPozPC = product.CNpelny
		Case 3
					getInfoPozPC = ""
		Case 4
					getInfoPozPC = IIF((flags & 512) || (flags & 4096), product.CNpelny, classification)
		Case 5
					getInfoPozPC = product.CNpelny + IIF(((product.CNpelny != "") && (classification != "")), ", ", "") + classification
		Case Else
					getInfoPozPC = ""
	EndSelect

	If (show_gtu == 1) && (currPC >= 3) && (currPC <= 5) && (gtu != "") Then
		If getInfoPozPC != "" Then getInfoPozPC += ", "
		getInfoPozPC += gtu
	Endif

EndSub

String Sub getCommaBody( String info )

	getCommaBody = IIF(info == "", "", ", " + info)

EndSub

String Sub getCommaPC(Dispatch documentPosition, Int sendAggregated)

	getCommaPC = getCommaBody(getPC(documentPosition, sendAggregated))

EndSub

String Sub getCommaInfoPozPC(Int flags, String productName, String classification, String gtu)

	getCommaInfoPozPC = getCommaBody(getInfoPozPC(flags, productName, classification, gtu))

EndSub

// odczytaj z INI drukowana klasyfikacje towarow
Int Sub GetIniPC(String section, String key, Int defaultValue)

	String value

	// numer
	value = GetIni(section, "KlasyfikacjaTowarow")
	currPC = IIF(value == "", defaultPC(), Val(value))
	// przekodowanie wyboru uzytkownika (podpowiedz z mniejsza iloscia elementow)
	If !show_gtu && currPC > 2 Then currPC -= 1
	// nazwa
	sSWW_ = cmbPC(currPC)
	// polozenie
	value = GetIni(section, key)
	GetIniPC = IIF(value == "", defaultValue, Val(value))

EndSub

// zapisz do INI drukowana klasyfikacje towarow
Int Sub PutIniPC(String section, String key, Int value)

	PutIni(section, "KlasyfikacjaTowarow", Using "%d", currPC)
	PutIni(section, key, Using "%d", value)

EndSub

// uaktualnij nazwe/tytul drukowanej klasyfikacji towarow po zamknieciu opcji wydrukow
Int Sub ExecFormPC()

	If ExecForm ( OnCommand ) == -1 Then Error ""
	sSWW_ = cmbPC(currPC)
	// przekodowanie wyboru uzytkownika po wyjsciu z ustawien wydruku
	If !show_gtu && currPC > 2 Then currPC += 1

EndSub

// uaktualnij nazwe/tytul drukowanej klasyfikacji towarow po zamknieciu opcji wydrukow
Int Sub ExecFormWithoutOnCommandPC()

	If ExecForm == -1 Then Error ""
	sSWW_ = cmbPC(currPC)
	// przekodowanie wyboru uzytkownika po wyjsciu z ustawien wydruku
	If !show_gtu && currPC > 2 Then currPC += 1

EndSub

// ################################################################################################

//definicje
#define sOO_ "Odwrotne obciążenie"
//Podgląd cen i wartości magazynowych
#define PR_CW_MG_VIEW				2357
//Prawo przeglądania cen zakupu
#define PR_ZK_CEN					2354

#define DATA_BRAK	4
Int bKZ = 0 //czy korekta zbiorcza

string sPLN = " PLN"

string sMthName(1)
string sNapisWStopce

#include "Obiekty - include"

dispatch g_xProgram = xFactory.GetObject("BProgram")

#define SPLIT_PAYMENT_EN	"Split payment"
#define SPLIT_PAYMENT_PL	"Mechanizm podzielonej płatności"

Dispatch xParamsBDO = xFactory.NewObject("XStrRW")
xParamsBDO.kod = xFactory.parametry.PP_DRUK_BDO
string bDrukBDO= xParamsBDO.GetField("wartosc")

//-----------------------------------------------------------------------------------------------------------------------------------
Int Sub PrintSplitPaymentBody(Dispatch document, String information)
//-----------------------------------------------------------------------------------------------------------------------------------

	If document Then
		If document.splitPayment Then
			SetStyl(Styl(CopyFont("tekst",1),0))
			Print LF;LF;information;LF;LF
		EndIf
	EndIf

EndSub

Int Sub IsSplitPayment(Dispatch document)
	int result = 0
	If document Then
		If document.splitPayment Then
			result = 1
		EndIf
	EndIf
	IsSplitPayment = result
EndSub

//-----------------------------------------------------------------------------------------------------------------------------------
Int Sub PrintMPP(Dispatch document)
//-----------------------------------------------------------------------------------------------------------------------------------

	PrintSplitPaymentBody(document, SPLIT_PAYMENT_PL)

EndSub

//-----------------------------------------------------------------------------------------------------------------------------------
Int Sub PrintSplitPayment(Dispatch document)
//-----------------------------------------------------------------------------------------------------------------------------------

	PrintSplitPaymentBody(document, SPLIT_PAYMENT_EN)

EndSub

//-----------------------------------------------------------------------------------------------------------------------------------
String Sub PrintHtmlMPP(Dispatch document)
//-----------------------------------------------------------------------------------------------------------------------------------

	PrintHtmlMPP = ""

	If document Then
		If document.splitPayment Then
			PrintHtmlMPP = Using "<FONT FACE=\"Arial\" SIZE=2><P ALIGN=\"CENTER\">%s<BR></BR></FONT>", SPLIT_PAYMENT_PL
		EndIf
	EndIf

EndSub

//-----------------------------------------------------------------------------------------------------------------------------------
String Sub PrintRtfMPP(Dispatch document, String documentName)
//-----------------------------------------------------------------------------------------------------------------------------------

	PrintRtfMPP = documentName

	If document Then
		If document.splitPayment Then
			PrintRtfMPP = Using "\\fs16\\par\\fs22 %s \\fs16\\par\\par %s \\par", documentName, SPLIT_PAYMENT_PL
		EndIf
	EndIf

EndSub

//-----------------------------------------------------------------------------------------------------------------------------------
string Sub GetFirmaIni()
//-----------------------------------------------------------------------------------------------------------------------------------
//	GetFirmaIni = KatalogFirmy() +  "firma."+ g_xProgram.kod
	GetFirmaIni = "firma."+ g_xProgram.kod
endsub
//-----------------------------------------------------------------------------------------------------------------------------------


//-----------------------------------------------------------------------------------------------------------------------------------
string Sub GetPrLine()
//-----------------------------------------------------------------------------------------------------------------------------------
	GetPrLine = g_xProgram.reportsFooter
endsub
//-----------------------------------------------------------------------------------------------------------------------------------


//-----------------------------------------------------------------------------------------------------------------------------------
//funckja do "łamania" wyrazów
string Sub PiszWyrazy(string sText, int nDlugosc)
string sTmp
int i,j
int nMaxLen //Maxymalna długość textu jaka mozna wpisac w kolumne
int nFirstSpace //Pierwsza spacja w tekscie liczona od lewej strony
int nFirstEnter //Pierwszy enter liczony od prawej strony
//	if TextWidth(sText)<=nDlugosc then PiszWyrazy=sText : exit
	while sText
		sTmp=sText
//pozbywam sie spacji lub enterow na poczatku lancucha
		while mid(sTmp,1,1)==" " || mid(sTmp,1,1)=="\n"
			sTmp=mid(sTmp,2)
			sText=mid(sText,2)
		wend
//i na koncu
		while mid(sTmp,len(sTmp),1)==" " || mid(sTmp,len(sTmp),1)=="\n"
			sTmp=mid(sTmp,1,len(sTmp)-1)
			sText=mid(sText,1,len(sText)-1)
		wend
		while sTmp
//znajduje max dopuszczalna dlugosc stringu, jezeli ostatni w dopuszczalnym stringu jest enter
//pobieram lancuch max len mniejszy o 1
			if !nMaxLen && TextWidth(sTmp)<=nDlugosc then
				nMaxLen=len(sTmp)
				if mid(sTmp,1)=="\n" then nMaxLen=len(sTmp)-1
			endif
			if nMaxLen && mid(sTmp,len(sTmp),1)=="\n" then
				//napotkano enter j okresla nam ze znamy juz max ilosc znakow jaka wejdzie
				nFirstEnter=len(sTmp)-1
			endif
			if !nFirstSpace && nMaxLen && mid(sTmp,len(sTmp),1)==" " then
				nFirstSpace=len(sTmp)
			endif
			sTmp=mid(sTmp,1,len(sTmp)-1)
		wend
		if !nFirstEnter then //jezeli nie ma enterow przed dopuszcz. dlugoscia
			j=nMaxLen
			if nFirstSpace && mid(sText,nMaxLen+1,1)!=" " then j=nFirstSpace
			//jezeli sa spacje przed dopuszczalna dlugoscia i po max znakiem nMaxlen+1 nie jest spacja
		else
			j=nFirstEnter //jezeli sa entery przed max. dopuszcz. dlug.
		endif
//w sytuacji kiedy caly lancuch miesci sie w kolumnie i ma spacje np "Towar zw", bez tego warunku podzieli sie na
//"Towar"\n"zw" chociaz "Towar zw" wszedlby bez podzialu
		if !nFirstEnter && nFirstSpace && TextWidth(sText)<=nDlugosc then j=len(sText)
		PiszWyrazy+=mid(sText,1,j)+"\n"
		sText=mid(sText,j+1)
		sTmp=sText
		nMaxLen=nFirstSpace=nFirstEnter=j=0
	wend
	PiszWyrazy=mid(PiszWyrazy,1,len(PiszWyrazy)-1)
endsub
//-----------------------------------------------------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------------------------------------------------
// Zamienia kropkę dziesiętną na przecinek w podanym ciągu znaków reprezentującym liczbę.
string sub ZamienKropkeNaPrzecinek(string strLiczba)
    string tmp, wynik
    int i, j
    j = len(strLiczba)
    for i = 1 to i > j
        tmp = mid(strLiczba, i, 1)
        if tmp == "." then tmp = ","
        wynik += tmp
    next i
    ZamienKropkeNaPrzecinek = wynik
endsub

int sub PoliczMiejscaPoPrzecinku(string sKursWaluty)
	int i, dlugosc, iloscPoPrzecinku
	dlugosc = Len(sKursWaluty)
	iloscPoPrzecinku = 0

	if ( dlugosc > 0 ) then
		for i = 0 to i > dlugosc
			// Poszukaj kropki lub przecinka
			if ( Mid(sKursWaluty, i, 1) == "." || Mid(sKursWaluty, i, 1) == "," ) then 
				// Oblicza ilość miejsc po przecinku
				iloscPoPrzecinku = dlugosc - i
			endif
		next i
	endif
	// Zwraca ilość miejsć po przecinku
	PoliczMiejscaPoPrzecinku = iloscPoPrzecinku
endsub

string sub UsunKoncoweZera(string sKurs)
	int i, dlugosc, nOstatniZnak, nCzyOstatni
	nCzyOstatni = 0
	string sBiezacyZnak
	dlugosc = Len(sKurs)
	if ( dlugosc > 0 ) Then
		for i = dlugosc to i == 0 step -1
			sBiezacyZnak = Mid(sKurs, i, 1)
			if sBiezacyZnak != "0" && nCzyOstatni == 0 then
				nOstatniZnak = i
				nCzyOstatni = 1
			endif
		next i		
	Endif
	UsunKoncoweZera = Mid(sKurs, 0, nOstatniZnak)
endsub

string sub PobierzFormatPrecycji(int iloscPoPrzecinku)
	string sMiejsca
    
    if iloscPoPrzecinku < 4 then
        iloscPoPrzecinku = 4
    endif

	if (iloscPoPrzecinku / 2) * 2 != iloscPoPrzecinku then
 	   iloscPoPrzecinku = iloscPoPrzecinku + 1
	endif

	sMiejsca = using "%d", iloscPoPrzecinku
    PobierzFormatPrecycji = "%." + sMiejsca + "f"
endsub

// Formatuje kurs waluty zgodnie ze standardem NBP oraz 
// praktyką instytucji finansowych (np. ECB, IMF, BIS)
// do parzystych miejsc po przecinku
string sub SformatujKursWaluty(float fKurs)
	string sKurs, sNowyKurs
	int iloscMiejscPoPrzecinku
	// Nie może być więcej niż 15 cyfr znaczacych
	sKurs = using "%.12f", fKurs
	sNowyKurs = UsunKoncoweZera(sKurs)
	iloscMiejscPoPrzecinku = PoliczMiejscaPoPrzecinku(sNowyKurs)
	sNowyKurs = using PobierzFormatPrecycji(iloscMiejscPoPrzecinku), fKurs

    SformatujKursWaluty = ZamienKropkeNaPrzecinek(sNowyKurs)
endsub

string sub WstawPrzecinek(float fLiczba)
    string tmp
    tmp = using "%.6f", fLiczba
    WstawPrzecinek = ZamienKropkeNaPrzecinek( tmp )
endsub



string sub KontoBankoweLk(string strKonto)
	KontoBankoweLk = strKonto
	if mid(KontoBankoweLk,9,1) != "-" then
		Arg " ", ""
		buf=KontoBankoweLk
		Replace Arg
		Delete Arg
		KontoBankoweLk=buf
	endif
endsub
string sub FormatNotatka(string s)
	Arg "\r",""
	buf = s
	Replace Arg
	Delete Arg
	FormatNotatka=buf
endsub
string sub formatuj(float liczba, int dokl)
int pos, dl, posb, bNoPoz
string sliczba
string wynik, spom
liczba=round(liczba,dokl)
sliczba = using "%f",liczba
//	sliczba=liczba
	posb = move 0
	spom=buf
	buf = sliczba

	if find "." then
		pos = move 0
		wynik = mid(sliczba,pos+1,dokl)
		wynik= ","+wynik
		if val(mid(wynik,2))==0 then wynik=",00"
		while size(wynik)<dokl+1
			wynik=wynik+"0"
		wend
	else
		wynik="     "
		pos=size(buf)+1
	endif

	pos=pos-3
	dl=3
	if pos<=0 then dl=dl+pos-1: pos=1
	wynik = mid(sliczba,pos,dl)+wynik

	while pos>1
		pos=pos-3
		dl=3
		if pos<=0 then dl=dl+pos-1: pos=1
		wynik = mid(sliczba,pos,dl)+" "+wynik
	wend
	formatuj = wynik
	buf=spom
	move to posb
endsub
int sub KomunikatImp(int czyImport,int czyDostawy)
	if czyImport && czyDostawy then
		KomunikatImp=0
		Message "Dla dokumentów zaimportowanych z oddziału dostawy są niedostępne."
	else
		KomunikatImp=czyDostawy
	endif
endsub
int sub DeleteFiles()
	DeleteTempFile("AMH","rtf")
	DeleteTempFile("AMH","tmp")
	DeleteTempFile("AMH","htm")
	DeleteTempFile("ANH","tmp")
endsub
string sub sDajIlosc( float i)
	int g_RSpos = move 0
	string g_sRS
	swap g_sRS, buf
	buf = using "%4.4f",i
	move to 1
	delete regular "(0#$)|(.0#$)"
 	move to 1
  	Replace ".",","
	sDajIlosc=buf
	swap g_sRS, buf
	move to g_RSpos
endsub
string sub sDajOpisTypu(string sKart,string sSkrot)
	dispatch xTypDk
	if (xTypDk=GetObjByKod("BTypDokumentu"+sKart,sSkrot)) then sDajOpisTypu=xTypDk.Opis
endsub

string sub sDajOkres(string sData)
int pom
	pom = move 0
	swap buf,sData
	if (find regular "{:d##}/-{:d##}/-:d##") then
		sDajOkres = sMthName(val(regular 2))+" "+(regular 1)
	else
		sDajOkres = buf
	endif
	swap buf,sData
	move to pom
endsub

int bNapisWStopce = 0
string sekcjatypDk

int sub GetNapisWStopce()
int pozbuf
string sTmp
string inikey
int i
	if !bNapisWStopce && sekcjaTypDk != "" then
	//pobranie napisu w stopce
		sNapisWStopce = "": sTmp = "": i = 0: inikey = "Stopka"
		do
			sNapisWStopce += sTmp
			if i then inikey = using "Stopka%d",i
			sTmp = GetIni(sekcjatypDk, inikey)
			i+=1
		loop while sTmp
	//zamiana dziwnych znaków w napisie stopki na znak końca linii
		pozbuf = move 0
		swap buf,sNapisWStopce
		Arg "č","\n"
		Replace Arg
		Delete Arg
		swap buf,sNapisWStopce
		move to pozbuf
		bNapisWStopce = 1
	endif
endsub
MapValue mFooterLines
mFooterLines.Clear()
mFooterLines.Type(string)

//zawołaj już po utworzeniu pierwszej strony wydruku
int sub CheckFooterSize(string typdk)
	string sTmp
	int pozbuf
	int i
	int ilelinii
	int start
	int stop
	int bylEnter
	sekcjaTypDk = typDk
	if !bNapisWStopce then GetNapisWStopce()
	string sFontName = IIF(Val(Arg0),"17cpi","stopka")
	if sNapisWStopce != "" then
		//policz ilosc linii przesunięcia dolnego marginesu wydruku
		start=0//poczatek aktualnie badanego podzbioru napisu
		bylEnter = 0
		for i = 1 to i> Len(sNapisWStopce)
			//sprawdzam czy znak w aktualnej pozycji nie jest znakiem końca linii
			if (Mid(sNapisWStopce,i,1) != "\n") then
				//sprawdzam czy długość aktualnego podzbioru nie przekracza szerokości strony
				if(TextWidth(Mid(sNapisWStopce,start+1,i-start), sFontName)>str.Szer) then
					ileLinii+=1//inkrementuje ilość linii
					start = i-1//i zaczynam badac nowy podzbiór, zaczynając od aktual;nej pozycji
				endif
			else				
				bylEnter = 1//zaznaczam, że był
				ilelinii+=1// inkrementuje ilość linii
				start=i//i zaczynam badac nowy podzbiór, zaczynając od nastepnej pozycji
			endif
		next i
		//jeśli jest tylko jedna linia to nie kończy się znakiem '\n'
		//jeśli jest więcej to kazda z nich kończy sie znakiem '\n'
		//jeśli nie było znaku '\n' to musimy zwiekszyć ilelinii o 1
		if(!bylEnter) then ilelinii += 1
				
		str.dm += TextHeight("X",sFontName)*ilelinii
		str.Ustaw()
	endif
endsub

int sub SetSekcjaTypDk(string typDk)
	sekcjaTypDk = typDk
endsub

string sub GetFooterLine(string sline)
	string sTmp,sTmp2
	int lineNo,pozbuf
	GetFooterLine = ""
	if !bNapisWStopce then GetNapisWStopce()
	if bNapisWStopce && sNapisWStopce!= "" then
		if !mFooterLines.Size() then
			sTmp=sNapisWStopce
			pozbuf = move 0
			swap buf,sTmp
			lineNo = 1
			while find regular "{*}\n"
				sTmp2 = regular 1
				mFooterLines.Set((using "%d",lineNo),sTmp2)
				move to 1
				replace sTmp2+"\n",""
				lineNo += 1
			wend
			if buf != "" then mFooterLines.Set((using "%d",lineNo),buf)
			swap buf,sTmp
			move to pozbuf
		endif
		if mFooterLines.Index(sline) then GetFooterLine = mFooterLines.Get(sline)
	endif
endsub

// ----------------------------------------------------------------------------------------------------
// Poprawny podzial na strony przy wypisywaniu tekstu w ramce
//
// Parametry :
//	sTextToPrint	- tekst drukowany w ramce
//	iFrameLeft		- lewy margines ramki
//	iFrameTop		- gorny margines ramki ( na pierwszej stronie )
//	iFrameWidth		- szerokosc ramki
//	iFrameHeight	- minimalna wysokosc ramki
//	iDrawFrame		- z ramka / bez ramki
//	iStyle			- styl czcionki

Int Sub MultiPagePrint ( String sTextToPrint, Int iFrameLeft, Int iFrameTop, Int iFrameWidth, Int iFrameHeight, Int iDrawFrame, Int iStyle )
	Int		iBufPosition
	String	sBufContent
	String	sCurrLine

	// Zapamietaj stan zmiennej buf
	sBufContent = buf
	iBufPosition = Move 0

	buf = sTextToPrint
	Do
		// Drukuj ramke na kazdej stronie z wypisywanym tekstem
		Ramka Od iFrameLeft, iFrameTop, iFrameWidth, iFrameHeight, iDrawFrame
			SetStyl( iStyle )
			While Str.Pozycja( #Y ) + TextHeight( "" ) < Str.Wys
				// Kolejny wiersz miesci sie na stronie
				sCurrLine = Find Regular "*[\n]"
				If sCurrLine == "" Then
					sCurrLine = Find Regular "*$"
				EndIf
				If sCurrLine != "" Then
					Print sCurrLine
					Move Len( sCurrLine )
				Else
					Exit
				EndIf
			Wend
		Koniec
		sCurrLine = Find Regular "*$"
		If sCurrLine Then
			// Kolejne wiersze na nowej stronie 
			Strona
			iFrameTop = 0
		EndIf
	Loop While sCurrLine
	
	// Odtworz stan zmiennej buf
	buf = sBufContent
	Move To iBufPosition
	
	MultiPagePrint = 0
EndSub
string ndatnamesP(1)
string ndatnamesA(1)

Record RecNDat
	int nDatExtra
	int sub Init(int czySp, int czyExtra, int nDat, int czyKZ)
		if !czyKZ && nDat==DATA_BRAK then nDat = 0
		nDatExtra = nDat+1
		shrink 	ndatnamesP,-1
		shrink 	ndatnamesA,-1
		
	 	grow ndatnamesP, IIF(czyExtra && czySp, IIF(czyKZ,4,3), IIF(czyKZ,2,1))
		grow ndatnamesA, IIF(czyExtra && czySp, 3, 1)

		if czySp then
			ndatnamesP(1) = "Data sprzedaży"
			ndatnamesP(2) = "Okres sprzedaży"
			ndatnamesA(1) = "Date of sale"
			ndatnamesA(2) = "Sell period"
			if czyExtra then
				ndatnamesP(3) = "Data dostawy"
				ndatnamesP(4) = "Data wykonania usługi"
				if czyKZ then ndatnamesP(5) = "Brak"
				ndatnamesA(3) = "Delivery date"
				ndatnamesA(4) = "Service delivery date"
			else 
				if czyKZ then ndatnamesP(3) = "Brak"
			endif

		else
			ndatnamesP(1) = "Data zakupu"
			ndatnamesP(2) = "Okres zakupu"
			if czyKZ then ndatnamesP(3) = "Brak"
			//na razie nie używane
			//do użycia nalezy przetłumaczyć
			ndatnamesA(1) = "Data zakupu"
			ndatnamesA(2) = "Okres zakupu"
		endif		
	endsub

	int sub PrepareControl(int x, int y)
	
		CmbBox "",ndatnamesP,nDatExtra,x,y,120,20+20*size(ndatnamesP)		
	endsub

	Int Sub PrepareControl3( Int x, Int y, Int dx )

		CmbBox "",ndatnamesP,nDatExtra,x,y,dx,20+20*size(ndatnamesP)

	EndSub

	int sub RenameP(string sname1, string sname2)
		ndatnamesP(1) = sname1
		ndatnamesP(2) = sname2	
	endsub

	int sub TranslateVar()
		TranslateVar = nDatExtra - 1
	endsub

	string sub GetName(int czyAng, int czyLCase)
		if nDatExtra < 1 || nDatExtra > size(ndatnamesP) then exit
		if czyAng then
			GetName = ndatnamesA(nDatExtra)
		else
			GetName = ndatnamesP(nDatExtra)
		endif
		if czyLCase then GetName = LCase(GetName)
	endsub

	int sub PrintGraf(string sData, int styleName, int styleData, int czyAng, int czyLCase, int xData, int yData)
		SetStyl(styleData)
		print at xData, yData;sData;lf
		SetStyl(styleName)
		print GetName(czyAng, czyLCase)
	endsub

	int sub PrintTxt(string sData, string fontName, string fontData, int czyAng, int czyLCase, int xData, int yData)
		SetFont(fontName)
		print at xData, yData;GetName(czyAng, czyLCase) + " : "
		SetFont(fontData)
		print sData
	endsub

	string sub PrepareData(string sData)
		if nDatExtra == 2 then
			PrepareData = sDajOkres(sData)
		else
			PrepareData = sData
		endif
	endsub
endrec

RecNDat rBoxData




int CzyInitMonths = 0
#endif
//jeśli najpierw byłu inkludowany plik z językiem to:
#ifdef LANG_DEF
	if CzyInitMonths == 0 then
		shrink sMthName,-1
		grow sMthName,11
		sMthName(1) = MC1_L
		sMthName(2) = MC2_L
		sMthName(3) = MC3_L
		sMthName(4) = MC4_L
		sMthName(5) = MC5_L
		sMthName(6) = MC6_L
		sMthName(7) = MC7_L
		sMthName(8) = MC8_L
		sMthName(9) = MC9_L
		sMthName(10) = MC10_L
		sMthName(11) = MC11_L
		sMthName(12) = MC12_L
		CzyInitMonths = 1
	endif
#endif

// ####################################################################################################
// ponizej globalne define'y i zmienne z unikalnymi nazwami
// zeby nie definiowac ich wielokrotnie (szczegolnie gdy uzywane w dolaczanych podraportach)
// ####################################################################################################

#ifndef DOKUMENTSPOBJID_DEFINED
#define DOKUMENTSPOBJID_DEFINED
#define	DokumentSpObjId	0x2BD2
#endif

#ifndef WARTOSCVAT_DEFINED
#define WARTOSCVAT_DEFINED
float wartoscVat
#endif

#ifndef WARTOSCBRUTTO_DEFINED
#define WARTOSCBRUTTO_DEFINED
float wartoscBrutto
#endif