From 87694b477b1cacc36b9ec8e8028665ddd557fb89 Mon Sep 17 00:00:00 2001 From: Arthur Egberink Date: Fri, 15 Sep 2023 06:55:43 +0000 Subject: [PATCH] DLLG#79179 -- Aanpassing koppeling met Brivo. svn path=/Customer/trunk/; revision=61813 --- DLLG/DLLG.sql | 164 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 153 insertions(+), 11 deletions(-) diff --git a/DLLG/DLLG.sql b/DLLG/DLLG.sql index 7f937c95e..9a7f78ea9 100644 --- a/DLLG/DLLG.sql +++ b/DLLG/DLLG.sql @@ -39,6 +39,10 @@ AS p_facility_code IN VARCHAR2) RETURN VARCHAR2; + FUNCTION get_dec_card_data (p_card_number IN VARCHAR2, + p_facility_code IN VARCHAR2) + RETURN VARCHAR2; + PROCEDURE update_bezoeker (p_bezkey IN NUMBER); PROCEDURE set_bezoeker_syncdate (p_bezkey IN NUMBER, @@ -321,7 +325,130 @@ AS RETURN LOWER(LTRIM(v_result, '0')); END; + FUNCTION get_dec_card_data (p_card_number VARCHAR2, + p_facility_code VARCHAR2) + RETURN VARCHAR2 + AS + v_card_bin VARCHAR2 (100); + v_facility_bin VARCHAR2 (100); + v_card_hex VARCHAR2 (100); + v_facility_hex VARCHAR2 (100); + v_bin VARCHAR2 (100); + v_bin_str VARCHAR2 (100); + v_result VARCHAR2 (100); + v_length NUMBER; + v_count NUMBER; + v_bit VARCHAR2 (1); + v_dec NUMBER; + FUNCTION OneHex2Bin (p_hex VARCHAR2) + RETURN VARCHAR2 + AS + v_result VARCHAR2 (10); + BEGIN + IF p_hex = '0' + THEN + v_result := '0000'; + ELSIF p_hex = '1' + THEN + v_result := '0001'; + ELSIF p_hex = '2' + THEN + v_result := '0010'; + ELSIF p_hex = '3' + THEN + v_result := '0011'; + ELSIF p_hex = '4' + THEN + v_result := '0100'; + ELSIF p_hex = '5' + THEN + v_result := '0101'; + ELSIF p_hex = '6' + THEN + v_result := '0110'; + ELSIF p_hex = '7' + THEN + v_result := '0111'; + ELSIF p_hex = '8' + THEN + v_result := '1000'; + ELSIF p_hex = '9' + THEN + v_result := '1001'; + ELSIF p_hex = 'A' + THEN + v_result := '1010'; + ELSIF p_hex = 'B' + THEN + v_result := '1011'; + ELSIF p_hex = 'C' + THEN + v_result := '1100'; + ELSIF p_hex = 'D' + THEN + v_result := '1101'; + ELSIF p_hex = 'E' + THEN + v_result := '1110'; + ELSIF p_hex = 'F' + THEN + v_result := '1111'; + END IF; + + RETURN v_result; + END; + + BEGIN + v_card_hex := p_card_number; + + -- transform the hex card data into a binary string + FOR v_index IN 1 .. 4 + LOOP + v_card_bin := + v_card_bin || OneHex2Bin (SUBSTR (v_card_hex, 1, 1)); + v_card_hex := SUBSTR (v_card_hex, 2, 4); + END LOOP; + + -- add the parity bit + --v_card_bin := set_parity (v_card_bin, 'after', 1); + + -- transform the hex facility data into a binary string + v_facility_hex := p_facility_code; + + FOR v_index IN 1 .. 2 + LOOP + v_facility_bin := + v_facility_bin || OneHex2Bin (SUBSTR (v_facility_hex, 1, 1)); + v_facility_hex := SUBSTR (v_facility_hex, 2, 4); + END LOOP; + + -- add the parity bit + -- v_facility_bin := set_parity (v_facility_bin, 'before', 0); + + -- combine the facility data and the card data + v_bin := v_facility_bin || v_card_bin; + -- the first 12 bits have an even leading parity bit + -- the last 12 bits have a trailing odd parity bit + -- bij de decimale uitvoering doen we geen parity + --v_bin := set_parity (SUBSTR(v_bin, 1,12), 'before', 0) || set_parity (SUBSTR(v_bin, 13,12), 'after', 1); + + -- and convert the binary string into hex + v_dec := 0; + v_count := 0; + WHILE v_bin IS NOT NULL + LOOP + v_bit := SUBSTR(v_bin, LENGTH(v_bin), 1); + IF v_bit = 1 + THEN + v_dec := v_dec + POWER(2,v_count); + END IF; + v_bin := SUBSTR(v_bin, 1, LENGTH(v_bin)-1); + v_count := v_count + 1; + END LOOP; + + RETURN v_dec; + END; PROCEDURE update_bezoeker (p_bezkey IN NUMBER) AS @@ -349,6 +476,7 @@ AS v_dec_code_key NUMBER; v_sync_timestamp_key NUMBER; v_date DATE; + v_bedrijf BEZ_BEZOEKERS.BEZ_AFSPRAAK_BEDRIJF%TYPE; BEGIN FOR rec IN c LOOP @@ -422,8 +550,8 @@ AS DBMS_OUTPUT.put_line ('v_date'); - SELECT bez_afspraak_datum - INTO v_date + SELECT bez_afspraak_datum, bez_afspraak_bedrijf + INTO v_date, v_bedrijf FROM bez_afspraak a, bez_bezoekers b WHERE a.bez_afspraak_key = b.bez_afspraak_key AND b.bez_bezoekers_key = p_bezkey; @@ -443,6 +571,7 @@ AS INTO v_count FROM bez_kenmerkwaarde kw WHERE kw.bez_kenmerk_key = v_card_number_key + AND bez_kenmerkwaarde_aanmaak > SYSDATE - 300 AND bez_kenmerkwaarde_waarde = v_code; IF v_code IS NULL OR v_count > 1 @@ -468,16 +597,29 @@ AS p_bezkey, '123'); - -- Vul het flexveld hex code met de hex waarde die gescant moet worden. - -- We gebruiken hiervoor 'The Standard 26-Bit Format' - FLX.setflex ( - 'BEZ', - v_hex_code_key, - p_bezkey, - DLLG.get_hex_card_data ( - LPAD (TRIM (TO_CHAR (v_code, 'XXXXXX')), 4, '0'), - LPAD (TRIM (TO_CHAR (123, 'XXXXXX')), 2, '0'))); + -- Vanaf 1 oktober 2023 gaan we de decimale code gebruiken ipv de hex code (DLLG#79179) + IF UPPER(v_bedrijf) LIKE '%FORTEZZA%' + THEN + FLX.setflex ( + 'BEZ', + v_hex_code_key, + p_bezkey, + DLLG.get_dec_card_data ( + LPAD (TRIM (TO_CHAR (v_code, 'XXXXXX')), 4, '0'), + LPAD (TRIM (TO_CHAR (123, 'XXXXXX')), 2, '0'))); + + ELSE + -- Vul het flexveld hex code met de hex waarde die gescant moet worden. + -- We gebruiken hiervoor 'The Standard 26-Bit Format' + FLX.setflex ( + 'BEZ', + v_hex_code_key, + p_bezkey, + DLLG.get_hex_card_data ( + LPAD (TRIM (TO_CHAR (v_code, 'XXXXXX')), 4, '0'), + LPAD (TRIM (TO_CHAR (123, 'XXXXXX')), 2, '0'))); + END IF; FLX.setflex ( 'BEZ',