//"intepnfk.sci","Integracja PN do FK - include","\Integracja z FK a\",0,1.0.1,SYSTEM
/////////////////////////////////////////
// "Integracja PN do FK - include"
// intepnfk.sci
/////////////////////////////////////////

#define PNtypPLAT			"2"
#define PNtypPLATROZL		"3"

#define KARTA				"0"
#define KARTAkhRODZ_PN		"104"
#define KARTAkhPRACOWNIK    "106"
#define KARTAkhURZAD        "107"

string sOpisPom

int Sub IntegrPN(long idDK)

	IntegrPN = 0
	int err
	int iRok, typKh
    long khid
	Dispatch xTypDokumentuPn
	Dispatch xRejestr
    Dispatch xZestParamsPn=xFactory.NewObject("BZestParamsPn")
    Dispatch xZestRapPn = xFactory.NewObject("BZestPnRap")
    Dispatch xIntegracja = xFactory.GetObject("BIntegracjaFK")
	Dispatch xTmp, xItems

	xRapPn = xRapPnMan.Give(using "id=%d",idDK)

	iRok = dbd.firmainfo.GetRokByDate(xRapPn.data)
	if RokFK(1).Zap == 1 then

		if RokFK(1).IdRok != iRok then
			UstawRok(iRok)
		endif

	else
		UstawRok(iRok)
	endif

	dst=RokFK(1).Rok
	plkn=RokFK(1).PlanKont
	defdok=RokFK(1).DefDokument
	rozrDokument=RokFK(1).RokDokumentRoz

	xRejestr = GetObjById("BRejestr", xRapPn.rejestr.id)
	if !xRejestr then  Error "Brak takiego rekordu"

	xTypDokumentuPn = GetObjById("BTypDokumentuPn", xRapPn.typDokumentu.id)
	if !xTypDokumentuPn then  Error "Brak takiego rekordu"

	IntegrPN = CzyIntegrBrakTypDK(xTypDokumentuPn.symbolFK, xRapPn.numer, idDK, xTypDokumentuPn.skrot)
	if IntegrPN then exit

	xZestParamsPn.id = idDK
    xZestRapPn.Load(xZestParamsPn)
    int IngegrPNKH = 0

    if (xZestRapPn.Count) then
        xItems = xZestRapPn.item(1)
        nCount = xItems.Count
        for i=1 to i>nCount
            xTmp = xItems.item(i)
            khid = xTmp.idkh
			typKh = xTmp.typKH

			if -1 != khid then
				select case typKh
					case KHtypKH
						xKh = GetObjById("BKontrahent", khid)
						if !xKh then AddError("Brak takiego kontrahenta w bazie",idDK)
					case KHtypPR
						xKh = GetObjById("BPracownik", khid)
						if !xKh then AddError("Brak takiego pracownika w bazie",idDK)
					case KHtypUR
						xKh = GetObjById("BUrzad", khid)
						if !xKh then AddError("Brak takiego urzędu w bazie",idDK)
				endselect
			
				if ( xKh && 1 != xIntegracja.trybWspolpracy && 4 != xIntegracja.trybWspolpracy) then
				    IntegrPN = CzyIntegrBrakIDFK(val(xKh.identyfikatorFK), xTmp.dokument, idDK, typKh)	
                    if IntegrPN then IngegrPNKH = IntegrPN
				endif
			endif
		next i
	endif
    if IngegrPNKH then IntegrPN = IngegrPNKH
    if IntegrPN then exit

   	dst.Clear()
	sOpisy=0
	sOpisPom=Using "rejestr %s za dzień %s", xRejestr.kod, xRapPn.data
	dbd.CurrentDate = sDataWpr
	dst.Value("DataDok") = xRapPn.data
