generalize IIF/OIF compatibility viewer and editor

* renderTwoColumnCompatTableViewer(): new generic function
* renderIIFOIFCompat(): update to use above
* renderTwoColumnCompatTableEditor(): new generic function
* renderIIFOIFCompatEditor(): update to use above
new feature: patch cables accounting

This commit implements basic management of patch cables stock. It allows
for generic types of cables and connectors and comes preconfigured for
common assemblies like fiber optics, twisted pair and such. There is a
configuration page for further customization.

The user can consume/replenish an arbitrary amount of patch cables on
the cable heaps page or consume 1 cable on the port linker pop-up
through a new SELECT that suggests only the patch cable heaps compatible
with the current port type. There is a minimalistic event log for
changes in the amount.

Implementing this data model takes 6 new SQL tables with a foreign key
to the recently introduced PortOuterInterface.

* getPatchCableConnectorList(): new function
* getPatchCableTypeList(): new function
* getPatchCableConnectorOptions(): new function
* getPatchCableTypeOptions(): new function
* getPatchCableHeapSummary(): new function
* getPatchCableHeapOptionsForOIF(): new function
* getPatchCableConnectorCompat(): new function
* getPatchCableOIFCompat(): new function
* commitModifyPatchCableAmount(): new function
* commitSetPatchCableAmount(): new function
* getPatchCableHeapLogEntries(): new function
* addPatchCableHeapLogEntry(): new function
* genericAssertion(): update for "decimal" assertion type
* formatPatchCableHeapAsPlainText(): new function
* install.php: add the new SQL tables w/data
* upgrade.php: idem
* getPatchCableHeapCursorCode(): new function
* renderPatchCableHeapSummary(): new function
* renderPatchCableHeapEditor(): new function
* renderPatchCableHeapAmount(): new function
* renderSimpleTableWithOriginViewer(): new function
* renderSimpleTableWithOriginEditor(): new function
* renderPatchCableConfiguration(): new function
* renderPatchCableConnectorEditor(): new function
* renderPatchCableTypeEditor(): new function
* renderPatchCableConnectorCompatEditor(): new function
* renderPatchCableOIFCompatEditor(): new function
* navigation.php: update $indexlayout and add two new pages
* consumePatchCable(): new function
* replenishPatchCable(): new function
* setPatchCableAmount(): new function
* handlePopupPortLink(): update
* renderPopupPortSelector(): update
* triggerPatchCableHeapsConfigured(): new function
dictionary: add some new NEC and MikroTik devices
fixup charset and collation in PortOuterInterface