//"dokeng.sci","Engine do dokumentów","\Dokumenty\Sprzedaż\",0,2.2.7,SYSTEM
//////////////////////////
// Engine do dokumentów
// dokeng.sci
////////////////////////////

#ifndef CHARAKTERY_INCLUDED
#include "Charaktery dokumentów"
#endif

#define APOSTROF "\t"
#define PR_DK_VIEW_MG   2316 //Przeglądanie dokumentów magazynowych
Limit 32000

#ifdef PNABYWCE then
	int DokZakupu = 1
#else
	int DokZakupu = 0
#endif

#include "Wydruki - include"

int NieZamowienieLubKontraktSprzedazy = 0

int PrawaDoMg=xFactory.prawa.czyjestprawo(PR_DK_VIEW_MG)
int DECLARE ZbierzDostawy(int lp)

//------------------------------------------------------------------------------------------------------
record InfoDost
	int lp
	string nazwa[101]
	float cena
	float ilosc
	float wartosc
endrec

//------------------------------------------------------------------------------------------------------
//zmienne strukturalne, obiekty typu dispatch
record rWyd
	string		Nazwa[41]
	string		Data_Wyd[11]
endrec

record rCeny
	float	PrzelJmDod
	float	CenaNetto
	Float	CenaNettoWP
	Float	CenaBrutto
	Float	CenaBruttoWP
endrec
MapValue mIdPozycjaK
mIdPozycjaK.Clear()
mIdPozycjaK.Type(int)



record StV
	String		Nazwa[20]
	Float		Netto
	Float		Vat
	Float		Brutto
	Float 		Wartosc
	Float 		znacznik
    Float 		NettoWal
	Float 		BruttoWal
endrec

StV StawkiVat(1)

record rVatEngine

	MapValue mIdxs

	int sub GetIndeksVat(string nazwa)
		int i
		if mIdxs.Size()==0 then
			mIdxs.Clear()
			mIdxs.Type(int)
			if StawkiVat(1).nazwa == "" then Message "Błąd uzycia StawkiVat":Error ""
			for i = 1 to i > size(StawkiVat)
				mIdxs.Set(StawkiVat(i).nazwa,i)
			next i
		endif
		GetIndeksVat = mIdxs.Index(nazwa)
		if !GetIndeksVat then Message "Nie ma stawki o takiej nazwie.": Error ""
	endsub

	float sub GetVat(int czynetto,float wartosc, float stawka)
		GetVat = IIF(czynetto,round(wartosc*stawka,2),round(wartosc*stawka/(1+stawka),2))
	endsub
endrec

record InfoPlatWal
	int id
	string waluta[6]
	string wartoscDK[30]
	string wartoscRL[30]
endrec

InfoPlatWal rplatwal(1)
int sub AddPlatWal(string waluta, float wartDK, float wartRL)
	int id
	if id=rplatwal(Size(rplatwal)).id then grow rplatwal,1
	id+=1
	rplatwal(id).id=id
	rplatwal(id).waluta=IIF(waluta!="", waluta, "PLN")
	rplatwal(id).wartoscDK=Kwota(wartDK)
	rplatwal(id).wartoscRL=Kwota(wartRL)
endsub
int sub ClearPlatWal()
	shrink rplatwal,-1
	rplatwal(1).id=0
endsub


rVatEngine VatEngine
InfoDost Dostawy(1)
rWyd Wydania(1)
rCeny Ceny(1)
rCeny CenyK(1)
MapValue mDostNameLp
mDostNameLp.Clear()
mDostNameLp.Type(int)
MapValue mOwnerId_poz
mOwnerId_poz.Clear()
mOwnerId_poz.Type(Long)
MapValue mOwnerId_dok
mOwnerId_dok.Clear()
mOwnerId_dok.Type(long)
Dispatch xElem
Dispatch xDocument
DIspatch xKontrahent
dispatch xDzial
Dispatch xRejestr
DIspatch xTowar
dispatch xTwAkcyza
dispatch xTrans
dispatch xPow
dispatch xPlat
dispatch dTmp

string sNotatka,sNotatkaRodz,MiejsceWyst
string Platnosci(3)
string plData(1)
string KodPaskowy_Pozycji(1)
int czyPozPodlega
long iddok =Val ( Arg1 )
if !iddok then message "Raport można wykonać tylko z okna dokumentu" : Error ""

int GRAF = !Val ( Arg0 )
int BUFOR = Val ( Arg2 )

int mytab, mystyl(2), SumTab(1)
int bRW
int nRes,StVatPos,xPos,KolTab1NP(1),StlTab1NP(1),StlTabHNP(1),nInc=1
int idw,nErr,bNotatkaKh,bRabatDlaWartosci,pom,nDostawy,CzyNP
int iTyp
int xDocType //kiedy sie przejdzie na nowy system raportow, mozna wywalic, wywalic tez w Dokument sprzedazy - ramki, Dok sprzedazy-ustawienia
int CZYNETTO
int ZamWlasne
int CzyRozrWal
float fWplaty
float fWplatyWal

float fDoZaplatyWal
float fDoZaplaty
float tot_wartbaza,fRabat
int bRealizacja// CZY DOKUMENT JEST ZREALIZOWANY...cokolwiek to znaczy
int bPrzelew//,dk
//int dp,pw,dw,nt,pn,pn1,mg,xt
string VatWal
string sStndError