//	dst.Value("DataOkr") = xRapPn.data
	dst.Value("DataOper") = xRapPn.data
	dst.Value("Datawpl") = Data()
	dst.Value("Datawpr") = sDataWpr
	dst.Value("Kwota") = Round( (xRapPn.wplaty+xRapPn.wyplaty),2 )
	dst.Value("saldopoczrk") = Round( xRapPn.otwarcie,2 )
	dst.Value("saldozaprk") = Round( (xRapPn.wplaty-xRapPn.wyplaty),2 )
	dst.Value("skrot") = xTypDokumentuPn.symbolFK
	if xRejestr.kontoFK != "" then KontoKasy = xRejestr.kontoFK

	//////////////////////////////////////////////////////
	// numer dokumentu w FK
	dst.Value("nazwa") = xRapPn.numer

	xDekretacjeRapPn.Clear()
	xDekretParams = xDekretacjeRapPn.Params()
	xDekretParams.id=xRapPn.id
	xDekretacjeRapPn.Dekret(xDekretParams)
	dst.Value("tresc")	= sOpisPom
	ZapiszZAP(xDekretacjeRapPn, 0, 0,0,xRapPn.data, IIF(xTypDokumentuPn.TypFK == "WB", 2, 3), "",0, 0)

	dst.Validate()
	if (ers.Count) then IntegrPN = ShowError( "Raport płatności "+xRapPn.numer)
	if IntegrPN == 0 then IntegrPN = !dst.Insert()
	ShowStatus(xRapPn.numer,idDK, IntegrPN)

EndSub

// zbiorcze

record Dokument
	long idRejestr
	long IDDK
	string termin[11]
endrec

record ZapisRejRec
	long idRejestr
	string strNazwa[41]
	string strDataOd[11]
	string strDataDo[11]
	float dKwota
	float dSaldoPRK
	float dSaldoZRK
	string strSkrot[3]
	string strObslJak[7]
	string strSymbolFK[41]
	string strKonto[41]
	string strKod[41]
endrec

ZapisRejRec ZapisRejTab(1)
Dokument dok(1)



int Sub IntegrPN_zb_begin()

Shrink ZapisRejTab, -1
Shrink dok, -1

EndSub


int Sub IntegrPN_zb_do(long idDK)

	IntegrPN_zb_do = 0

	int err
	int index, typKh
    long khid
	Dispatch xTypDokumentuPn
	Dispatch xRejestr
    Dispatch xZestParamsPn=xFactory.NewObject("BZestParamsPn")
    Dispatch xZestRapPn = xFactory.NewObject("BZestPnRap")
    Dispatch xIntegracja = xFactory.GetObject("BIntegracjaFK")
	Dispatch xTmp, xItems

	xRapPn = xRapPnMan.Give(using "id=%d",idDK)

	xRejestr = GetObjById("BRejestr", xRapPn.rejestr.id)
	if !xRejestr then  Error "Brak takiego rekordu"

    xZestParamsPn.id = idDK
    xZestRapPn.Load(xZestParamsPn)
    int IngegrPNKH = 0

    if (xZestRapPn.Count) then
        xItems = xZestRapPn.item(1)
        nCount = xItems.Count
        for i=1 to i>nCount
            xTmp = xItems.item(i)
            khid = xTmp.idkh
			typKh = xTmp.typKH

			if -1 != khid then
				select case typKh
					case KHtypKH
						xKh = GetObjById("BKontrahent", khid)
						if !xKh then AddError("Brak takiego kontrahenta w bazie",idDK)
					case KHtypPR
						xKh = GetObjById("BPracownik", khid)
						if !xKh then AddError("Brak takiego pracownika w bazie",idDK)
					case KHtypUR
						xKh = GetObjById("BUrzad", khid)
						if !xKh then AddError("Brak takiego urzędu w bazie",idDK)
				endselect
			
				if ( xKh && 1 != xIntegracja.trybWspolpracy && 4 != xIntegracja.trybWspolpracy) then
				    IntegrPN_zb_do = CzyIntegrBrakIDFK(val(xKh.identyfikatorFK), xTmp.dokument, idDK, typKh)	
                    if IntegrPN_zb_do then IngegrPNKH = IntegrPN_zb_do
				endif
			endif
		next i
	endif
    if IngegrPNKH then IntegrPN_zb_do = IngegrPNKH
    if IntegrPN_zb_do then exit

	index = 1
	while index < Size(ZapisRejTab) && ZapisRejTab(index).idRejestr != xRejestr.id
		index += 1
	wend

	if index == Size(ZapisRejTab) then
		// dopisujemy nowy element do tablicy

		xTypDokumentuPn = GetObjById("BTypDokumentuPn", xRapPn.typDokumentu.id)
		if !xTypDokumentuPn then  Error "Brak takiego rekordu"

		ZapisRejTab(index).idRejestr = xRejestr.id
		ZapisRejTab(index).strNazwa = xRejestr.kod
		ZapisRejTab(index).strDataOd = xRapPn.data
		ZapisRejTab(index).strDataDo = xRapPn.data
		ZapisRejTab(index).dKwota = xRapPn.wplaty + xRapPn.wyplaty
		ZapisRejTab(index).dSaldoPRK = xRapPn.otwarcie
		ZapisRejTab(index).dSaldoZRK = xRapPn.wplaty - xRapPn.wyplaty
		ZapisRejTab(index).strSkrot =	xTypDokumentuPn.skrot
		ZapisRejTab(index).strObslJak =	xTypDokumentuPn.typFK
		ZapisRejTab(index).strSymbolFK = xTypDokumentuPn.symbolFK
		// !!! kontoFK
		ZapisRejTab(index).strKonto	= xRejestr.kontoFK
		ZapisRejTab(index).strKod = xRapPn.numer
		dok(size(dok)).idRejestr = xRejestr.id
		dok(size(dok)).IDDK=idDK
		dok(size(dok)).termin=xRapPn.data

		Grow dok, 1
		Grow ZapisRejTab, 1 // zwiększamy dla zachowania zasady
	else
		// dodajemy do istniejącego elementu

		if xRapPn.data < ZapisRejTab(index).strDataOd then
			ZapisRejTab(index).strDataOd = xRapPn.data
			ZapisRejTab(index).dSaldoPRK = xRapPn.otwarcie
		endif
		if xRapPn.data > ZapisRejTab(index).strDataDo then
			ZapisRejTab(index).strDataDo = xRapPn.data
		endif
		ZapisRejTab(index).dKwota += xRapPn.wplaty + xRapPn.wyplaty
		ZapisRejTab(index).dSaldoZRK += xRapPn.wplaty - xRapPn.wyplaty
		dok(size(dok)).idRejestr = ZapisRejTab(index).idRejestr
		dok(size(dok)).IDDK=idDK
		dok(size(dok)).termin=xRapPn.data

		Grow dok, 1
	endif

