bsw/jbe@1309: local verification = Verification:by_id(param.get_id()) bsw/jbe@1309: bsw/jbe@1309: local function update_data() bsw@1356: local old_verification_data = verification.verification_data or {} bsw/jbe@1309: verification.verification_data = json.object() bsw/jbe@1309: bsw/jbe@1309: for i, field in ipairs(config.self_registration.fields) do bsw/jbe@1309: local value = param.get(field.name) bsw/jbe@1309: if field.name == "fiscal_code" then bsw/jbe@1309: value = string.gsub(value, "[^A-Z0-9]", "") bsw/jbe@1309: elseif field.name == "mobile_phone" then bsw/jbe@1309: value = string.gsub(value, "[^0-9]", "") bsw@1352: elseif field.name == "unit" then bsw@1352: value = string.gsub(value, "[^0-9]", "") bsw@1690: if old_verification_data.unit and old_verification_data.unit ~= "" and old_verification_data.unit ~= value then bsw@1366: local old_unit_privilege = Privilege:by_pk(old_verification_data.unit, verification.requesting_member_id) bsw@1357: if old_unit_privilege then bsw@1357: old_unit_privilege:destroy() bsw@1357: end bsw@1356: end bsw@1356: if value ~= old_verification_data.unit and value ~= "" then bsw@1353: local unit_privilege = Privilege:new() bsw@1366: unit_privilege.member_id = verification.requesting_member_id bsw@1355: unit_privilege.unit_id = tonumber(value) bsw@1352: unit_privilege.voting_right = true bsw@1352: unit_privilege.initiative_right = true bsw@1354: unit_privilege:save() bsw@1352: end bsw@1359: elseif field.name == "sequential_number" then bsw@1359: value = old_verification_data.sequential_number bsw@1362: if not value then bsw@1362: local last_sequential_number = 0 bsw@1362: db:query('LOCK TABLE "verification" IN SHARE ROW EXCLUSIVE MODE') bsw@1364: local record = Verification:new_selector() bsw@1362: :reset_fields() bsw@1364: :add_field("max((verification_data->>'sequential_number')::int8)", "max_sequential_number") bsw@1362: :optional_object_mode() bsw@1362: :exec() bsw@1365: if record and record.max_sequential_number then bsw@1364: last_sequential_number = record.max_sequential_number bsw@1362: end bsw@1362: value = last_sequential_number + 1 bsw@1362: end bsw@1363: elseif field.type ~= "image" then bsw@1363: value = string.gsub(value, "^%s+", "") bsw@1363: value = string.gsub(value, "%s+$", "") bsw@1363: value = string.gsub(value, "%s+", " ") bsw/jbe@1309: end bsw/jbe@1309: verification.verification_data[field.name] = value bsw/jbe@1309: end bsw/jbe@1309: end bsw/jbe@1309: bsw@1812: local function check_db_error(db_error) bsw@1812: if db_error then bsw@1814: if db_error:is_kind_of("IntegrityConstraintViolation.UniqueViolation") then bsw@1812: slot.select("error", function() bsw@1812: ui.tag{ content = _"Identification unique violation: This identification is already in use for another member." } bsw@1812: end ) bsw@1812: return false bsw@1812: else bsw@1812: error(db_error) bsw@1812: end bsw@1812: end bsw@1812: end bsw@1812: bsw/jbe@1309: if verification.verified_member_id then bsw/jbe@1309: bsw/jbe@1309: local member = Member:by_id(verification.verified_member_id) bsw/jbe@1309: bsw@1810: local identification = param.get("identification") bsw@1809: if identification and #identification == 0 then bsw@1809: identification = nil bsw@1809: end bsw@1809: member.identification = identification bsw@1809: bsw/jbe@1309: member.notify_email = param.get("email") bsw@1812: bsw@1815: local success = check_db_error(member:try_save()) bsw@1815: if not success then bsw@1815: return false bsw@1815: end bsw@1812: bsw/jbe@1309: update_data() bsw@1812: bsw/jbe@1309: verification:save() bsw/jbe@1309: bsw@1816: if param.get("cancel") then bsw@1816: db:query({ "SELECT delete_member(?)", member.id }) bsw@1816: return bsw@1816: end bsw@1816: bsw/jbe@1309: if param.get("invite") then bsw/jbe@1309: member:send_invitation() bsw/jbe@1309: end bsw/jbe@1309: bsw/jbe@1309: elseif param.get("drop") then bsw/jbe@1309: bsw/jbe@1309: verification.denied = "now" bsw/jbe@1309: verification:save() bsw/jbe@1309: return bsw/jbe@1309: bsw/jbe@1309: elseif param.get("accredit") then bsw/jbe@1309: bsw/jbe@1309: local member = Member:by_id(verification.requesting_member_id) bsw@1813: bsw@1813: local identification = param.get("identification") bsw@1813: if identification and #identification == 0 then bsw@1813: identification = nil bsw@1813: end bsw@1813: member.identification = identification bsw@1813: bsw/jbe@1309: member.notify_email = param.get("email") bsw@1815: bsw@1815: local success = check_db_error(member:try_save()) bsw@1815: if not success then bsw@1815: return false bsw@1815: end bsw@1490: bsw@1490: if config.self_registration.manual_invitation then bsw@1490: local function secret_token() bsw@1490: local parts = {} bsw@1490: for i = 1, 5 do bsw@1490: parts[#parts+1] = multirand.string(5, "23456789bcdfghjkmnpqrstvwxyz") bsw@1490: end bsw@1490: return (table.concat(parts, "-")) bsw@1490: end bsw@1490: member.invite_code = secret_token() bsw@1490: member:save() bsw@1490: else bsw@1490: member:send_invitation() bsw@1490: end bsw/jbe@1309: bsw/jbe@1309: for i, unit_id in ipairs(config.self_registration.grant_privileges_for_unit_ids) do bsw/jbe@1309: local privilege = Privilege:new() bsw/jbe@1309: privilege.member_id = member.id bsw/jbe@1309: privilege.unit_id = unit_id bsw/jbe@1309: privilege.initiative_right = true bsw/jbe@1309: privilege.voting_right = true bsw/jbe@1309: privilege:save() bsw/jbe@1309: end bsw/jbe@1309: bsw/jbe@1309: update_data() bsw/jbe@1309: bsw/jbe@1309: verification.verified_member_id = verification.requesting_member_id bsw/jbe@1309: verification.verifying_member_id = app.session.member_id bsw/jbe@1309: verification.verified = "now" bsw/jbe@1309: bsw/jbe@1309: verification:save() bsw/jbe@1309: bsw/jbe@1309: bsw/jbe@1309: else bsw/jbe@1309: bsw/jbe@1309: update_data() bsw/jbe@1309: verification:save() bsw/jbe@1309: bsw/jbe@1309: end