int sub XErr(int nErr)
int i
	if nErr==771 then
		for i=1 to i>xFactory.komunikaty.count
			if xFactory.komunikaty.item(i).status then
				sStndError+= "Błąd nr."+(using "%d",xFactory.komunikaty.item(i).id)+": '"+xFactory.komunikaty.item(i).tresc+"'\n"//Atrybut: "+xFactory.komunikaty.item(i).nazwapola+"\n"
			else
				sStndError+="OSTRZEŻENIE !! "+xFactory.komunikaty.item(i).tresc+"\n"
			endif
		next i
	else
		Select case nErr
			case -4101
				sStndError = "Nie odnaleziono rekordu w bazie XT"
			case -4010
				sStndError = "Nieunikalny kod towaru."
			case -4013
				sStndError = "Nie podano nazwy obiektu."
			case 4
				sStndError = "Nie odnaleziono obiektu."
			case -4201
				sStndError = "Nie można zapisac obiektu, w bazie danych istnieje już obiekt posiadający ten sam skrot i charakter."
			case else
				sStndError = "Nieznany błąd nr. "+(using "%d",nErr)
		endselect
	endif
endsub


//------------------------------------------------------------------------------------------------------------
//deklaracja i ustalenie wartosci zmiennych globalnych

string sKartoteka
#ifndef ZAMOWIENIE
	sKartoteka= IIF(DokZakupu, "Zk","Sp")
#else
	sKartoteka=ZMSTAT
#endif

Dispatch xConnEngine
Dispatch xRecEngine
Dispatch xCmdAdoEngine
String objectNameEngine
String requestEngine

If sKartoteka == "Zo" Then
	// zamowienie obce i kopia archiwalna (snapshot) zamowienia obcego obslugiwane przez dwa rozne obiekty biznesowe
	xConnEngine = GetAdoConnection()
	xRecEngine = "ADODB.Recordset"
	xCmdAdoEngine = "ADODB.Command"
	xCmdAdoEngine.ActiveConnection = xConnEngine
	xCmdAdoEngine.CommandTimeout = 5000
	// zamowienie czy kopia archiwalna (snapshot) zamowienia obcego ?
	requestEngine = Using "SELECT ISNULL((SELECT 'BDokumentWersjaZo' FROM HM.ZO WHERE id = %l AND typ = 2), 'BDokumentZo') AS objectName", iddok
	xRecEngine.Open(requestEngine,xConnEngine)
	objectNameEngine = xRecEngine.Fields("objectName").Value
	xRecEngine.Close()
Else
	// inny dokument (nie zamowienie obce ani jego kopia archiwalna (snapshot))
	objectNameEngine = "BDokument"+sKartoteka
EndIf

if !(xDocument=GetObjById(objectNameEngine,iddok)) then XGetObjErr()
//	nRes=xDocument.Load("id="+(using "%d",iddok)) : xErr(nRes)
//if nRes then Message sStndError : Error ""

iTyp=xDocument.Charakter
int bAnulowano = xDocument.CzyAnulowany

#ifndef ZALICZKA
	if iTyp==FZS && !bAnulowano then
	if (message "Uwaga ten raport nie jest przeznaczony dla Faktur zaliczkowych.\nCzy kontynuować wydruk?{{icon=? buttons=(&Nie:2)[&Tak:1]}}") == 2 then error ""
	endif
#endif

//Odczytanie danych firmy z uwzglednieniem daty wystawienia dokumentu (dlatego po załadowaniu obiektu do xDocument)
Dispatch xParamsFirm
Dispatch xFirma = xFactory.GetObject("BFirma") //najpierw pobieramy globalnie cache'owany obiekt danych firmy (aktualne dane)
if xDocument.DataWystawienia < xFirma.dataOd || xDocument.DataWystawienia > xFirma.dataDo then
	// potrzebujemy dane firmy z innego okresu niż okres obowiązywania globalnie pamietanych danych firmy
	xParamsFirm = xFactory.NewObject("BParamsFirma")
    xParamsFirm.data = xDocument.DataWystawienia
	xFirma = xFactory.NewObject("BFirma")
	xFirma.Load(xParamsFirm)
endif


int Sub IsSmeProcedure()
	IsSmeProcedure = iif(xDocument.procedura_SME, 1, 0)
EndSub

string Sub GetNipEx(string sFNip)
	if (iTyp == WDT || iTyp == WDK || iTyp == FVW || iTyp == FKW) && IsSmeProcedure() then
		GetNipEx = xFirma.NIPEX
	else
		GetNipEx = sFNip
	endif
EndSub

string sFNazwa=FormatNotatka(xFirma.Nazwa)
string sFKod=xFirma.kod
string sFAdres=xFirma.Adres
string sFNIP=xFirma.Nip
string sFKodPocz=xFirma.KodPocztowy
string sFMiejsce=xFirma.Miejscowosc
string sFRejon=xFirma.Rejon
string sFTel1=xFirma.Telefon1
string sFTel2=xFirma.Telefon2
string sFFax=xFirma.Fax
string sFEmail=xFirma.Email
string sFPesel=xFirma.Pesel
string sFRegon=xFirma.Regon
string sFBank=xFirma.NazwaBanku
string sFKonto=xFirma.NumerRachunku
string sFNotatka=FormatNotatka(xFirma.Notatka)
string sFBDO=xFirma.BDO

