1 -- Provides support for generating patron barcodes, with optional prefixes
2 -- If all digits, then a mod10 check digit is calculated and appended
3 CREATE SEQUENCE evergreen.actor_barcode_seq;
5 CREATE OR REPLACE FUNCTION evergreen.mod10(barcode TEXT)
13 foreach my $digit (split('', $barcode)) {
14 $digit = sprintf('%d', $digit);
19 # If less than 10, add to the total
29 my $rem = $total % 10;
36 CREATE OR REPLACE FUNCTION evergreen.actor_generate_barcode(prefix TEXT DEFAULT 'AUTOBC')
45 SELECT lpad(NEXTVAL('evergreen.actor_barcode_seq')::text, 7, '0') AS bc INTO bc_serial;
46 bc_gen := rpad(COALESCE(prefix, '0'), 6, '0') || bc_serial.bc::text;
47 IF unnest(regexp_matches(bc_gen, '\D')) IS NOT NULL THEN
48 bc_gen := rpad(bc_gen, 14, '0');
50 bc_gen := bc_gen || evergreen.mod10(bc_gen);
53 SELECT barcode INTO bc_holder FROM actor.card WHERE barcode = bc_gen;
54 EXIT WHEN bc_holder IS NULL;
61 CREATE OR REPLACE FUNCTION evergreen.actor_update_barcode(usr_id INT, prefix TEXT DEFAULT NULL)
69 IF prefix IS NULL THEN
70 bc_gen := evergreen.actor_generate_barcode();
72 bc_gen := evergreen.actor_generate_barcode(prefix);
75 SELECT barcode INTO bc_holder FROM actor.card WHERE barcode = bc_gen;
76 EXIT WHEN bc_holder IS NULL;
79 INSERT INTO actor.card (usr, barcode) VALUES (usr_id, bc_gen);
82 SET card = CURRVAL('actor.card_id_seq')