// ==============================================

// Erstelldatum : 12.07.2019 01:50:36

// Ersteller : arewa

// Eingerichtet von/am : AREWA

// Beschreibung : Feldmakro Lieferant  

// Version 1.0 vom 12.07.2019

// Version 2.0 vom 12.07.2020

// Version 3.0 vom 12.10.2022 mit konditionen

// Version 3.1 vom 20.01.2023 ohne FibuMacroObject für bmd.com + matchcode setzen bei kdlf

// Version 3.2 vom 13.03.2023 no BMD_CRLF

// Version 3.3 vom 25.04.2023 do_show_kdlf geht wieder

// Version 3.4 vom 10.05.2023 logging print dump_logfile 

// Version 3.5 vom 30.08.2023 no exec_sql

// Version 3.6 vom 02.11.2023 import kdlf file handle + unique file + delete

// Version 3.7 vom 23.11.2023 disable VorerfassenModel.SetValue('MCA_VEB_UIDNR', per_uidnr);

// Version 3.8 vom 08.12.2023 firmengruppen

// Version 3.9 vom 01.02.2024 update person auch wenn iban, zahlsperre

// Version 3.10 vom 21.11.2024 take lowest personenkreis

// Version 3.11 vom 19.12.2022 kontoinhaber, zahlsperre2

// ==============================================



Var

	FirmenNr :String;

	FibuNr :String;

	BS :String;  

	kdlf_string :String;

	vorerf_typ: Integer;

	VorerfassenModel :MacroObject;

	do_show_kdlf: Integer;

	do_modify_buchungstext: Integer;	

	do_auth: Integer;   

	created_list: MacroObject;

	fh_bmd_log: TBMDInt;



//------------------------------------------------------------------------------

// Parameter festlegen - Kunde/Lieferant nach Änderung anzeigen JA/NEIN

//------------------------------------------------------------------------------



function initParams;

begin

	do_show_kdlf := 1;	      // 1: anzeigen, 0: nicht anzeigen

	do_auth := 0;		   // 1: Steuerung über FWF_FREIFELDA01_50, 0: makro immer aktiv

	do_modify_buchungstext := 1;    // 1: buchungstext ändern auf Name des Lieferanten/Kunden

end;



// ================================================================================

// ================================================================================



function get_auth  (FirmenNr: String; FibuNr: String);

begin



	Result := 15;

	if not do_auth then begin

		exit;

	end;



	//BMD_FirmenwerteFibu := FibuMacroObject.CreateFMacroFirmenwerteFibu('eindeutige FirmenwerteFibuObj-ID');

	//BMD_FirmenwerteFibu.Load(FirmenNr, FibuNr);

	//Result := BMD_TEXTTONUMDEF (BMD_FirmenwerteFibu.GetValue('MCA_FWF_FREIFELDA01_50'))



	sqlText := 'SELECT FWF_FREIFELDA01_50

		FROM FIBU.FWF_FIRMENWERTEFIBU

		WHERE 

			FWF_FIRMENNR = :firmennr

			AND FWF_FIBUNR = :fibunr';



	iQuery  := MacroObject.CreateMacroQuery('fetch_fwf_freifeld');

	iQuery.setSQLText (sqlText);

	iQuery.setParamAsString('firmennr', FirmenNr);

	iQuery.setParamAsString('fibunr', FibuNr);

	iQuery.Open();





	if (iQuery.RecordCount() > 0) then begin

		Result := BMD_TEXTTONUMDEF (iQuery.getAsString ('FWF_FREIFELDA01_50'));

	end;



	iQuery.close();

end;



// ================================================================================  



procedure  fetch_json (var json_string, json_learned, fibunr, name, zusatzname, addresse, ort, plz, land_id, uid, uid_status, iban1, iban2, iban3, uid_datum, kondition, zahlsperre, account_holder);