if iTyp==WDT || iTyp==REX then sFNIP=xFirma.VATUE

Dispatch xStawki=xDocument.PozycjeVat
Dispatch xPoz=xDocument.Pozycje

#ifdef OO_ONLY
	Int currInd
	For currInd = 1 To currInd > xPoz.Count()
		If !xPoz.Item( currInd ).odwrotneObc Then
			Message "Raport jest przeznaczony dla dokumentów z wszystkimi pozycjami z odwrotnym obciążeniem."
			Error ""
		EndIf
	Next currInd
#endif

Dispatch xKontr=xDocument.DaneKh//kontrahent
Dispatch xFormaPl=xDocument.FormaPl
string sWaluta = xDocument.Waluta
string sDataSp
string sPlatName=xDocument.FormaPl.Nazwa
string sOpis = xDocument.Opis
string sTerminPlat = xDocument.TerminPlatnosci
float fKurs=xDocument.Kurs
float fKursDoch = xDocument.kursdoch
Float tot_brutto=xDocument.Wartosc
Float Tot_Netto=xDocument.Netto
float tot_vat=xDocument.Vat
float tot_NP=xDocument.Niepodlega

// ################################################################################
// ###############       identyczne w DOKENG.SCI i KORENG.SCI       ###############
// ################################################################################

// wydruk ( korekty ) kontraktu walutowego oraz ( korekty ) zaliczki walutowej

#ifndef PLN_ONLY_DEFINED
#define PLN_ONLY_DEFINED

Int PLNonly = -1		// -1	dokument inny niz SKW / SKWK / SZW / SZWK
						//  0	ceny i wartosci w walucie
						//  1	ceny i wartosci w PLN

#endif // PLN_ONLY_DEFINED

// informacja w naglowku ramek czy wartosci walutowe czy w PLN

String Sub fcSuffix()
	fcSuffix = IIF( PLNonly == 1, " w PLN", IIF( PLNonly == 0, " w " + sWaluta, "" ) )
EndSub

String Sub fcSuffixVAT()
	fcSuffixVAT = IIF( PLNonly == -1, "", " w PLN" )
EndSub

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

	sNazwaDok = sDajOpisTypu(sKartoteka,xDocument.TypDk)
	sDataWyst = xDocument.DataWystawienia
	sNumerDok = xDocument.Numer
#ifdef SHOW_KSEF_INFO
	ksefNumber = xDocument.numberKsef
	ksefPostDate = xDocument.dataWystawieniaKsef
#endif
//	sNumerDok = IIF(DokZakupu, xDocument.NumerObcy, xDocument.Numer)
fDoZaplaty=xDocument.wartosc
fDoZaplatyWal=xDocument.wartoscWWalucie
#ifdef ZAMOWIENIE
	if sign(xDocument.WartoscWWalucie) then fDoZaplatyWal=xDocument.WartoscWWalucie
	if (ZMSTAT=="Zo") || (iTyp == SKO) || (iTyp == SKW) then sDataSp= xDocument.DataSprzedazy
	if ZMSTAT=="Zw" then xKontr=xDocument.DaneKh:ZamWlasne=1

if iTyp != SKO && iTyp != SKW then	bRealizacja=xDocument.CzyZrealizowane
#else
	sDataSp= IIF(DokZakupu, xDocument.DataZakupu, xDocument.DataSprzedazy)		//vat2013??
	//fWplaty = xDocument.Kwota
	if !DokZakupu then bRAbatDlaWartosci=xDocument.RabatDoWartosci
#endif
	if xDocument.RodzajCeny==2 then CZYNETTO=1

//Rejestr bankow
	if !(xRejestr=GetObjById("BRejestr",xDocument.rejestr.id)) then XGetObjErr()
	if !(xKontrahent=GetObjById("BKontrahent",xKontr.Khid)) then XGetObjErr()
string sNazwaBanku=xRejestr.bank
string sKonto=xRejestr.rachunek
string sSwift=xRejestr.swift
int bIsSwift= sSwift != ""
If DokZakupu then
	sNazwaBanku=xDocument.bankName
	sKonto=xDocument.accountNo
	bIsSwift=0

endif
If ZamWlasne then
	sNazwaBanku=xKontrahent.NazwaBanku
	sKonto=xKontrahent.NumerRachunku
	bIsSwift=0
endif
string sNotatkaKontr=FormatNotatka(xKontrahent.Notatka)
string sNabywca = xKontr.KhNazwa
string sNabKodPocz = xKontr.KhPoczta
string sNabMiasto = xKontr.KhMiasto
string sNabAdres = xKontr.KhAdres

string sNabNip = xKontr.KhNip
string sNabKod = xKontr.KhKod
string sNabTel1=xKontrahent.Telefon1
string sNabTel2=xKontrahent.Telefon2
string sNabFax=xKontrahent.Fax
string sNabEMail=xKontrahent.Email
string sNabPesel=xKontrahent.Pesel
string sNabRegon=xKontrahent.Regon
string sNabKodPocz2 = xKontrahent.KodPocztowy2
string sNabMiasto2 = xKontrahent.Miejscowosc2
string sNabAdres2 = xKontrahent.Adres2
string sNabKrajNazwa = xKontrahent.kraj.nazwa