EndSub


int Sub IntegrPN_zb_end()
	int index1
	int index2

	IntegrPN_zb_end=0

	index1 = 1
	while index1 < Size(ZapisRejTab) && IntegrPN_zb_end != -6000
		if ZapisRejTab(index1).strDataOd != ZapisRejTab(index1).strDataDo then
			sOpisPom=Using "rejestr %s za dni od %s do %s", ZapisRejTab(index1).strNazwa, ZapisRejTab(index1).strDataOd, ZapisRejTab(index1).strDataDo
		else
			sOpisPom=Using "rejestr %s za dzień %s", ZapisRejTab(index1).strNazwa, ZapisRejTab(index1).strDataOd
		endif

		sukces=0
		for i=1 to i>size(RokFK)
			if RokFK(i).IdRok == dbd.firmainfo.GetRokByDate(ZapisRejTab(index1).strDataOd) && RokFK(i).Zap == 1 then sukces=i
		next i
		if sukces then
			dst=RokFK(sukces).Rok
			plkn=RokFK(sukces).PlanKont
			defdok=RokFK(sukces).DefDokument
		else
			if !(size(RokFK)==1 && RokFk(1).Zap == 0) then grow RokFK, 1
			sParam = using "%d;BUFOR", dbd.firmainfo.GetRokByDate(ZapisRejTab(index1).strDataOd)
			RokFK(size(RokFK)).Rok.Create(ObjectFK(".PDokument"))
			RokFK(size(RokFK)).Rok.Open(sParam,dbd)

			sParam = using "%d", dbd.firmainfo.GetRokByDate(ZapisRejTab(index1).strDataOd)
			RokFK(size(RokFK)).PlanKont.Create(ObjectFK(".PlanKont"))
			RokFK(size(RokFK)).PlanKont.Open(sParam,dbd)
			if !RokFK(size(RokFK)).PlanKont.MoveFirst() then
				AddError("Brak planu kont.",0)
			endif

			RokFK(size(RokFK)).DefDokument.Create(ObjectFK(".DefDokum"))
			RokFK(size(RokFK)).DefDokument.Open(sParam,dbd)
			RokFK(size(RokFK)).IdRok=dbd.firmainfo.GetRokByDate(ZapisRejTab(index1).strDataOd)
			RokFK(size(RokFK)).Zap=1

			dst = RokFK(size(RokFK)).Rok
			plkn = RokFK(size(RokFK)).PlanKont
			defdok = RokFK(size(RokFK)).DefDokument
		endif

		IntegrPN_zb_end = CzyIntegrBrakTypDK(ZapisRejTab(index1).strsymbolfk, "Dokument zbiorczy", 0, ZapisRejTab(index1).strSkrot)
		if !IntegrPN_zb_end then

			dst.Clear()
			sOpisy=0
			dbd.CurrentDate = sDataWpr
			dst.Value("DataDok") = ZapisRejTab(index1).strDataOd
