CREATE OR REPLACE FUNCTION logoutuser(integer) RETURNS integer AS '
  DECLARE
    _canlogout varchar;
    contactid integer;
    _phoneid integer;
    pw integer;
    pcontact integer;
    pevent integer;
    worktime integer;
  BEGIN
    _phoneid := $1;
    SELECT INTO pw pairedwith FROM phone WHERE id = _phoneid;

    -- who is currently logged in to this phone?
    SELECT INTO contactid, _canlogout id, canlogout
      FROM contact WHERE phone = _phoneid AND status <> ''deleted'' LIMIT 1;

    IF NOT FOUND OR contactid <= 1 THEN
      -- See if someone is logged in on the paired phone.
      RAISE NOTICE ''nobody logged in on phone %'', _phoneid;
      IF pw <= 1 OR pw = _phoneid THEN
        -- no paired phone: done.
        RETURN ''1'';
      ELSE
        SELECT INTO contactid, _canlogout id, canlogout
          FROM contact WHERE phone = pw AND status <> ''deleted'' LIMIT 1;

        IF NOT FOUND OR contactid <= 1 THEN
          RAISE NOTICE ''nobody logged in on paired phone %'', pw;
          RETURN ''1'';
        ELSE
          RAISE NOTICE ''user % logged in on paired phone %'', contactid, pw;
          _phoneid := pw;
          pw := $1;
        END IF;
      END IF;
    END IF;

    IF _canlogout <> ''yes'' THEN
      RAISE NOTICE ''user % cannot logout'', contactid;
      RETURN ''0'';
    END IF;

    SELECT INTO pevent, worktime event, cast(extract(epoch FROM CURRENT_TIMESTAMP - stamp) as integer)
      FROM contacthist WHERE contact = contactid AND event IN (''40'', ''41'') ORDER BY stamp DESC LIMIT 1;
    IF pevent = ''40'' THEN
      INSERT INTO contacthist (contact, stamp, event, int2, parm1) VALUES
        (contactid, CURRENT_TIMESTAMP, ''41'', worktime, ''Logoff'');
    END IF;

    UPDATE contact SET phone = 1 WHERE phone = _phoneid;
    INSERT INTO activate(action, type, which, status, created)
      VALUES (''modify'', ''contact'', contactid, ''QUEUED'', CURRENT_TIMESTAMP);

    PERFORM dologoutuser(_phoneid, contactid);

    IF pw > 1 AND pw <> _phoneid THEN
      -- Is anyone else logged in to the paired phone?
      -- This should not happen.
      SELECT INTO pcontact, _canlogout id, canlogout
        FROM contact WHERE phone = pw AND status <> ''deleted'' LIMIT 1;
      IF FOUND AND pcontact > 1 AND pcontact <> contactid THEN
        RAISE NOTICE ''ERROR: another user % logged in on paired phone %'', pcontact, pw;
        -- Should we log him out?
      ELSE
        PERFORM dologoutuser(pw, contactid);
      END IF;
    END IF;

    return ''1'';
  END;
' LANGUAGE plpgsql;