string sNab
	xKontr.Clear()
#ifndef ZAMOWIENIE
	xKontr=xDocument.DaneOd
#else
//	if ZMSTAT=="Zo" then
	xKontr=xDocument.DaneOd //Odbiorca
//	else
//		xKontr=xDocument.DaneKh //Dostawca
//	endif
#endif
	xKontrahent.Clear()
	if !(xKontrahent=GetObjById("BKontrahent",xKontr.Khid)) then XGetObjErr()

string sOdbiorca = xKontr.KhNazwa
string sOdbKodPocz = xKontr.KhPoczta
string sOdbMiasto = xKontr.KhMiasto
string sOdbAdres = xKontr.KhAdres
string sOdbTel1 = xKontrahent.Telefon1
string sOdbTel2 = xKontrahent.Telefon2
string sOdbFax = xKontrahent.fax
string sOdbEMail= xKontrahent.Email
string sOdbPesel=xKontrahent.Pesel
string sOdbRegon=xKontrahent.Regon
string sOdbKodPocz2 = xKontrahent.KodPocztowy2
string sOdbMiasto2 = xKontrahent.Miejscowosc2
string sOdbAdres2 = xKontrahent.Adres2
string sOdbKrajNazwa = xKontr.kraj.nazwa

//---------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
string sub fMiejsceWyst()


	if !(xDzial=GetObjByKod("BDzial",xDocument.Dzial.Kod)) then MiejsceWyst=xFirma.Miejscowosc : exit

	if xDzial.Miejscowosc then
		MiejsceWyst=xDzial.Miejscowosc
	else
		MiejsceWyst=xFirma.Miejscowosc
	endif
	if xDzial.wydruk then
	 	sFNazwa=xDocument.dzial.nazwa
 		sFKod=xDocument.dzial.kod
 		sFAdres=xDzial.Adres
 		sFKodPocz=xDzial.kodPocztowy
 		sFMiejsce=xDzial.miejscowosc
 		sFRejon=xDzial.Rejon
 		sFTel1=xDzial.Telefon1
 		sFTel2=xDzial.Telefon2
 		sFFax=xDzial.Fax
		sFEmail=xDzial.Email
	endif

	xDzial.Clear()
endsub

int sub Czy_PozycjeNP()
int i
	for i=1 to i>xPoz.Count()
		if !xPoz.item(i).niepodlega then czyPozPodlega=1
		if !xPoz.item(i).dokompletu then
			If ( xDocument.Charakter == 87 || xDocument.Charakter == 104 || xDocument.Charakter == 86 || xDocument.Charakter == 103 || xDocument.Charakter == 111 || xDocument.Charakter == 46 || xDocument.Charakter == 114 || xDocument.Charakter == 126 || xDocument.Charakter == 127 ) && xPoz.item( i ).NiePodlega Then CzyNP = 1 : Exit
			if !(xDocument.Charakter==87 || xDocument.Charakter==104 || xDocument.Charakter==86 || xDocument.Charakter==103 || xDocument.Charakter==111 || xDocument.Charakter==46 || xDocument.Charakter==114 ) && i>1 && xPoz.item(i).NiePodlega then CzyNP=1 : exit
		endif
	next i
endsub

int sub Kody_Paskowe(int nElem, string sKod)
	if !(xTowar=GetObjByKod("BTw",sKod)) then
        // nie udalo sie to bedzie bez kodu paskowego
        KodPaskowy_Pozycji(nElem)=""
    else
	    KodPaskowy_Pozycji(nElem)=xTowar.KodPaskowy
    endif

endsub

string sub DajPCN(int pozycja)
	if !(xTowar=GetObjByKod("BTw",xPoz.item(pozycja).kod)) then XGetObjErr()
	DajPCN=xTowar.PCN
endsub

int sub DajVat(int pozycja)
	if !(xTowar=GetObjByKod("BTowar",xPoz.item(pozycja).kod)) then XGetObjErr()
	DajVat=xTowar.stVAT.typ
endsub

string sub DajVatNazwe(int pozycja)
	if !(xTowar=GetObjByKod("BTowar",xPoz.item(pozycja).kod)) then XGetObjErr()
	DajVatNazwe=xTowar.stVAT.nazwa
endsub

string sub DajVatNazweZPozycji(int pozycja)
	if !(xTowar=GetObjByKod("BTowar",xPoz.item(pozycja).kod)) then XGetObjErr()
	DajVatNazweZPozycji=xPoz.item(pozycja).StVat.nazwa
endsub


float sub DajVatWartosc(int pozycja)
	if !(xTowar=GetObjByKod("BTowar",xPoz.item(pozycja).kod)) then XGetObjErr()
	DajVatWartosc=xTowar.stVAT.wartosc
endsub

float sub DajVatWartoscZPozycji(int pozycja)
	if !(xTowar=GetObjByKod("BTowar",xPoz.item(pozycja).kod)) then XGetObjErr()
	DajVatWartoscZPozycji=xPoz.item(pozycja).StVat.wartosc
endsub

