<feed xmlns='http://www.w3.org/2005/Atom'>
<title>contact, branch master</title>
<subtitle>Bitweaver contact package repository
</subtitle>
<id>https://git.rdm1.uk/contact/.git/atom?h=master</id>
<link rel='self' href='https://git.rdm1.uk/contact/.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/'/>
<updated>2026-06-19T13:11:28Z</updated>
<entry>
<title>Move linked user_id field into Liberty Extensions tab, first position</title>
<updated>2026-06-19T13:11:28Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-19T13:11:28Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=0dc95235f38a2f20fe8334ec7c28beb19cb01042'/>
<id>urn:sha1:0dc95235f38a2f20fe8334ec7c28beb19cb01042</id>
<content type='text'>
Removed from the legacy edit_contact.tpl; placed at the top of the
Liberty Extensions tab in edit.tpl, gated on p_contact_admin, using
the same plain form-group style as surrounding fields.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Map contact persons to registered users via contact.role_id</title>
<updated>2026-06-19T13:05:07Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-19T13:05:07Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=5d3e672dd7f35c348a98fd149c02c5c9d79cb520'/>
<id>urn:sha1:5d3e672dd7f35c348a98fd149c02c5c9d79cb520</id>
<content type='text'>
contact.role_id stores the user_id of the linked registered user (NULL = no
account). load() joins users_users on role_id to expose linked_user_login and
linked_user_name. verify() accepts user_id from the edit form and writes it to
contact_store['role_id']. getList() now filters by user_id key (was role_id).
Edit form shows the user_id field to admins with current login shown inline;
display template shows the linked user when set.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix P01 name xref being wiped when saving type checkboxes</title>
<updated>2026-06-18T20:25:38Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-18T20:25:38Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=53bb19704b1e99245b755caf2d573a4406066902'/>
<id>urn:sha1:53bb19704b1e99245b755caf2d573a4406066902</id>
<content type='text'>
The bulk DELETE of P*/B* xrefs was removing P01 (which carries the
pipe-encoded name) whenever contact_types were saved. P01 is implied
for all persons and never submitted as a checkbox, so it was never
re-inserted. Fix handles P01 separately — always delete/rewrite it
from pParamHash['name'] — and excludes it from the checkbox cycle.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add CLAUDE.md with contact package developer notes</title>
<updated>2026-06-14T15:23:59Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-14T15:23:59Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=c6775b6deb8a44d5b500dcb52fadb5667e61df46'/>
<id>urn:sha1:c6775b6deb8a44d5b500dcb52fadb5667e61df46</id>
<content type='text'>
Covers person/business model, ContactPerson/ContactBusiness subclass
plan, SCREF, Contact::load() cleanup, CSV xorder, delete/expunge.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Introduce ContactPerson and ContactBusiness subclasses</title>
<updated>2026-06-11T18:26:25Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-11T18:26:25Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=64aae1e41d9288a6d9709781af29b06fe6adb5ca'/>
<id>urn:sha1:64aae1e41d9288a6d9709781af29b06fe6adb5ca</id>
<content type='text'>
Splits the Contact class into ContactPerson (content_type_guid='contactperson')
and ContactBusiness (content_type_guid='contactbusiness'), each using 'contact'
as the shared package-level xref schema. Replaces the $isPerson/$00 xref hack
with proper class identity via instanceof.

- ContactPerson.php, ContactBusiness.php: new subclasses
- Contact.php: loadXrefTypeList() reads type tags directly from liberty_xref;
  getAvailableTypeItems() for edit form (schema-driven with pre-upgrade fallback);
  getDisplayUrl() now points to display_contact.php
- Type item codes: P01/P02 (person), B01-B04 (business, B01=Service new)
- list_people.php, list_businesses.php: separate list pages per type
- list_contacts.php: combined display-layer merge of both types
- 5.0.3.php: upgrade script migrating existing data to new content types and codes
- Templates: isPerson flag from instanceof; horizontal type checkboxes; list.tpl
  accepts $listTitle; menu adds People/Businesses entries

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Remove duplicate ipackage attributes from biticon calls</title>
<updated>2026-06-07T15:51:54Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-07T15:51:54Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=27c615a0a26edb985543e520587e3043d91489f6'/>
<id>urn:sha1:27c615a0a26edb985543e520587e3043d91489f6</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>contact: fix null mUserId producing invalid SQL for anonymous users</title>
<updated>2026-06-06T21:06:57Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-06T21:06:57Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=109dc9aca9308fe2086c4a8d9c8ec2ac28e75848'/>
<id>urn:sha1:109dc9aca9308fe2086c4a8d9c8ec2ac28e75848</id>
<content type='text'>
Direct string concatenation of mUserId into JOIN conditions produces
'purm.user_id=' (no value) when mUserId is null for anonymous users,
giving Firebird -104 Token unknown. Cast to (int) with ?? 0 fallback.

Affects ContactType::setup() and Contact::loadAddressList().

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>contact: docblock tidy and remove dead Xref scaffolding</title>
<updated>2026-06-06T17:11:48Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-06T17:11:48Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=86a501258879b68e28636eb680d2320fc24819e6'/>
<id>urn:sha1:86a501258879b68e28636eb680d2320fc24819e6</id>
<content type='text'>
Add/update docblocks across Contact, ContactType, ImportContactCSV.
Fix @package articles typo in ContactType.
Delete ContactXref, ContactXrefType, and lookup_contact_xref_type_inc —
all three were unwired scaffolding with no callers.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>import: cull legacy importers; move data to storage/contact/</title>
<updated>2026-06-06T16:22:14Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-06T16:22:14Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=3270cd788cc6fb06f35aaf56f8c1d76b24cb609e'/>
<id>urn:sha1:3270cd788cc6fb06f35aaf56f8c1d76b24cb609e</id>
<content type='text'>
Remove one-off importers: Phx, Sage, Wande, old Contact/ContactOld
classes, load_contacts/phx/sage/wande scripts, schema_import_inc,
phx SQL, xmail files, mbox/mime email pipeline stubs.

Add CONTACT_IMPORT_PATH = STORAGE_PKG_PATH.'contact/' to bit_setup_inc.
Update load_contacts_csv.php to use CONTACT_IMPORT_PATH.

Email-to-contact pipeline (Mbox/mime/phail) retained as pending todo.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>schema: tighten account group role_id to 3; add SAGEID; add export_contacts.php</title>
<updated>2026-06-06T14:56:04Z</updated>
<author>
<name>Lester Caine</name>
<email>lester@lsces.co.uk</email>
</author>
<published>2026-06-06T14:56:04Z</published>
<link rel='alternate' type='text/html' href='https://git.rdm1.uk/contact/.git/commit/?id=0c9654cefb83ec95c76d849e477854c6b734cd98'/>
<id>urn:sha1:0c9654cefb83ec95c76d849e477854c6b734cd98</id>
<content type='text'>
account xref_group and items: role_id 4 → 3 (Registered, not Editors).
ACC_TO, VAT_NO: same role_id correction.
ACCNO replaced with SAGEID (SAGE Account Reference).
export_contacts.php: new CSV export (one row per contact, phones/emails/address).

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