begin





	json := MacroObject.CreateMacroJsonVal();

	json.ParseJson(json_string);



	if json.KeyExists ('N1') then begin

		name    := json.GetValueAsString('N1');

	end;

	if json.KeyExists ('N2') then begin

		zusatzname    := json.GetValueAsString('N2');

	end;

	if json.KeyExists ('A') then begin

		addresse    := json.GetValueAsString('A');

	end;

	if json.KeyExists ('H') then begin

		account_holder	:= json.GetValueAsString('H');

	end;  

	if json.KeyExists ('C') then begin

		ort    := json.GetValueAsString('C');

	end;

	if json.KeyExists ('P') then begin

		plz    := json.GetValueAsString('P');

	end;

	if json.KeyExists ('CC') then begin

		land_id    := json.GetValueAsString('CC');

	end;

	if json.KeyExists ('U') then begin

		uid_status    := json.GetValueAsString('U');

	end;

	if json.KeyExists ('TS') then begin

		uid_timestamp    := json.GetValueAsString('TS');

	end;

	if json.KeyExists ('I1') then begin

		iban1    := json.GetValueAsString('I1');

	end;

	if json.KeyExists ('I2') then begin

		iban2    := json.GetValueAsString('I2');

	end;

	if json.KeyExists ('I3') then begin

		iban3    := json.GetValueAsString('I3');

	end;

	if json.KeyExists ('Z') then begin

		zahlsperre    := json.GetValueAsString('Z');

	end;

	if json.KeyExists ('KD') then begin

		kondition    := json.GetValueAsString('KD');

	end;

	else begin

		kondition := '0';

	end;





	if (uid_status = '1') then begin

		uid_datum := uid_timestamp;

		uid_status := 'GÜLTIG, geprüft am ' + uid_timestamp;

	end;

	else if (uid_status = '4') then begin

		uid_status := 'UNGÜLTIG';

	end

	else if (BMD_LEN (uid_status) > 0) then begin	   // nur wenn es einen status gibt

		uid_status := 'NICHT GEPRÜFT';

	end;



	json.ParseJson(json_learned);



	if json.KeyExists ('U') then begin

		uid    := json.GetValueAsString('U');

	end;

end;



// ================================================================================



function show_kdlf  (FirmenNr: String; FibuNr: String; personenid: String);

begin

	if do_show_kdlf = 1 then begin

	

		lParams := 'STP_CUS_COMPANYNO=' + FirmenNr + ',STP_CUS_CUSTOMERID=' + personenid;  

		

		if vorerf_typ = 3 then begin	    // ER

			lParams := lParams + ',KLI_ISTLIEFERANT=1';

		end;

	

		BMD_STARTFUNCTION('MCS_MDKUNDE_EDIT_CREATE',lParams);   

	end;



end;       



// ================================================================================											  



function get_next_free_kdlf_nummer (FirmenNr: String; buchsymbol: String; FibuNr: String);

begin



	iQuery  := MacroObject.CreateMacroQuery('fetch_nummernkreis');



	sqlText := 'SELECT PNK_FIRMENKATEGORIELFDNR, PNK_VONNR, PNK_BISNR

		FROM BUERO.PNK_PERSONNUMMERNKREIS

		INNER JOIN FIBU.VBV_VORERFASSBUCH on VBV_FIRMENNR = PNK_FIRMENNR and VBV_FIBUNR=:fibunr and VBV_BUS_BUCHSYMSYMBOL=:buchsymbol

		WHERE 

			PNK_FIRMENNR = :firmennr

			AND PNK_PERSONKZNR = iif (VBV_VORERFASSTYP = 4, 1, iif (VBV_VORERFASSTYP = 3, 2, 99999))

		ORDER BY PNK_FIRMENKATEGORIELFDNR';



		// WHERE PNK_FIRMENKATEGORIELFDNR=1



	iQuery  := MacroObject.CreateMacroQuery('fetch_kreise');

	iQuery.setSQLText (sqlText);

	iQuery.setParamAsString('firmennr', Firmennr);

	iQuery.setParamAsString('fibunr', FibuNr);

	iQuery.setParamAsString('buchsymbol', buchsymbol);

	iQuery.Open();





	if (iQuery.RecordCount() > 0) then begin



		from_konto    := iQuery.getAsString('PNK_VONNR');

		to_konto    := iQuery.getAsString('PNK_BISNR');

		iQuery.close();



		sqlText :=  'SELECT min(P.PER_PERSONENNR)+1 as MIN_NR 

				FROM BUERO.PER_PERSON P 

			WHERE 

				P.PER_PERSONENNR between :from and :to 

				and not exists (select 1 from BUERO.PER_PERSON C, BUERO.KLI_KUNDE_LIEFERANT A 

			WHERE 

				C.PER_PERSONENNR = P.PER_PERSONENNR+1 

				AND C.PER_FIRMENNR in (

					SELECT FIG_FIRMENNR

					FROM BUERO.FIG_FIRMENGRUPPENZU A

					WHERE

						A.FIG_GRUPPE_FIRMENNR = (select B.FIG_GRUPPE_FIRMENNR FROM BUERO.FIG_FIRMENGRUPPENZU B WHERE B.FIG_FIRMENNR = :firmennr)

                                                union select :firmennr

                                        )

				AND C.PER_PERSONENART = ''KL'' 

				AND C.PER_JAHR >= 0 

				AND C.PER_ISTAKTUELLUNTERNR >= 1 

				AND A.KLI_FIRMENNR = C.PER_FIRMENNR 

				AND A.KLI_KLID = C.PER_PERSONENID 

				AND A.KLI_KLUNTERNR = C.PER_PERSONUNTERNR)';



		iQuery  := MacroObject.CreateMacroQuery('next_nummer');

		iQuery.setSQLText (sqlText);

		iQuery.setParamAsString('firmennr', Firmennr);

		iQuery.setParamAsString('from', from_konto);

		iQuery.setParamAsString('to', to_konto);

		iQuery.Open();



		if (iQuery.RecordCount() > 0) then begin



			next_kdlf    := iQuery.getAsString('MIN_NR');

			iQuery.close();

			Result := next_kdlf;

		end;

	end;