//procedury standardowe - nie przewiduje sie zmian
int Sub CenyPozycji()
int i
int CzyImport = xDocument.CzyKopia
	grow Ceny, xPoz.Count()-1 : grow KodPaskowy_Pozycji, xPoz.Count()-1:grow CenyK, xPoz.Count()-1
	for i=1 to i>xPoz.Count()
		if !xPoz.item(i).dokompletu then
			if CZYNETTO then
				Ceny(i).CenaNettoWP=xPoz.item(i).Cena
				Ceny(i).CenaBruttoWP=xPoz.item(i).Cena+xPoz.item(i).StVat.wartosc*xPoz.item(i).Cena
			else
				Ceny(i).CenaBruttoWP=xPoz.item(i).Cena
				Ceny(i).CenaNettoWP=xPoz.item(i).Cena/(1+xPoz.item(i).StVat.wartosc)
			endif
			Ceny(i).PrzelJmDod=1
			// zdarzylo sie w nowym oknie, ze dokument mial Ilosc == 0 i IloscWP != 0
			if xPoz.item(i).Ilosc!=xPoz.item(i).IloscWP && Sign(xPoz.item(i).Ilosc) && Sign(xPoz.item(i).IloscWP) then
				Ceny(i).PrzelJmDod=xPoz.item(i).Ilosc/xPoz.item(i).IloscWP
				Ceny(i).CenaNetto=Ceny(i).CenaNettoWP/Ceny(i).PrzelJmDod
				Ceny(i).CenaBrutto=Ceny(i).CenaBruttoWP/Ceny(i).PrzelJmDod
			else
				Ceny(i).CenaNetto=Ceny(i).CenaNettoWP
				Ceny(i).CenaBrutto=Ceny(i).CenaBruttoWP
			endif
			if !ZamWlasne && !DokZakupu then
				if iTyp!=87 && iTyp!=104 then
					if !xDocument.CzyWalutowy then
						tot_wartbaza += xPoz.item(i).CenaCennikowa* iif(xPoz.item(i).JednostkaMiary==xPoz.Item(i).JednostkaMiaryWp,xPoz.item(i).Ilosc,xPoz.item(i).IloscWP)
					else
						tot_wartBaza+=(xPoz.item(i).CenaCennikowa*xDocument.Kurs)* iif(xPoz.item(i).JednostkaMiary==xPoz.Item(i).JednostkaMiaryWp,xPoz.item(i).Ilosc,xPoz.item(i).IloscWP)
					endif
				endif
			endif
			Kody_Paskowe(i,xPoz.item(i).Kod)
			ZbierzDostawy(i)//,xPoz.item(i).id)

            #ifdef ZALICZKA
			if iTyp == FZS && !bAnulowano && CzyImport == 0 then
				mIdPozycjaK.Set((using "%l",xPoz.item(i).Operacja.RozliczeniaZm.item(1).idDokumentu),i)
            endif
            if iTyp == FZS && !bAnulowano && CzyImport != 0 then
				message "Raport nie jest przeznaczony do wydruku faktur zaliczkowych zaimportowanych z oddziału."
                error ""
			endif
			#endif

		endif
	next i
	if !ZamWlasne then
		if Sign(tot_wartbaza) then
			if ( CZYNETTO || !VAT ) then
				if xDocument.Netto then
					fRabat = 100*(tot_wartbaza-(xDocument.Netto+xDocument.NiePodlega))/tot_wartbaza
				else
					fRabat = 100*(tot_wartbaza-xDocument.NiePodlega)/tot_wartbaza
				endif
			else
				fRabat = 100*(tot_wartbaza-(xDocument.Brutto+xDocument.NiePodlega))/tot_wartbaza
			endif
		endif
	endif
endsub

int sub Nalicz_NVB_NaPozycji()
int i,j
	for i=1 to i>xStawki.Count()
		if xStawki.item(i).StVat.Nazwa!="-" && xStawki.item(i).StVat.aktywny then
			if StawkiVat(size(StawkiVat)).Nazwa then grow StawkiVat, 1
			StawkiVat(size(StawkiVat)).Nazwa=xStawki.item(i).StVat.Nazwa
			StawkiVat(size(StawkiVat)).Netto=xStawki.item(i).Netto
			StawkiVat(size(StawkiVat)).Vat=xStawki.item(i).Vat
			StawkiVat(size(StawkiVat)).Brutto=xStawki.item(i).Brutto
    		StawkiVat(size(StawkiVat)).Wartosc=xStawki.item(i).StVat.Wartosc
			StawkiVat(size(StawkiVat)).NettoWal=xStawki.item(i).NettoWal
			StawkiVat(size(StawkiVat)).BruttoWal=xStawki.item(i).BruttoWal
		endif
	next i
endsub





string sub DajNIP( string NIP )
// funkcja zwraca "REGON: ","PESEL: ","NIP: "
// w zmiennej buf zwraca ciąg odpowiednich cyfr
	buf=NIP
	if find regular "{[rRpP]}/:{*$}" then
		Select Case regular 1
		Case "R","r"
			DajNip = "REGON: "
		Case "P","p"
			DajNip = "PESEL: "
		EndSelect
		NIP = regular 2
		buf = NIP
	else
		DajNIP="NIP: "
		buf = NIP
	endif
