<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://htyp.org/mw/index.php?action=history&amp;feed=atom&amp;title=Help%3ASandbox%2Fdiffs</id>
	<title>Help:Sandbox/diffs - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://htyp.org/mw/index.php?action=history&amp;feed=atom&amp;title=Help%3ASandbox%2Fdiffs"/>
	<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=Help:Sandbox/diffs&amp;action=history"/>
	<updated>2026-07-03T01:09:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://htyp.org/mw/index.php?title=Help:Sandbox/diffs&amp;diff=21824&amp;oldid=prev</id>
		<title>Woozle: cust base classes</title>
		<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=Help:Sandbox/diffs&amp;diff=21824&amp;oldid=prev"/>
		<updated>2016-05-22T16:40:45Z</updated>

		<summary type="html">&lt;p&gt;cust base classes&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;php&amp;gt;&lt;br /&gt;
class clsCusts extends clsTable_key_single {&lt;br /&gt;
    const TableName=&amp;#039;core_custs&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    // ++ SETUP ++ //&lt;br /&gt;
&lt;br /&gt;
    public function __construct($iDB) {&lt;br /&gt;
	parent::__construct($iDB);&lt;br /&gt;
	  $this-&amp;gt;Name(self::TableName);&lt;br /&gt;
	  $this-&amp;gt;KeyName(&amp;#039;ID&amp;#039;);&lt;br /&gt;
	  $this-&amp;gt;ClassSng(&amp;#039;clsCust&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- SETUP -- //&lt;br /&gt;
    // ++ CLASS NAMES ++ //&lt;br /&gt;
&lt;br /&gt;
    protected function NamesClass() {&lt;br /&gt;
	return &amp;#039;clsCustNames&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    protected function AddrsClass() {&lt;br /&gt;
	return &amp;#039;clsCustAddrs&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- CLASS NAMES -- //&lt;br /&gt;
    // ++ DATA TABLE ACCESS ++ //&lt;br /&gt;
&lt;br /&gt;
    protected function NameTable() {&lt;br /&gt;
	return $this-&amp;gt;Engine()-&amp;gt;Make($this-&amp;gt;NamesClass());&lt;br /&gt;
    }&lt;br /&gt;
    protected function AddrTable() {&lt;br /&gt;
	return $this-&amp;gt;Engine()-&amp;gt;Make($this-&amp;gt;AddrsClass());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- DATA RECORDS ACCESS -- //&lt;br /&gt;
&lt;br /&gt;
    public function Recs_forUser($idUser) {&lt;br /&gt;
	$rs = $this-&amp;gt;GetData(&amp;#039;(ID_Repl IS NULL) AND (ID_User=&amp;#039;.$idUser.&amp;#039;)&amp;#039;);&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- DATA RECORDS ACCESS -- //&lt;br /&gt;
    // ++ ACTIONS ++ //&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      ACTION: Creates records for customer, name, and address --&lt;br /&gt;
	everything needed to record a new customer.&lt;br /&gt;
    */&lt;br /&gt;
    public function CreateCustomer($idUser,vcCartData_NameAddress $oPerson) {&lt;br /&gt;
	$id = $this-&amp;gt;CreateRecord($idUser);&lt;br /&gt;
&lt;br /&gt;
        // create Name record&lt;br /&gt;
	$tNames = $this-&amp;gt;NameTable();&lt;br /&gt;
	$sName = $oPerson-&amp;gt;GetNameFieldValue();&lt;br /&gt;
	$idName = $tNames-&amp;gt;CreateRecord($id,$sName);&lt;br /&gt;
&lt;br /&gt;
	// create Address record&lt;br /&gt;
	$tAddrs = $this-&amp;gt;AddrTable();&lt;br /&gt;
	$idAddr = $tAddrs-&amp;gt;CreateRecord($id,$oPerson);&lt;br /&gt;
&lt;br /&gt;
	// fill in name &amp;amp; address IDs in Cart record (do we stil store those?)&lt;br /&gt;
	if (!is_null($idName) &amp;amp;&amp;amp; !is_null($idAddr)) {&lt;br /&gt;
	    $rcCust = $this-&amp;gt;GetItem($id);&lt;br /&gt;
	    $rcCust-&amp;gt;FinishRecord($idName,$idAddr);&lt;br /&gt;
	    return TRUE;&lt;br /&gt;
	} else {&lt;br /&gt;
	    return FALSE;&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    /* 2016-05-08 old version&lt;br /&gt;
    public function CreateCustomer($idUser,$sName,clsPerson $oPerson) {&lt;br /&gt;
	$id = $this-&amp;gt;CreateRecord($idUser);&lt;br /&gt;
&lt;br /&gt;
	// create Name record&lt;br /&gt;
	$tNames = $this-&amp;gt;NameTable();&lt;br /&gt;
	$idName = $tNames-&amp;gt;CreateRecord($id,$sName);&lt;br /&gt;
&lt;br /&gt;
	// create Address record&lt;br /&gt;
	$tAddrs = $this-&amp;gt;AddrTable();&lt;br /&gt;
	$idAddr = $tAddrs-&amp;gt;CreateRecord($id,$oPerson);&lt;br /&gt;
&lt;br /&gt;
	if (!is_null($idName) &amp;amp;&amp;amp; !is_null($idAddr)) {&lt;br /&gt;
	    $rcCust = $this-&amp;gt;GetItem($id);&lt;br /&gt;
	    $rcCust-&amp;gt;FinishRecord($idName,$idAddr);&lt;br /&gt;
	    return TRUE;&lt;br /&gt;
	} else {&lt;br /&gt;
	    return FALSE;&lt;br /&gt;
	}&lt;br /&gt;
    }//*/&lt;br /&gt;
    public function CreateRecord($idUser) {&lt;br /&gt;
	$arUpd = array(&lt;br /&gt;
	  &amp;#039;ID_User&amp;#039;	=&amp;gt; $idUser,&lt;br /&gt;
	  &amp;#039;WhenCreated&amp;#039;	=&amp;gt; &amp;#039;NOW()&amp;#039;,&lt;br /&gt;
	  );&lt;br /&gt;
	$ok = $this-&amp;gt;Insert($arUpd);&lt;br /&gt;
	if ($ok) {&lt;br /&gt;
	    return $this-&amp;gt;Engine()-&amp;gt;NewID();&lt;br /&gt;
	} else {&lt;br /&gt;
	    return NULL;&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- ACTIONS -- //&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
class clsCust extends clsVbzRecs {&lt;br /&gt;
&lt;br /&gt;
    // ++ FIELD CALCULATIONS ++ //&lt;br /&gt;
&lt;br /&gt;
    protected function SingleLine() {&lt;br /&gt;
	$oName = $this-&amp;gt;NameRecord();&lt;br /&gt;
	$oAddr = $this-&amp;gt;AddrObj();&lt;br /&gt;
	$txt = $oName-&amp;gt;ShortDescr();&lt;br /&gt;
	if (empty($oAddr)) {&lt;br /&gt;
	    $txt .= &amp;#039; (no address, cust ID=&amp;#039;.$this-&amp;gt;KeyValue().&amp;#039;)&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
	    $txt .= &amp;#039; - &amp;#039;.$oAddr-&amp;gt;ShortDescr();&lt;br /&gt;
	}&lt;br /&gt;
	$ht = htmlspecialchars($txt);&lt;br /&gt;
	return $ht;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- FIELD CALCULATIONS -- //&lt;br /&gt;
    // ++ CLASS NAMES ++ //&lt;br /&gt;
&lt;br /&gt;
    protected function MailAddrsClass() {&lt;br /&gt;
	return &amp;#039;clsCustAddrs&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    protected function PhonesClass() {&lt;br /&gt;
	return &amp;#039;clsCustPhones&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    protected function CardsClass() {&lt;br /&gt;
	return &amp;#039;clsCustCards&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- CLASS NAMES ++ //&lt;br /&gt;
    // ++ DATA TABLE ACCESS ++ //&lt;br /&gt;
&lt;br /&gt;
    protected function MailAddrTable($id=NULL) {&lt;br /&gt;
	return $this-&amp;gt;Engine()-&amp;gt;Make($this-&amp;gt;MailAddrsClass(),$id);&lt;br /&gt;
    }&lt;br /&gt;
    protected function PhoneTable($id=NULL) {&lt;br /&gt;
	return $this-&amp;gt;Engine()-&amp;gt;Make($this-&amp;gt;PhonesClass(),$id);&lt;br /&gt;
    }&lt;br /&gt;
    protected function CardTable($id=NULL) {&lt;br /&gt;
	return $this-&amp;gt;Engine()-&amp;gt;Make($this-&amp;gt;CardsClass(),$id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- DATA TABLE ACCESS -- //&lt;br /&gt;
    // ++ DATA RECORDS ACCESS ++ //&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of aliases for this customer ID&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-09 created for admin page&lt;br /&gt;
    */&lt;br /&gt;
    protected function Aliases_rs() {&lt;br /&gt;
	$id = $this-&amp;gt;KeyValue();&lt;br /&gt;
	$tbl = $this-&amp;gt;Table();&lt;br /&gt;
	$rs = $tbl-&amp;gt;GetData(&amp;#039;ID_Repl=&amp;#039;.$id,NULL,&amp;#039;ID&amp;#039;);&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of Names for this Customer&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-08 split off from AdminNames&lt;br /&gt;
    */&lt;br /&gt;
    public function Names() {&lt;br /&gt;
	$tbl = $this-&amp;gt;Engine()-&amp;gt;CustNames();&lt;br /&gt;
	$rs = $tbl-&amp;gt;GetData(&amp;#039;ID_Cust=&amp;#039;.$this-&amp;gt;KeyValue());&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of default name for this customer&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2013-11-09 Created for user-based checkout.&lt;br /&gt;
    */&lt;br /&gt;
    public function NameRecord() {&lt;br /&gt;
	$id = $this-&amp;gt;Value(&amp;#039;ID_Name&amp;#039;);&lt;br /&gt;
	if (is_null($id)) {&lt;br /&gt;
	    $rc = NULL;&lt;br /&gt;
	} else {&lt;br /&gt;
	    $rc = $this-&amp;gt;Engine()-&amp;gt;CustNames($id);&lt;br /&gt;
	}&lt;br /&gt;
	return $rc;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of all Addresses for this Customer, optionally filtered&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-08 split off from AdminAddrs&lt;br /&gt;
	2013-11-08 Added optional $iFilt parameter.&lt;br /&gt;
	2013-11-09 Moved most of the code to clsCusts::Recs_forCust()&lt;br /&gt;
    */&lt;br /&gt;
    public function Addrs($iFilt=NULL) {&lt;br /&gt;
	throw new exception(&amp;#039;Addrs() is deprecated; call AddrRecords().&amp;#039;);&lt;br /&gt;
	$tbl = $this-&amp;gt;MailAddrTable();&lt;br /&gt;
	$id = $this-&amp;gt;KeyValue();&lt;br /&gt;
	$rc = $tbl-&amp;gt;Recs_forCust($id,$iFilt);&lt;br /&gt;
	return $rc;&lt;br /&gt;
    }&lt;br /&gt;
    protected function AddrRecords($doVoided) {&lt;br /&gt;
	$tbl = $this-&amp;gt;MailAddrTable();&lt;br /&gt;
	$id = $this-&amp;gt;KeyValue();&lt;br /&gt;
	$sqlFilt = NULL;&lt;br /&gt;
	if (!$doVoided) {&lt;br /&gt;
	    $sqlFilt = &amp;#039;WhenVoid IS NULL&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$rc = $tbl-&amp;gt;Recs_forCust($id,$sqlFilt);&lt;br /&gt;
	return $rc;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of only active Addresses for this Customer&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2013-11-08 Created for user-based checkout.&lt;br /&gt;
    */&lt;br /&gt;
    public function AddrsActive() {&lt;br /&gt;
	return $this-&amp;gt;Addrs(&amp;#039;(WhenVoid IS NULL) AND NOT (WhenExp &amp;lt; NOW())&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of default address for this customer&lt;br /&gt;
	If ID_Addr is not set, returns first active record found.&lt;br /&gt;
	If there are no active records, returns NULL.&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2013-11-09 Added check for ID_Addr = NULL.&lt;br /&gt;
    */&lt;br /&gt;
    public function AddrObj() {&lt;br /&gt;
	$id = $this-&amp;gt;Value(&amp;#039;ID_Addr&amp;#039;);&lt;br /&gt;
	if (is_null($id)) {&lt;br /&gt;
	    $rc = $this-&amp;gt;AddrsActive();&lt;br /&gt;
	    if ($rc-&amp;gt;RowCount == 0) {&lt;br /&gt;
		$rc = NULL;&lt;br /&gt;
	    } else {&lt;br /&gt;
		$rc-&amp;gt;NextRow();		// load the first record&lt;br /&gt;
	    }&lt;br /&gt;
	} else {&lt;br /&gt;
	    $rc = $this-&amp;gt;Engine()-&amp;gt;CustAddrs($id);&lt;br /&gt;
	}&lt;br /&gt;
	return $rc;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of Emails for this Customer&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-08 split off from AdminEmails&lt;br /&gt;
    */&lt;br /&gt;
    public function Emails() {&lt;br /&gt;
	throw new exception(&amp;#039;Emails() is deprecated; call EmailRecords().&amp;#039;);&lt;br /&gt;
	$tbl = $this-&amp;gt;objDB-&amp;gt;CustEmails();&lt;br /&gt;
	$rs = $tbl-&amp;gt;GetData(&amp;#039;ID_Cust=&amp;#039;.$this-&amp;gt;KeyValue());&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
    protected function EmailAddrRecords() {&lt;br /&gt;
	$tbl = $this-&amp;gt;EmailAddrTable();&lt;br /&gt;
	$rs = $tbl-&amp;gt;GetData(&amp;#039;ID_Cust=&amp;#039;.$this-&amp;gt;KeyValue());&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of Phones for this Customer&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-08 split off from AdminPhones&lt;br /&gt;
    */&lt;br /&gt;
    public function Phones() {&lt;br /&gt;
	$tbl = $this-&amp;gt;PhoneTable();&lt;br /&gt;
	$rs = $tbl-&amp;gt;GetData(&amp;#039;ID_Cust=&amp;#039;.$this-&amp;gt;KeyValue());&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of Cards for this Customer&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-08 split off from AdminCards&lt;br /&gt;
    */&lt;br /&gt;
    public function Cards() {&lt;br /&gt;
	throw new exception(&amp;#039;Cards() is deprecated; call CardRecords().&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    public function CardRecords() {&lt;br /&gt;
	$tbl = $this-&amp;gt;CardTable();&lt;br /&gt;
	$rs = $tbl-&amp;gt;GetData(&amp;#039;ID_Cust=&amp;#039;.$this-&amp;gt;KeyValue());&lt;br /&gt;
	return $rs;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- DATA RECORD ACCESS -- //&lt;br /&gt;
    // ++ DATA RECORD ARRAYS ++ //&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // TODO: Each of these table-types needs a GetData_active() method, and we should be using that instead.&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of Names for all records in the current set&lt;br /&gt;
    */&lt;br /&gt;
    public function NameRecords_forRows() {&lt;br /&gt;
	$sqlIDs = $this-&amp;gt;KeyListSQL();&lt;br /&gt;
	return $this-&amp;gt;NameTable()-&amp;gt;GetData(&amp;quot;isActive AND (ID_Cust IN ($sqlIDs))&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public function AddrRecords_forRows() {&lt;br /&gt;
	$sqlIDs = $this-&amp;gt;KeyListSQL();&lt;br /&gt;
	return $this-&amp;gt;MailAddrTable()-&amp;gt;GetData(&amp;quot;(WhenVoid IS NULL) AND (NOW() &amp;lt;= IFNULL(WhenExp,NOW())) AND (ID_Cust IN ($sqlIDs))&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public function CardRecords_forRows() {&lt;br /&gt;
	$sqlIDs = $this-&amp;gt;KeyListSQL();&lt;br /&gt;
	return $this-&amp;gt;CardTable()-&amp;gt;GetData(&amp;quot;isActive AND (NOW() &amp;lt;= IFNULL(WhenInvalid,NOW())) AND (ID_Cust IN ($sqlIDs))&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function AsArray($doNames,$doAddrs,$doCards) {&lt;br /&gt;
	$ar = NULL;&lt;br /&gt;
	while ($this-&amp;gt;NextRow()) {&lt;br /&gt;
	    $idCust = $this-&amp;gt;KeyValue();&lt;br /&gt;
	    $qRows = 0;&lt;br /&gt;
&lt;br /&gt;
	    if ($doNames) {&lt;br /&gt;
		$rs = $this-&amp;gt;Names();	// get names for this customer&lt;br /&gt;
		while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
		    $qRows++;&lt;br /&gt;
		    $idName = $rs-&amp;gt;KeyValue();&lt;br /&gt;
		    $sName = $rs-&amp;gt;ShortDescr();&lt;br /&gt;
		    $ar[$idCust][&amp;#039;names&amp;#039;][$idName] = $sName;&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    if ($doAddrs) {&lt;br /&gt;
		$rs = $this-&amp;gt;AddrRecords(FALSE);	// get addresses for this customer&lt;br /&gt;
		while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
		    $qRows++;&lt;br /&gt;
		    $idAddr = $rs-&amp;gt;KeyValue();&lt;br /&gt;
		    $ht = htmlspecialchars($rs-&amp;gt;AsSingleLine());&lt;br /&gt;
		    $ar[$idCust][&amp;#039;addrs&amp;#039;][$idAddr] = $ht;&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    if ($doCards) {&lt;br /&gt;
		$rs = $this-&amp;gt;CardRecords(FALSE);	// get addresses for this customer&lt;br /&gt;
		while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
		    $qRows++;&lt;br /&gt;
		    $idRow = $rs-&amp;gt;KeyValue();&lt;br /&gt;
		    $ht = htmlspecialchars($rs-&amp;gt;AsSingleLine());&lt;br /&gt;
		    $ar[$idCust][&amp;#039;cards&amp;#039;][$idRow] = $ht;&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	    if ($qRows &amp;gt; 0) {&lt;br /&gt;
		$sCust = $this-&amp;gt;SingleLine();&lt;br /&gt;
		$ar[$idCust][&amp;#039;cust&amp;#039;] = $sCust;&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
	return $ar;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: array of orders for this customer&lt;br /&gt;
      FUTURE: also check ID_Buyer and ID_Recip&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2012-01-08 split off from AdminOrders(), moved from admin.cust to base.cust&lt;br /&gt;
    */&lt;br /&gt;
    protected function Orders_array() {&lt;br /&gt;
	$tOrd = $this-&amp;gt;Engine()-&amp;gt;Orders();&lt;br /&gt;
	$idCust = $this-&amp;gt;KeyValue();&lt;br /&gt;
	$arRow = NULL;&lt;br /&gt;
	$arOrd = NULL;&lt;br /&gt;
&lt;br /&gt;
	// collect orders where customer is buyer&lt;br /&gt;
	$rs = $tOrd-&amp;gt;GetData(&amp;#039;ID_Buyer=&amp;#039;.$idCust);&lt;br /&gt;
	while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
	    $idOrd = $rs-&amp;gt;KeyValue();&lt;br /&gt;
	    $arRow = $rs-&amp;gt;Values();&lt;br /&gt;
	    $arRow[&amp;#039;roles&amp;#039;] = nz($arRow[&amp;#039;roles&amp;#039;]).&amp;#039;B&amp;#039;;&lt;br /&gt;
	    $arOrd[$idOrd] = $arRow;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// collect orders where customer is recipient&lt;br /&gt;
	$rs = $tOrd-&amp;gt;GetData(&amp;#039;ID_Recip=&amp;#039;.$idCust);&lt;br /&gt;
	while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
	    $idOrd = $rs-&amp;gt;KeyValue();&lt;br /&gt;
	    if (array_key_exists($idOrd,$arOrd)) {&lt;br /&gt;
		$arRow = $arOrd[$idOrd];&lt;br /&gt;
	    } else {&lt;br /&gt;
		$arRow = $rs-&amp;gt;Values();&lt;br /&gt;
	    }&lt;br /&gt;
	    $arRow[&amp;#039;roles&amp;#039;] = nz($arRow[&amp;#039;roles&amp;#039;]).&amp;#039;R&amp;#039;;&lt;br /&gt;
	    $arOrd[$idOrd] = $arRow;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return $arOrd;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- DATA RECORD ARRAYS -- //&lt;br /&gt;
    // ++ ACTIONS ++ //&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      USED BY: Customers table&lt;br /&gt;
    */&lt;br /&gt;
    public function FinishRecord($idName,$idAddr) {&lt;br /&gt;
	$arUpd = array(&lt;br /&gt;
	  &amp;#039;ID_Name&amp;#039;	=&amp;gt; $idName,&lt;br /&gt;
	  &amp;#039;ID_Addr&amp;#039;	=&amp;gt; $idAddr,&lt;br /&gt;
	  &amp;#039;WhenCreated&amp;#039;	=&amp;gt; &amp;#039;NOW()&amp;#039;,&lt;br /&gt;
	  );&lt;br /&gt;
	$ok = $this-&amp;gt;Update($arUpd);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -- ACTIONS -- //&lt;br /&gt;
    // ++ WEB UI ++ //&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: HTML for a drop-down list of all Addresses belonging to&lt;br /&gt;
	any of the Customer records in the current set&lt;br /&gt;
    */&lt;br /&gt;
    public function Render_DropDown_Addrs($sName) {&lt;br /&gt;
	$out = NULL;&lt;br /&gt;
	$rs = $this-&amp;gt;AddrRecords_forRows();&lt;br /&gt;
	if (is_null($rs) || ($rs-&amp;gt;RowCount() == 0)) {&lt;br /&gt;
	    $out .= &amp;#039;No addresses found.&amp;#039;;	// should this actually ever happen?&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;quot;\n&amp;lt;select name=&amp;#039;$sName&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	    while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
		  $id = $rs-&amp;gt;KeyValue();&lt;br /&gt;
		  $sRow = $rs-&amp;gt;AsString(&amp;#039; / &amp;#039;);&lt;br /&gt;
		  $ht = htmlspecialchars($sRow);&lt;br /&gt;
		  $out .= &amp;quot;\n&amp;lt;option value=$id&amp;gt;$ht&amp;lt;/option&amp;gt;&amp;quot;;&lt;br /&gt;
	    }&lt;br /&gt;
	    $out .= &amp;quot;\n&amp;lt;/select&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: HTML for a drop-down list of all Cards belonging to&lt;br /&gt;
	any of the Customer records in the current set&lt;br /&gt;
    */&lt;br /&gt;
    public function Render_DropDown_Cards($sName) {&lt;br /&gt;
	$out = NULL;&lt;br /&gt;
	$rs = $this-&amp;gt;CardRecords_forRows();&lt;br /&gt;
	if (is_null($rs) || ($rs-&amp;gt;RowCount() == 0)) {&lt;br /&gt;
	    $out .= &amp;#039;No cards found.&amp;#039;;	// should this actually ever happen?&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;quot;\n&amp;lt;select name=&amp;#039;$sName&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	    while ($rs-&amp;gt;NextRow()) {&lt;br /&gt;
		  $id = $rs-&amp;gt;KeyValue();&lt;br /&gt;
		  $sRow = $rs-&amp;gt;SafeString();&lt;br /&gt;
		  $ht = htmlspecialchars($sRow);&lt;br /&gt;
		  $out .= &amp;quot;\n&amp;lt;option value=$id&amp;gt;$ht&amp;lt;/option&amp;gt;&amp;quot;;&lt;br /&gt;
	    }&lt;br /&gt;
	    $out .= &amp;quot;\n&amp;lt;/select&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: HTML for a drop-down list of all the customers&lt;br /&gt;
	in the current recordset&lt;br /&gt;
      NOTE: This is somewhat DEPRECATED&lt;br /&gt;
    */&lt;br /&gt;
    public function Render_DropDown($iName,$doNames,$doAddrs,$doCards) {&lt;br /&gt;
	$ar = $this-&amp;gt;AsArray($doNames,$doAddrs,$doCards);&lt;br /&gt;
&lt;br /&gt;
	// output the results&lt;br /&gt;
&lt;br /&gt;
	$out = NULL;&lt;br /&gt;
&lt;br /&gt;
	if (is_null($ar) || (count($ar) == 0)) {&lt;br /&gt;
	    $out .= &amp;#039;No entries found.&amp;#039;;	// should this actually ever happen?&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;quot;\n&amp;lt;select name=\&amp;quot;$iName\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	    foreach ($ar as $idCust =&amp;gt; $arCust) {&lt;br /&gt;
&lt;br /&gt;
		//$ht = escapeshellarg($arCust[&amp;#039;cust&amp;#039;]);&lt;br /&gt;
		if (array_key_exists(&amp;#039;addrs&amp;#039;,$arCust)) {&lt;br /&gt;
		    $ht = escapeshellarg(&amp;quot;customer ID #$idCust&amp;quot;);&lt;br /&gt;
		    $out .= &amp;quot;\n&amp;lt;optgroup label=$ht&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		    $arAddr = $arCust[&amp;#039;addrs&amp;#039;];&lt;br /&gt;
		    foreach ($arAddr as $idAddr =&amp;gt; $sAddr) {&lt;br /&gt;
			$ht = htmlspecialchars($sAddr);&lt;br /&gt;
			$out .= &amp;quot;\n&amp;lt;option value=$idAddr&amp;gt;$ht&amp;lt;/option&amp;gt;&amp;quot;;&lt;br /&gt;
		    }&lt;br /&gt;
&lt;br /&gt;
		    $out .= &amp;quot;\n&amp;lt;/optgroup&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (array_key_exists(&amp;#039;cards&amp;#039;,$arCust)) {&lt;br /&gt;
		    // TODO: finish&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    $out .= &amp;quot;\n&amp;lt;/select&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>
	</entry>
</feed>