end;



// ================================================================================



procedure get_KDLF (var personenid, kontonr, uid, uid_datum, name, zusatzname, strasse, plz, land_id, iban1,iban2,iban3, kondition, zahlsperre, account_holder);

begin



	Result := '';



	personenid := '';



	sqlText := 'SELECT  

		PER_NAME as NAME,

		isnull (PER_ZUSATZNAME, '''')  as ZUSATZNAME,

		isnull (PER_UIDNR, '''')  as VATREGNO,

		PER_PERSONENID as PERSONENID,

		isnull (BAI_IBAN, '''')  as IBAN,

		isnull (BAI_KONTOINHABER, '''') as account_holder,

		isnull (ADR_STRASSE, '''')  as ADDRESSE,

		ADR_PLZ as PLZ,

		isnull (KOD_KONDLFDNR, 0) as KOND,

		isnull (LAN_ISO_CODE, ''AT'') as COUNTRY,

		isnull (iif (KTO_KONTENGRUPPE = 2, iif (isnull (KLI_HATZAHLSPERRE, 0) = 1, 1, PEK_KUN_ZAHLSPERRE), iif (isnull (KLI_HATZAHLSPERRE, 0) = 1, 1, PEK_LIE_ZAHLSPERRE)), 0) as ZAHLSPERRE

	FROM FIBU.PEK_PERSONENKONTO P1

		INNER JOIN BUERO.KLI_KUNDE_LIEFERANT KL ON KL.KLI_FIRMENNR = P1.PEK_FIRMENNR AND KL.KLI_KLID = P1.PEK_KLID

		INNER JOIN BUERO.PER_PERSON ON PER_FIRMENNR = PEK_FIRMENNR AND PER_PERSONENID = P1.PEK_KLID

		INNER JOIN FIBU.KTO_KONTO ON KTO_FIRMENNR = PEK_FIRMENNR AND KTO_FIBUNR = PEK_FIBUNR AND KTO_KONTONR = PEK_KONTONR

		INNER JOIN BUERO.ADR_ADRESSE ON ADR_FIRMENNR = PEK_FIRMENNR AND ADR_ADRESSLFDNR = PER_ADRESSLFDNR

		LEFT JOIN BUERO.BAI_BANKINSTITUTIONSZU ON BAI_BANKINSTLFDNR=PER_SENDER_BANKINSTLFDNR

		LEFT JOIN BUERO.KOD_KONDITIONEN ON KOD_KONDNR=KLI_LIEF_KONDNR

		LEFT JOIN BUERO.LAN_LAND ON LAN_LANDNR = PER_LANDNR

	WHERE

		PEK_FIRMENNR = :firmennr AND PEK_FIBUNR = :fibunr AND PEK_KONTONR = :kontonr';



	//BMD_SHOWMESSAGE ('get_KDLF firmennr: ' + Firmennr + ' fibunr: ' + FibuNr + ' kontonr: ' + kontonr);



	iQuery  := MacroObject.CreateMacroQuery('get_person');

	iQuery.setSQLText (sqlText);

	iQuery.setParamAsString('firmennr', Firmennr);

	iQuery.setParamAsString('kontonr', KontoNr);

	iQuery.setParamAsString('fibunr', FibuNr);

	iQuery.Open();

	if (iQuery.RecordCount() > 0) then begin



		uid    := iQuery.getAsString('VATREGNO');

		name    := iQuery.getAsString('NAME');

		zusatzname    := iQuery.getAsString('ZUSATZNAME');

		personenid    := iQuery.getAsString('PERSONENID');

		strasse    := iQuery.getAsString('ADDRESSE');

		iban1    := iQuery.getAsString('IBAN');

		kondition    := iQuery.getAsString('KOND');

		zahlsperre    := iQuery.getAsString('ZAHLSPERRE');

		land_id    := iQuery.getAsString('COUNTRY');

		plz    := iQuery.getAsString('PLZ');

		account_holder	:= iQuery.getAsString('account_holder'); 



	end;

	iQuery.close();

end;



// ================================================================================



//------------------------------------------------------------------------------

function dump_logfile (logfile: String);

begin

	Result := '';

	if (BMD_FILEEXISTS (logfile)) then begin

		BMD_ASSIGNFILE (fh_bmd_log, logfile);

		BMD_OPENFILE_RESET (fh_bmd_log);

		while not BMD_EOF (fh_bmd_log) do begin

			line := BMD_READLN (fh_bmd_log);

			//BMD_SHOWMESSAGE (line);

			Result := Result + line;

		end;  

		BMD_CLOSEFILE (fh_bmd_log);

	end;

end;



// ================================================================================



function import_KDLF (kontonr: String; uid: String; uid_datum: String;  name: String; zusatzname: String; strasse: String; plz: String; land_id: String; iban1: String; iban2: String; iban3: String; kondition: String; zahlsperre: String; kontoinhaber: String);

begin

	//gFileName := 'kdlf_import_' + kontonr + '.csv';

	sequence := BMD_GETSEQID();

	gFileName := 'kdlf_import_' + sequence + '.csv';





	sql_exists := 'SELECT count(1) as COUNT

		FROM FIBU.PEK_PERSONENKONTO P1

			INNER JOIN BUERO.KLI_KUNDE_LIEFERANT KL ON KL.KLI_FIRMENNR = P1.PEK_FIRMENNR AND KL.KLI_KLID = P1.PEK_KLID

			INNER JOIN BUERO.PER_PERSON ON PER_FIRMENNR = PEK_FIRMENNR AND PER_PERSONENID = P1.PEK_KLID

			INNER JOIN FIBU.KTO_KONTO ON KTO_FIRMENNR = PEK_FIRMENNR AND KTO_FIBUNR = PEK_FIBUNR AND KTO_KONTONR = PEK_KONTONR

		WHERE

			PEK_FIRMENNR = :firmennr AND PEK_FIBUNR = :fibunr AND PEK_KONTONR = :kontonr';



	temp:= BMD_GETENVIRONMENTVAR('temp');

	filename := temp +'\'+ gFileName;



	//if (BMD_FILEEXISTS(filename)) then begin

	//	BMD_DELETEFILE(filename);  //DeleteFile

	//end;



	//BMD_CREATEFILE(filename);



	lFileNr := 1;

	BMD_ASSIGNFILE(lFileNr,filename,1,1,1,1200);   // unicode



	//rc := BMD_OPENFILE_APPEND(lFileNr);

	//if (rc = '-1') then begin

	//	BMD_SHOWMESSAGE('Fehler open file ' + filename);

	//	exit;

	//end;



	header_line1 := 'NTCS_CONSTID_INFO%10%MCA_KTO_KONTONR%MCA_PER_NAME%MCA_PER_ZUSATZNAME%MCA_ADR_ORTSNAME%MCA_ADR_PLZ%MCA_ADR_STRASSE%MCA_PER_UIDNR%MCA_PER_LANDNR%MCA_BAI_IBAN%MCA_PER_UIDDATUM%MCA_KLI_KONDNR%MCA_KLI_HATZAHLSPERRE%MCA_PEK_LIE_ZAHLSPERRE%MCA_PER_MATCHCODE%MCA_BAI_KONTOINHABER';

	header_line2 := 'kto-nr;Name;zusatzname;Ort;PLZ;Strasse;UID;Land;iban-nr;UID-Datum;kondition;zahlsperre1;zahlsperre2;matchcode;kontoinhaber';



	//header_line1 := 'NTCS_CONSTID_INFO%10%MCA_KTO_KONTONR%MCA_PER_NAME%MCA_PER_ZUSATZNAME%MCA_ADR_ORTSNAME%MCA_ADR_PLZ%MCA_ADR_STRASSE%MCA_PER_UIDNR%MCA_PER_LANDNR%MCA_BAI_IBAN%MCA_PER_UIDDATUM%MCA_KLI_KONDNR%MCA_KLI_HATZAHLSPERRE%MCA_PER_MATCHCODE';

	//header_line2 := 'kto-nr;Name;zusatzname;Ort;PLZ;Strasse;UID;Land;iban-nr;UID-Datum;kondition;zahlsperre;matchcode';



	BMD_WRITELN(lFileNr, header_line1);

	BMD_WRITELN(lFileNr, header_line2);

	line:= kontonr + ';' + name + ';' + zusatzname + ';;' + +plz + ';' + strasse + ';' + uid + ';' + land_id + ';' + iban1 + ';' + uid_datum + ';' + kondition + ';' + zahlsperre + ';' + zahlsperre + ';' +  BMD_UPPER (name) + ';' + kontoinhaber;



	BMD_WRITELN(lFileNr, line);

	BMD_CLOSEFILE(lFileNr);



	if(BMD_FILEEXISTS(filename))then begin

		if((FirmenNr<>'') AND (FibuNr<>'') AND (filename<>''))then begin



			//BMD_SHOWMESSAGE (dump_logfile (filename));



			logfile := temp +'\Kontenimport' + FirmenNr + '_' + kontonr +  '.log';

			lParam := 'STP_FIB_COMPANYNO=' + FirmenNr + ',STP_FIB_FIBUNO=' + FibuNr + ',STP_IMP_FILENAME=' + filename + ',STP_LOG_FILENAME=' + logfile + ',';  

			lParam := lParam + 'SILENT=1,';  

			lParam := lParam + 'STP_IMP_SEPARATOR=;,'; 

			lParam := lParam + 'STP_IMP_ENCODING=3,';

			lParam := lParam + 'STP_USEFIXEDLENGTH=0,';

			lParam := lParam + 'STP_IGNORE_FIRSTLINE=1';		       



			BMD_STARTFUNCTION('MCS_FRMFIBUVARCSVPERSONENKONTENIMPEXP_CREATE',lParam);  //Start Var. Personenimport



			BMD_DELETEFILE(filename);



			uid := '';

			uid_status := '';

			uid_timestamp := '';  



			name := '';

			zusatzname := ''; 



			addresse := '';

			plz := '';

			land_id := '';  



			iban1 := '';

			iban2 := '';

			iban3 := '';  

			kondition := ''; 

			personenid := ''; 

			zahlsperre := ''; 



			get_KDLF (personenid, kontonr, uid, uid_timestamp, name, zusatzname, addresse, plz, land_id, iban1, iban2, iban3, kondition, zahlsperre, kontoinhaber);    



			if personenid = '' then begin

				BMD_SHOWMESSAGE('Fehler: Anlegen/Ändern Konto ' + kontonr + ' failed logfile: ' + dump_logfile (logfile));

			end;  

			Result := personenid;

		end;

	end;  

       

	VorerfassenModel.SetValue('MCA_VEB_KONTONR', kontonr);

end;



// ================================================================================



function store_created_kdlf (uid: String; name: String; vorerf_typ: String; personenid: String);

begin



	if uid = '' then begin	// search for name

		search_string := FirmenNr + ';' + FibuNr + ';' + vorerf_typ + ';' + name;

	end;

	else begin

		search_string := FirmenNr + ';' + FibuNr + ';' + vorerf_typ + ';' + 'UID' +  uid;

	end;



	created_list.SetKeyValue (search_string, personenid);

end;



// ================================================================================

// bei überspringen leeres feld --> gibt es den lieferanten schon?

// ================================================================================



function KDLF_exists (search_uid: String; search_name: String; vorerf_typ: String);

begin

	

	sqlText := 'SELECT

		PEK_KONTONR as KONTONR,

		PER_NAME as NAME,

		PER_ZUSATZNAME as ZUSATZNAME,

		PER_UIDNR as VATREGNO,

		KTO_KONTENGRUPPE

	FROM FIBU.PEK_PERSONENKONTO P1

		INNER JOIN BUERO.KLI_KUNDE_LIEFERANT KL ON KL.KLI_FIRMENNR = P1.PEK_FIRMENNR AND KL.KLI_KLID = P1.PEK_KLID

		INNER JOIN BUERO.PER_PERSON ON PER_FIRMENNR = PEK_FIRMENNR AND PER_PERSONENID = P1.PEK_KLID

		INNER JOIN FIBU.KTO_KONTO ON KTO_FIRMENNR = PEK_FIRMENNR AND KTO_FIBUNR = PEK_FIBUNR AND KTO_KONTONR = PEK_KONTONR

	WHERE

		PEK_FIRMENNR = :firmennr AND PEK_FIBUNR = :fibunr	 

		AND (LEN (:uid) > 5 AND PER_UIDNR = :uid or (isnull (:uid,'''') = '''' and PER_NAME = :name)) 

		AND (KTO_KONTENGRUPPE = 4 OR (KTO_KONTENGRUPPE = 3 and :vorerf_typ = 3) OR (KTO_KONTENGRUPPE = 2 and :vorerf_typ = 4)) ';



	// Kontengruppe KUNDE=2, LIEFERANT=3, both = 4

	// vorerf_typ 4 = AR (Kunden), 3: ER (Lieferanten)

	Result := '0';



	iQuery  := MacroObject.CreateMacroQuery('get_konto');

	iQuery.setSQLText (sqlText);

	iQuery.setParamAsString('firmennr', Firmennr);

	iQuery.setParamAsString('fibunr', FibuNr);

	iQuery.setParamAsString('uid', search_uid);  

	iQuery.setParamAsString('name', search_name);  

	iQuery.setParamAsString('vorerf_typ', vorerf_typ); 



	iQuery.Open();

	if (iQuery.RecordCount() > 0) then begin



		per_kontonr    := iQuery.getAsString('KONTONR');

		per_name    := iQuery.getAsString('NAME');

		per_uidnr    := iQuery.getAsString('VATREGNO');

		per_zusatzname    := iQuery.getAsString('ZUSATZNAME'); 

		kontengruppe    := iQuery.getAsString('KTO_KONTENGRUPPE'); 

	

		rc := BMD_ASKVALUEBOOL (kdlf_string + 'nummer ' + per_kontonr + bmd_lineBreak() + bmd_lineBreak() +

			'Name: <' + per_name + '>' +

			'UID : <' + per_uidnr + '>', kdlf_string + ' übernehmen ?');

		if (rc = 1) then begin

			VorerfassenModel.SetValue('MCA_VEB_KONTONR', per_kontonr);

			Result := per_kontonr;

		end

		else begin

			Result := '0';

		end;

	end;

	else begin

		//BMD_SHOWMESSAGE ('no kdlf firmennr: ' + Firmennr + ' fibunr: ' + FibuNr + ' vorerf_typ: ' + vorerf_typ + ' uid: ' + search_uid + ' name: ' + search_name + ' sql: ' + sqlText);

	end;

end;





// ================================================================================



//BMD_SHOWMESSAGE ('start');



IF (BMD_GETAPPLICATIONTYPE() <> 'BMDNTCS') THEN BEGIN  

        exit;

END;



VorerfassenModel := MacroObject.CreateMacroModel('TBMDMDFibuVorerfassBuchungMgr');  //CreateMacroModel

lkontobezeichnung := VorerfassenModel.GetValue('MCU_VEB_ADD_KONTOBEZEICHNUNG');  //GetValue

FibuNr := VorerfassenModel.GetValue('MCA_VEB_FIBUNR');

FirmenNr := VorerfassenModel.GetValue('MCA_VEB_FIRMENNR');

uid := VorerfassenModel.GetValue('MCA_VEB_UIDNR');

text := VorerfassenModel.GetValue('MCA_VEB_BUCHUNGSTEXT');  

id := VorerfassenModel.GetValue('MCA_VEB_VORERFASSID'); 

rg_file := VorerfassenModel.GetValue('MCA_VEB_FREIFELDA01_20');

json := VorerfassenModel.GetValue('MCA_VEB_FREIFELDA03_300'); 

json_learned := VorerfassenModel.GetValue('MCA_VEB_FREIFELDA01_50'); 

periode := VorerfassenModel.GetValue('MCA_VEB_PERIODE');   

blind_flag := VorerfassenModel.GetValue('MCA_VEB_FREIFELDN6_10');

fh_bmd_log := 4;







if (BMD_LEN (text) > 100) then begin

	if (BMD_POS (text, ' ') >  0) then begin

		text := BMD_COPY (text, 1, 101); 

	end

	else begin  

		text := BMD_COPY (text, 1, 100);

	end;

end;

personenid := VorerfassenModel.GetValue('MCA_VEB_PER_PERSONENID');	      // alte personenid



BS := VorerfassenModel.GetValue('MCA_VEB_BUS_BUCHSYMSYMBOL');

field_input_value := FIELD_INPUT_VALUE;

field_old_value := FIELD_OLD_VALUE; 



KontoNr := field_input_value;

KontoNr_numeric := BMD_TEXTTONUMDEF (field_input_value);

field_output_value := field_input_value;



per_uidnr := '';

per_name := '';   



initParams; 

AUTH_CRE_KUNDEN := 1;

AUTH_UPD_KUNDEN := 2;

AUTH_CRE_LIEF := 4;

AUTH_UPD_LIEF := 8;



BMD_VORERF_TYP_KUNDEN := '4';

BMD_VORERF_TYP_LIEF := '3';





// Änderung Blindsätze unterbinden



if (blind_flag = '99') and (BMD_LEN (field_input_value) > 0) and (KontoNr_numeric > 0) then begin 

	BMD_SHOWMESSAGE ('Änderung bereits verbuchten Blindsatz nicht erlaubt - bitte löschen vor Import');

	FIELD_OUTPUT_VALUE := '';

	exit;

end;



vorerf_typ := VorerfassenModel.GetValue('MCA_VEB_VBV_VORERFASSTYP'); 



kdlf_string := 'Lieferanten';  

if ((vorerf_typ <>  BMD_VORERF_TYP_LIEF) and (vorerf_typ <>  BMD_VORERF_TYP_KUNDEN)) then begin     // Kassa

	exit;

end;

else if (vorerf_typ = BMD_VORERF_TYP_KUNDEN) then begin    

	kdlf_string := 'Kunden';

end;





auth := get_auth (FirmenNr, FibuNr);

auth_create := 0;

auth_modify := 0;

if (vorerf_typ = BMD_VORERF_TYP_KUNDEN) then begin

	if auth and AUTH_CRE_KUNDEN then begin

		auth_create := 1;

	end;

	if auth and AUTH_UPD_KUNDEN then begin

		auth_modify := 1;

	end;



end;

if (vorerf_typ = BMD_VORERF_TYP_LIEF) then begin

	if auth and AUTH_CRE_LIEF then begin

		auth_create := 1;

	end;

	if auth and AUTH_UPD_LIEF then begin

		auth_modify := 1;

	end;

end;

if (not auth_create) and (not auth_modify) then begin  

	//BMD_SHOWMESSAGE ('no auth');

	exit;

end;



addresse := '';

ort := '';

plz := '';

land_id := '';  



uid_status := '';

iban1 := '';

iban2 := '';

iban3 := '';  

per_adresse := '';  

per_zusatzname := '';  

per_iban1 := '';

per_iban2 := '';

per_iban3 := '';

uid_datum := '';  

name := '';

zusatzname := ''; 

kondition := ''; 

zahlsperre := ''; 

per_zahlsperre := ''; 

kontoinhaber := ''; 

per_kontoinhaber := ''; 

per_plz := ''; 

per_land_id := ''; 

per_kondition := '';

personenid := '';

uid_timestamp := '';



 

done_list := MacroObject.FindGlobalMacroStringList('Logisthai_done'); 

if not done_list then begin

	done_list := MacroObject.CreateGlobalMacroStringList('Logisthai_done');  

end;     

created_list := MacroObject.FindGlobalMacroStringList('Logisthai_created'); 

if not created_list then begin

	created_list := MacroObject.CreateGlobalMacroStringList('Logisthai_created');  

end;     



fetch_json (json, json_learned, fibunr, name, zusatzname, addresse, ort, plz, land_id, uid, uid_status, iban1, iban2, iban3, uid_datum, kondition, zahlsperre, kontoinhaber);



if (BMD_LEN (field_input_value) > 0) and (KontoNr_numeric > 0) then begin

	if not auth_modify then begin  

		//BMD_SHOWMESSAGE ('no auth');

		exit;

	end;    

	//BMD_SHOWMESSAGE ('field changed');

	// field update && check update kundenstamm

	

	get_KDLF (personenid, kontonr, per_uidnr, uid_timestamp, per_name, per_zusatzname, per_adresse, per_plz, per_land_id, per_iban1, per_iban2, per_iban3, per_kondition, per_zahlsperre, per_kontoinhaber);    

		  

	if (field_input_value <> field_old_value)  then begin



		if do_modify_buchungstext then begin		

			VorerfassenModel.SetValue('MCA_VEB_BUCHUNGSTEXT', per_name);

		end;

		

		//VorerfassenModel.SetValue('MCA_VEB_UIDNR', per_uidnr);

		VorerfassenModel.SetValue('MCA_VEB_FREIFELDNK2', 1);	    // set change id

	end

	if zahlsperre = '' then begin

		zahlsperre := per_zahlsperre;

	end;

	if kondition = '' then begin

		kondition := per_kondition;

	end;



	// update_stamm

	if (((BMD_LEN (uid) > 0) or (BMD_LEN (name) > 0)) and (BMD_LEN (name) > 0) and (

		(per_uidnr <> uid) or (per_name <> name) or (addresse <> per_adresse) 

			or (plz <> per_plz) 

			or (iban1 <> per_iban1) 

			or (land_id <> per_land_id) 

			or ((kondition <> per_kondition) AND (kondition <> '')) 

			or ((zahlsperre <> per_zahlsperre) AND (zahlsperre <> '')) 

			or ((kontoinhaber <> per_kontoinhaber) AND (per_kontoinhaber <> ''))

			)) then begin

	      

		current_date := BMD_DATE(); 

		// BMD_SHOWMESSAGE('per_uidnr: ' + per_uidnr + ' uid: ' + uid + ' per_name: ' + per_name + ' name: ' + name + ' addresse: ' + addresse + ' per_adresse: ' + per_adresse + ' kondition: ' + kondition + ' per_kondition: ' + per_kondition);

  

		// wurde mit aktuellem tagesdatum + firmennr + fibunr + periode + kdlf + neuem updatewert schon einmal nach einem update gefragt?

		//done_string := current_date + ';' + FirmenNr + ';' + FibuNr + ';' + Periode + ';' + field_input_value + ';' + name;	       

		//done := BMD_GETINTPARAMVALUE('LOGISTHAI_KDLF',done_string,'');

		//done := '';		   // test only  



		//BMD_SHOWMESSAGE('per_uidnr: ' + per_uidnr + ' uid: ' + uid + ' per_name: ' + per_name + ' name: ' +  name + ' addresse: ' + addresse + ' per_adresse: ' + per_adresse + ' kondition: ' + kondition + ' per_kondition: ' + per_kondition);

		

		done_string := FirmenNr + ';' + FibuNr + ';' + Periode + ';' + field_input_value + ';' + name;

		done := done_list.GetKeyValue (done_string);

		

		if (done <> '') then begin

			//BMD_SHOWMESSAGE('Schon mal gefragt und du wolltest nicht, Jetzt Pech');

		end;

		else begin



			question := '';

			if (per_name <> name) then begin

				question := question + 'Name <' + per_name + '> auf <' + name + '>' + bmd_lineBreak();

			end; 

			if (per_uidnr <> uid) then begin

				question := question + 'UID <' + per_uidnr + '> auf <' + uid + '>' + bmd_lineBreak();

			end; 

			if (addresse <> per_adresse) then begin

				question := question + 'Adresse <' + per_adresse + '> auf <' + addresse + '>' + bmd_lineBreak();

			end; 

			if (plz <> per_plz) then begin

				question := question + 'PLZ <' + per_plz + '> auf <' + plz + '>' + bmd_lineBreak();

			end; 

			if (iban1 <> per_iban1) then begin

				question := question + 'IBAN <' + per_iban1 + '> auf <' + iban1 + '>' + bmd_lineBreak();

			end; 

			if (land_id <> per_land_id) then begin

				question := question + 'Land <' + per_land_id + '> auf <' + land_id + '>' + bmd_lineBreak();

			end; 

			if ((kondition <> per_kondition) AND (kondition <> '')) then begin

				question := question + 'Kondition <' + per_kondition + '> auf <' + kondition + '>' + bmd_lineBreak();

			end; 

			if ((zahlsperre <> per_zahlsperre) AND (zahlsperre <> '')) then begin

				per_zahlsperre_string := 'Nein';

				zahlsperre_string := 'Nein';

				if (per_zahlsperre <> '0') then begin

					per_zahlsperre_string := 'Ja';

				end; 

				if (zahlsperre <> '0') then begin

					zahlsperre_string := 'Ja';

				end; 

				question := question + 'Zahlsperre <' + per_zahlsperre_string + '> auf <' + zahlsperre_string + '>' + bmd_lineBreak();

			end; 

			if ((kontoinhaber <> per_kontoinhaber) AND (kontoinhaber <> '')) then begin

				question := question + 'Kontoinhaber <' + per_kontoinhaber + '> auf <' + kontoinhaber + '>' + bmd_lineBreak();

			end; 

	      



			rc := BMD_ASKVALUEBOOL (question, 'Stammdatenupdate - ' + KontoNr + ' - ' + per_name + ' ?');



			done_list.SetKeyValue (done_string, '1');

			

			if (rc = 1) then begin



				personenid := import_KDLF (KontoNr, uid, uid_datum, name, zusatzname, addresse, plz, land_id, iban1, iban2, iban3, kondition, zahlsperre, kontoinhaber);

				

				if do_modify_buchungstext then begin

					VorerfassenModel.SetValue('MCA_VEB_BUCHUNGSTEXT', name); 

				end;

				show_kdlf (FirmenNr, FibuNr, personenid);

			end; 

			FIELD_KEEP_FOCUS:=True;

		end;

	end;

end;				   

else if auth_create then begin	      // feld leer -->neuen kunden anlegen										

	

	if (((BMD_LEN (uid) > 0) or (BMD_LEN (plz) > 0)) and (BMD_LEN (name) > 0)) then begin

		rc := KDLF_exists (uid, text, vorerf_typ);										 

																	    

		if (rc = '0') then begin

			next_nummer := get_next_free_kdlf_nummer (FirmenNr, BS, FibuNr);



			if (next_nummer > 0) then begin

		

				text := name;

				if addresse <> '' then begin

				    text := text + ' ' + addresse;

				end;

				if ort <> '' then begin

				    text := text + ' ' + ort;

				end;

				if uid <> '' then begin

				    text := text + ' UID  ' + uid + ': ' + uid_status;

				end;

				if iban1 <> '' then begin

				    text := text + ' ' + iban1;

				end;

				text := text + ' Nummer:';

				rc := BMD_ASKVALUEBOOL (kdlf_string + 'Nummer ' + next_nummer + bmd_lineBreak() + bmd_lineBreak() +

							   name + bmd_lineBreak() + 

							'UID  <' + uid + '>: ' + uid_status + bmd_lineBreak() + 

							addresse + bmd_lineBreak() + 

							ort + bmd_lineBreak() + 

							'IBAN: ' + iban1,

							kdlf_string + ' anlegen ?'); 

							

				if (rc = 1) then begin

					personenid := import_KDLF (next_nummer, uid, uid_datum, name, zusatzname, addresse, plz, land_id, iban1, iban2, iban3, kondition, zahlsperre, kontoinhaber);

					store_created_kdlf (uid, name, vorerf_typ, personenid);

					field_output_value := next_nummer;

					show_kdlf (FirmenNr, FibuNr, personenid); 

				end;				       

			end;		     

			else begin

				BMD_SHOWMESSAGE ('Keine next free number');

			end;		     

		end; 

		else begin  

			field_output_value := rc;

		end;

		

		FIELD_KEEP_FOCUS:=True;

	end;

end;





result := field_output_value;					   

FIELD_OUTPUT_VALUE:=result;