endsub

string sub DajNIPe( string NIP )
// funkcja zwraca "REGON: ","PESEL: ","VAT id no: "
// w zmiennej buf zwraca ciąg odpowiednich cyfr
	buf=NIP
	if find regular "{[rRpP]}/:{*$}" then
		Select Case regular 1
		Case "R","r"
			DajNIPe = "REGON: "
		Case "P","p"
			DajNIPe = "PESEL: "
		EndSelect
		NIP = regular 2
		buf = NIP
	else
		DajNIPe="VAT id no: "
		buf = NIP
	endif
endsub


//----------------------------------------------------------------------------------------------------------
//zmienne, funkcje, procedury wyszukujace okreslone dane, stopniowo zastepowane przez funkcje dzialajace na obiektach
//w momencie stworzenia wszystkich obiektow, caly ten kod powinien wyleciec



//int sub DajNotatkaKontrahenta(long id)
//endsub

int sub NotatkaDokumentu()
	string sRodzaj
	sNotatka=FormatNotatka(xDocument.Notatka)
#ifndef ZAMOWIENIE
			sRodzaj = IIF(DokZakupu, "BRodzajZk", "BRodzajSp")
#else
			sRodzaj = "BRodzaj"+ZMSTAT
#endif
	if dTMp=GetObjById(sRodzaj,xDocument.Rodzaj.id) then sNotatkaRodz=FormatNotatka(dTmp.Notatka)
	dTmp.Clear()
endsub



int Sub ZbierzDostawy(int lp)
int j,z,k, idx
int komplet
string sPom
dispatch xRez,xDw
dispatch xRoz,xPow
dispatch xOper
MapValue mIdOper
mIdOper.Type(Long)

if PrawaDoMg then
//dostawy z pozycji dokumentu handlowego
	xRez=xPoz.item(lp).Wlasciwosci.Rezerwacje
	komplet = xPoz.item(lp).komplet
	if komplet then
		idx = lp + 1
		while (idx <= xPoz.Count() && xPoz.item(idx).dokompletu)
			xRez=xPoz.item(idx).Wlasciwosci.Rezerwacje
			for j=1 to j>xRez.Count()
				if xRez.item(j).Typ==2 then
					xDw=xRez.item(j).Powiazania
					for z=1 to z>xDw.Count()
						if xDw.item(z).Ilosc then
							sPom=xDw.item(z).Dostawa+using "%d",lp
							if !mDostNameLp.Index(sPom) then
							mDostNameLp.Set(sPom,1)
							if Dostawy(size(Dostawy)).Nazwa then grow Dostawy, 1
							Dostawy(size(Dostawy)).Cena=xDw.item(z).Cena
							Dostawy(size(Dostawy)).Ilosc=xDw.item(z).Ilosc
							Dostawy(size(Dostawy)).Wartosc=xDw.item(z).Ilosc * xDw.item(z).Cena
							Dostawy(size(Dostawy)).Nazwa=xDw.item(z).Dostawa
							Dostawy(size(Dostawy)).lp=lp
							endif
						endif
					next z
				endif
			next j
		idx = idx + 1
		wend
	else
		for j=1 to j>xRez.Count()
			if xRez.item(j).Typ==2 then
				xDw=xRez.item(j).Powiazania
				for z=1 to z>xDw.Count()
					if xDw.item(z).Ilosc then
						sPom=xDw.item(z).Dostawa+using "%d",lp
						if !mDostNameLp.Index(sPom) then
						mDostNameLp.Set(sPom,1)
						if Dostawy(size(Dostawy)).Nazwa then grow Dostawy, 1
						Dostawy(size(Dostawy)).Cena=xDw.item(z).Cena
						Dostawy(size(Dostawy)).Ilosc=xDw.item(z).Ilosc
						Dostawy(size(Dostawy)).Wartosc=xDw.item(z).Ilosc * xDw.item(z).Cena
						Dostawy(size(Dostawy)).Nazwa=xDw.item(z).Dostawa
						Dostawy(size(Dostawy)).lp=lp
						endif
					endif
				next z
			endif
		next j
	endif

NieZamowienieLubKontraktSprzedazy = 0
#ifndef ZAMOWIENIE
	NieZamowienieLubKontraktSprzedazy = 1
#endif
#ifdef KONTRAKT_SPRZEDAZY
	NieZamowienieLubKontraktSprzedazy = 1