//			dst.Value("DataOkr") = ZapisRejTab(index1).strDataOd
			dst.Value("DataOper") = ZapisRejTab(index1).strDataOd
			dst.Value("Datawpl") = Data()
			dst.Value("Datawpr") = sDataWpr
			dst.Value("Kwota") = Round( ZapisRejTab(index1).dKwota,2 )
			dst.Value("sygnatura") = xFactory.uzytkownik.kod
			dst.Value("saldopoczrk") = Round( ZapisRejTab(index1).dSaldoPRK,2 )
			dst.Value("saldozaprk") = Round( ZapisRejTab(index1).dSaldoZRK,2 )
			dst.Value("skrot") = ZapisRejTab(index1).strsymbolfk

			if ZapisRejTab(index1).strKonto != "" then KontoKasy = 	ZapisRejTab(index1).strKonto
			dst.Value("nazwa") = ZapisRejTab(index1).strNazwa
			dst.Value("tresc")	= sOpisPom
			index2=1
			nLastZap=0

			xDekretacjeRapPn.Clear()
			while index2 < Size(dok)
				if dok(index2).idRejestr == ZapisRejTab(index1).idRejestr then
					xDekretParams = xDekretacjeRapPn.Params()
					xDekretParams.id=dok(index2).idDK
					xDekretParams.Dodaj = 1
					xDekretacjeRapPn.Dekret(xDekretParams)
				endif
				index2 += 1
			wend
			ZapiszZAP(xDekretacjeRapPn, 0, 0,0,dok(index2).termin, IIF(ZapisRejTab(index1).strObslJak == "WB", 2, 3), "",0, 0)


			dst.Validate()

			if (ers.Count) then IntegrPN_zb_end = ShowError("Raport zbiorczy")
			if IntegrPN_zb_end == 0 then IntegrPN_zb_end = !dst.Insert()
			ShowStatus("Dokument zbiorczy",0, IntegrPN_zb_end)
		endif
		index1 += 1
	wend
EndSub

int Sub BeginProcessPN()
	if iRaportZbiorczy then IntegrPN_zb_begin()
EndSub

int Sub DoProcessPN(long idDK)
	DoProcessPN = 0
	rozUidStrona = 0
	int iVal
	xRapPn = xRapPnMan.Give(using "id=%d",idDK)

	if ( iNieIntegrOznak && xRapPn.czyWyekspFK ) then
		DoProcessPN = 1 // pomijamy
			AddError("Nie można powtórnie wysłać raportu " + xRapPn.numer + ".",idDK)
		Exit // nie wysylamy oznakowanych raportów
	endif

	if iRaportZbiorczy then
		if IntegrPN_zb_do(idDK) then
			DoProcessPN = 1 // pomijamy
			Exit
		endif
	else
		DoProcessPN = IntegrPN(idDK)
		if DoProcessPN then	Exit //pomijamy
	endif

	/////////////////////////////////////////////////
	// oznaczamy wyslany dokument
	if ( iOznaczaj && !iRaportZbiorczy) then
		xRapPn = xRapPnMan.Give(using "id=%d",idDK)

		xRapPn.SetEkspFK()
	endif
EndSub

int Sub EndProcessPN()

	int index = 1
	int err

	if iRaportZbiorczy then

		err = IntegrPN_zb_end()

		if ( !err && iOznaczaj ) then
			while index < Size(dok)
				xRapPn = xRapPnMan.Give(using "id=%d", dok(index).idDK)

				xRapPn.SetEkspFK()

				index += 1
			wend
		endif
	endif

EndSub