#endif
If NieZamowienieLubKontraktSprzedazy Then
//dostawy z powiazanej pozycji z dokumentów magazynowych
//for lp=1 to lp>xPoz.Count()
	xRoz=xPoz.item(lp).Operacja.RozliczeniaTw//kolekcja rozliczen
	komplet = xPoz.item(lp).komplet
	if komplet then
		idx = lp + 1
		while (idx <= xPoz.Count() && xPoz.item(idx).dokompletu)
			xRoz=xPoz.item(idx).Operacja.RozliczeniaTw//kolekcja rozliczen
			for j=1 to j>xRoz.Count()
				if !mIdOper.Index(using "%l",xRoz.item(j).IdOperacji) then
					mIdOper.Set((using "%l",xRoz.item(j).IdOperacji),1)
					if xOper then xOper.Clear()
					if (xOper=GetObjById("BOperacjaTw",xRoz.item(j).IdOperacji)) then
						if xOper.ownerbase==37 then
							k=mOwnerId_poz.Index(using "%l,suma",xOper.ownerid)
							mOwnerId_poz.Set((using "%l,suma",xOper.ownerid),IIF(k,mOwnerId_poz.Get(k)+1,1))
							mOwnerId_poz.Set((using "%l,%l",xOper.ownerid,mOwnerId_poz.Get((using "%l,suma",xOper.ownerid))),lp)
						endif
					endif
				endif
			next j
			idx = idx + 1
		wend
	else
		for j=1 to j>xRoz.Count()
			if !mIdOper.Index(using "%l",xRoz.item(j).IdOperacji) then
				mIdOper.Set((using "%l",xRoz.item(j).IdOperacji),1)
				if xOper then xOper.Clear()
				if (xOper=GetObjById("BOperacjaTw",xRoz.item(j).IdOperacji)) then
					if xOper.ownerbase==37 then
						k=mOwnerId_poz.Index(using "%l,suma",xOper.ownerid)
						mOwnerId_poz.Set((using "%l,suma",xOper.ownerid),IIF(k,mOwnerId_poz.Get(k)+1,1))
						mOwnerId_poz.Set((using "%l,%l",xOper.ownerid,mOwnerId_poz.Get((using "%l,suma",xOper.ownerid))),lp)
					endif
				endif
			endif
		next j
	endif
//next i
	xPow=xPoz.item(lp).Powiazania("BPowiazanieTw")
	komplet = xPoz.item(lp).komplet
	if komplet then
		idx = lp + 1
		while (idx <= xPoz.Count() && xPoz.item(idx).dokompletu)
			xPow=xPoz.item(idx).Powiazania("BPowiazanieTw")
			for j=1 to j>xPow.Count
				if !(mOwnerId_dok.Index(using "%l",xPow.item(j).ownerid)) then
					mOwnerId_dok.Set((using "%l",xPow.item(j).ownerid),1)
				endif
			next j
			idx = idx + 1
		wend
	else
		for j=1 to j>xPow.Count
			if !(mOwnerId_dok.Index(using "%l",xPow.item(j).ownerid)) then
				mOwnerId_dok.Set((using "%l",xPow.item(j).ownerid),1)
			endif
		next j
	endif
endif
	nDostawy=size(Dostawy)
endif
endsub

int sub ZbierzDostawy2()

int i,j,k,indeks,zz
string sPom
dispatch xMg
dispatch xMz
dispatch xDw
if PrawaDoMg then
for j=1 to j>mOwnerId_dok.size()
		if xMg then xMg.Clear()
		if(xMg=GetObjById("BDokumentMg",Val(mOwnerId_dok.GetKey(j))) )then
				xMz=xMg.Pozycje
				for k=1 to k>xMz.Count()
					if (indeks=mOwnerId_poz.Index(using "%l,suma",xMz.item(k).id)) then
						xDw=xMz.item(k).Wlasciwosci.Dostawy
						for zz=1 to zz>xDw.Count()
							if xDw.item(zz).Ilosc then
								for i=1 to i>mOwnerId_poz.Get(indeks)
									sPom=xDw.item(zz).Dostawa+using "%d",mOwnerId_poz.Get(i+indeks)
									if !mDostNameLp.Index(sPom) then
									mDostNameLp.Set(sPom,1)
									if Dostawy(size(Dostawy)).Nazwa then grow Dostawy, 1
									Dostawy(size(Dostawy)).Cena=xDw.item(zz).Cena
									Dostawy(size(Dostawy)).Ilosc=xDw.item(zz).Ilosc
									Dostawy(size(Dostawy)).Wartosc=xDw.item(zz).Ilosc * xDw.item(zz).Cena
									Dostawy(size(Dostawy)).Nazwa=xDw.item(zz).Dostawa
									Dostawy(size(Dostawy)).lp=mOwnerId_poz.Get(i+indeks)
									endif
								next i
							endif
						next zz
					endif
				next k
		endif

next j
nDostawy=size(Dostawy)
endif
endsub

	//////////////////////////////////////////////////////////////////////


int sub Wyd()
dispatch xWZ
int i=1
int wyjdz=0,wydlabel=0
	xPow=xDocument.PowiazaneDk
while i<=xPow.count() && !wyjdz
	if wydlabel && xPow.item(i).typ!=2 && xPow.item(i).dkBase == 33 then
		if xWZ=GetObjById("BDokumentMg",xPow.item(i).dkid) then
			if xWZ.czyWystawiony != 0 then
				if Wydania(size(Wydania)).Nazwa then grow Wydania, 1
					Wydania(size(Wydania)).Nazwa=xWZ.Numer
					//nie wiem czy uzyc datatransakcji czy wczytrac dokument i stamtad wziac date
					Wydania(size(Wydania)).Data_Wyd=xWZ.DataOperacji
				endif
			endif
	else
		if xPow.item(i).typ==2  then
			if wydlabel then
				wyjdz=1
			else
#ifdef PNABYWCE
				if xPow.item(i).nazwa=="PRZYJĘCIA" || xPow.item(i).subtyp==12 then wydlabel=1
#else
				if xPow.item(i).nazwa=="WYDANIA" || xPow.item(i).subtyp==12 then wydlabel=1
#endif
			endif
		endif
	endif
	i+=1
wend

endsub

int sub Plat(int bAktualny)
	int i
	dispatch xPn
	string dataPn

#ifndef ZAMOWIENIE
if iTyp != SKO && iTyp != SKW then
	if !BUFOR then
	fWplaty=fWPlatyWal=0 //fDozaplaty=fDozaplatyWal=0
	shrink Platnosci,-1
	shrink plData,-1
	ClearPlatWal()
	Platnosci(1)=""
	grow Platnosci,2

	if xPlat=xDocument.Rozrachunek then
			for i=1 to i>xPlat.RozliczeniaPn.Count()
				if xPlat.RozliczeniaPn.item(i).CzyRozliczenieZFK then
					dataPn = xPlat.RozliczeniaPn.item(i).dataSecPn
				else
					if xPn then xPn.Clear()
					xPn=GetObjById("BDokumentPn",xPlat.RozliczeniaPn.item(i).idSecPn)
					dataPn = xPn.data_Platnosci
				endif
				if bAktualny || dataPn <= xDocument.DataWystawienia  then
					if Platnosci(size(Platnosci)) then grow platnosci, 3:grow plData,1
					AddPlatWal(xPlat.RozliczeniaPn.item(i).walutasecpn, xPlat.RozliczeniaPn.item(i).wartosc, xPlat.RozliczeniaPn.item(i).wartoscsecpn)
					Platnosci(size(Platnosci)-2)=xPlat.RozliczeniaPn.item(i).numerSecPn
					Platnosci(size(Platnosci)-1)=xPlat.RozliczeniaPn.item(i).dataSecPn
					plData(size(plData))=xPlat.RozliczeniaPn.item(i).Data
					Platnosci(size(Platnosci))=Kwota(xPlat.RozliczeniaPn.item(i).WartoscPLN)
					fWplaty+=xPlat.RozliczeniaPn.item(i).WartoscPLN
					fWplatyWal+=xPlat.RozliczeniaPn.item(i).Wartosc
				endif
			next i
			if !xPlat.waluta then
				CzyRozrWal=0
				fWplatyWal=round(fWplatyWal/fKurs,2)
				fDoZaplaty=xDocument.rzeczywistaWysokoscNaleznosci
				fDoZaplatyWal=round(fDoZaplaty/fkurs,2)
			else
				CzyRozrWal=1
				fDoZaplatyWal=xDocument.rzeczywistaWysokoscNaleznosci
				fDoZaplaty=round(fDoZaplatyWal*fkurs,2)
			endif
		endif

	endif
endif
#endif
endsub
//-----------------------------------------------------------------------------------------------------------
if iTyp!=FWS && iTyp!=WKS then
	sNapis = arg9
else
		sNapis=""
endif
float sub ObliczAkcyze()
	dispatch xTwPoz
	String kalkakcwal
	Float kalkakc
	float tot_akcyza = 0
	int i

	for i= 1 to i>xPoz.Count()
	xTwPoz=xPoz.item(i).wlasciwosci.towar
	if xTwPoz.id && tot_akcyza != -1 && !xTwPoz.typ then
		if !xPoz.item(i).operacja.rozliczonaIlosciowo then
			tot_akcyza = -1
		else
			if xTwAkcyza then xTwAkcyza.Clear()
			if (xTwAkcyza=GetObjById("BTowar",xTwPoz.id)) then
				kalkakcwal=xTwAkcyza.kalkakc.waluta
				kalkakc=xTwAkcyza.kalkakc.cena
				if !kalkakcwal then
					tot_akcyza += iif(xPoz.item(i).Ilosc!=xPoz.item(i).IloscWP,xPoz.item(i).IloscWP,xPoz.item(i).Ilosc)*kalkakc
				else
					if kalkakcwal ==  "%" then
						kalkakc/=100
						tot_akcyza += xPoz.item(i).operacja.wartosc*kalkakc
					else
						tot_akcyza += KursWaluty(kalkakcwal)*iif(xPoz.item(i).Ilosc!=xPoz.item(i).IloscWP,xPoz.item(i).IloscWP,xPoz.item(i).Ilosc)*kalkakc
					endif
				endif
			endif
		endif
	endif
	next i
	ObliczAkcyze=tot_akcyza
endsub

int drukuj

#ifndef ZAMOWIENIE
drukuj = 1
#else
drukuj = 0
#endif

//#ifndef ZAMOWIENIE
	if drukuj then Wyd()
//#endif

	NotatkaDokumentu()
	Czy_PozycjeNP()
	CenyPozycji()

NieZamowienieLubKontraktSprzedazy = 0
#ifndef ZAMOWIENIE
	NieZamowienieLubKontraktSprzedazy = 1
#endif
#ifdef KONTRAKT_SPRZEDAZY
	NieZamowienieLubKontraktSprzedazy = 1
#endif
If NieZamowienieLubKontraktSprzedazy Then
	if mOwnerId_dok.size() && mOwnerId_poz.size() then ZbierzDostawy2()
EndIf
	Nalicz_NVB_NaPozycji() //rozbija netto vat brutto na poszczegolne stawki
	fMiejsceWyst()
	Plat(1)
