dbxapp Wissen dbxapp Modulhandbuch – Datenmodell und DD

dbxapp Modulhandbuch – Datenmodell und DD

Modulhandbuch · Kapitel 2 von 8

Datenmodell und DD

Modulkonfiguration sowie DD-Verträge für Rechnungskopf und Rechnungspositionen.

Kapitel 2 des verbindlichen Modulhandbuchs für das Referenzmodul myInvoices.

1. Modulkonfiguration

Datei cfg/config.php:

<?php
$config['version'] = '1.0';
$config['activ'] = '1';
$config['groups'] = 'admin';
$config['page_size'] = '20';
?>
if($resolved !==$expectedBase . 'files/test/') $config

Die Konfiguration schützt nur den Moduleinstieg und enthält keine doppelte Beschreibung einzelner Standardaktionen. Die automatische Action-Policy bindet das Token an Route und Rechnungs-ID; ein Token für Rechnung 17 gilt deshalb nicht für Rechnung 18. Fachwerte gehören nicht in eine parallele JSON-Datei oder in JavaScript.

2. DD des Rechnungskopfs

Datei dd/invoice.dd.php. Doxygen bindet die tatsächlich ausgeführte DD direkt ein; Dokumentation und Modul können dadurch nicht auseinanderlaufen:

<?php
/* =========================================================
TABLE
========================================================= */
$table['server']='myInvoices|myInvoices.db3';
$table['table']='invoice';
$table['datadic']='invoice';
$table['primary']='id';
$table['language']='0';
$table['version']='1.0';
$table['autosync']='1';
$table['cache']='0';
$table['trash']='0';
$table['trace']='0';
$table['update_sql']='';
$table['default_sort']='invoice_date DESC, invoice_no DESC';
$table['form-dd-table']='';
$table['read']='admin';
$table['create']='admin';
$table['update']='admin';
$table['delete']='admin';
$table['read_owner']='admin,owner';
$table['create_owner']='admin,owner';
$table['update_owner']='admin,owner';
$table['delete_owner']='admin,owner';
/* =========================================================
FIELDS
========================================================= */
$field['name']='id';
$field['type']='int';
$field['index']='PRI';
$field['length']='11';
$field['default']='';
$field['label']='ID';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='create_date';
$field['type']='datetime';
$field['index']='MUL';
$field['length']='-1';
$field['default']='';
$field['label']='Erstellt';
$field['rules']='datetime';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='date_time';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='create_uid';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Erstellt von';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='update_date';
$field['type']='datetime';
$field['index']='MUL';
$field['length']='-1';
$field['default']='';
$field['label']='Aktualisiert';
$field['rules']='datetime';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='date_time';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='update_uid';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Aktualisiert von';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='owner';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Owner';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='invoice_no';
$field['type']='varchar';
$field['index']='UNI';
$field['length']='40';
$field['default']='';
$field['label']='Rechnungsnummer';
$field['rules']='parameter|min=2|max=40';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
$field['name']='invoice_date';
$field['type']='date';
$field['index']='MUL';
$field['length']='-1';
$field['default']='';
$field['label']='Rechnungsdatum';
$field['rules']='date';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='date';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='date-label';
$field['js']='';
$field['prompt']='';
$field['name']='customer';
$field['type']='varchar';
$field['index']='MUL';
$field['length']='180';
$field['default']='';
$field['label']='Kunde';
$field['rules']='*|min=2|max=180';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
$field['name']='status';
$field['type']='varchar';
$field['index']='MUL';
$field['length']='24';
$field['default']='draft';
$field['label']='Status';
$field['rules']='parameter|max=24';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='draft=Entwurf&open=Offen&paid=Bezahlt';
$field['tpl']='select-single-label';
$field['js']='';
$field['prompt']='';
$field['name']='total_gross';
$field['type']='decimal';
$field['index']='';
$field['length']='12,2';
$field['default']='0';
$field['label']='Rechnungssumme';
$field['rules']='decimal';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
/* =========================================================
INDEXES
========================================================= */
$index['name']='pk_invoice';
$index['type']='PRIMARY';
$index['fields']='id';
$index['unique']='1';
$index['comment']='from field index PRI';
$index['name']='idx_invoice_create_date';
$index['type']='INDEX';
$index['fields']='create_date';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_create_uid';
$index['type']='INDEX';
$index['fields']='create_uid';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_update_date';
$index['type']='INDEX';
$index['fields']='update_date';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_update_uid';
$index['type']='INDEX';
$index['fields']='update_uid';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_owner';
$index['type']='INDEX';
$index['fields']='owner';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='uidx_invoice_invoice_no';
$index['type']='UNIQUE';
$index['fields']='invoice_no';
$index['unique']='1';
$index['comment']='from field index UNI';
$index['name']='idx_invoice_invoice_date';
$index['type']='INDEX';
$index['fields']='invoice_date';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_customer';
$index['type']='INDEX';
$index['fields']='customer';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_status';
$index['type']='INDEX';
$index['fields']='status';
$index['unique']='0';
$index['comment']='from field index MUL';
$table['server']
Definition .dd.php:6
$indexes[]
Definition .dd.php:167
$field

total_gross ist ein fachlicher Snapshot, kein dbx-Systemfeld. Er wird beim Ändern von Positionen innerhalb derselben Fachtransaktion aktualisiert. Die Reportcallbacks formatieren und summieren ihn, verändern ihn aber nicht.

3. DD der Rechnungspositionen

Datei dd/invoiceItem.dd.php. Auch hier ist die ausführbare DD selbst die einzige Quelle der Dokumentation:

<?php
/* =========================================================
TABLE
========================================================= */
$table['server']='myInvoices|myInvoices.db3';
$table['table']='invoice_item';
$table['datadic']='invoiceItem';
$table['primary']='id';
$table['language']='0';
$table['version']='1.0';
$table['autosync']='1';
$table['cache']='0';
$table['trash']='0';
$table['trace']='0';
$table['update_sql']='';
$table['default_sort']='invoice_id ASC, position_no ASC';
$table['form-dd-table']='';
$table['read']='admin';
$table['create']='admin';
$table['update']='admin';
$table['delete']='admin';
$table['read_owner']='admin,owner';
$table['create_owner']='admin,owner';
$table['update_owner']='admin,owner';
$table['delete_owner']='admin,owner';
/* =========================================================
FIELDS
========================================================= */
$field['name']='id';
$field['type']='int';
$field['index']='PRI';
$field['length']='11';
$field['default']='';
$field['label']='ID';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='create_date';
$field['type']='datetime';
$field['index']='MUL';
$field['length']='-1';
$field['default']='';
$field['label']='Erstellt';
$field['rules']='datetime';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='date_time';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='create_uid';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Erstellt von';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='update_date';
$field['type']='datetime';
$field['index']='MUL';
$field['length']='-1';
$field['default']='';
$field['label']='Aktualisiert';
$field['rules']='datetime';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='date_time';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='update_uid';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Aktualisiert von';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='owner';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Owner';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='invoice_id';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='0';
$field['label']='Rechnung';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='hidden';
$field['js']='';
$field['prompt']='';
$field['name']='position_no';
$field['type']='int';
$field['index']='MUL';
$field['length']='11';
$field['default']='10';
$field['label']='Pos.';
$field['rules']='int';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
$field['name']='article_no';
$field['type']='varchar';
$field['index']='MUL';
$field['length']='80';
$field['default']='';
$field['label']='Artikelnummer';
$field['rules']='parameter|max=80';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
$field['name']='description';
$field['type']='varchar';
$field['index']='';
$field['length']='255';
$field['default']='';
$field['label']='Artikel';
$field['rules']='*|min=2|max=255';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
$field['name']='quantity';
$field['type']='decimal';
$field['index']='';
$field['length']='10,2';
$field['default']='1';
$field['label']='Menge';
$field['rules']='decimal';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
$field['name']='unit_price';
$field['type']='decimal';
$field['index']='';
$field['length']='12,2';
$field['default']='0';
$field['label']='Einzelpreis';
$field['rules']='decimal';
$field['tooltip']='';
$field['errormsg']='';
$field['placeholder']='';
$field['convert']='';
$field['protect']='0';
$field['group']='';
$field['mask']='';
$field['data']='';
$field['options']='';
$field['tpl']='text-label';
$field['js']='';
$field['prompt']='';
/* =========================================================
INDEXES
========================================================= */
$index['name']='pk_invoice_item';
$index['type']='PRIMARY';
$index['fields']='id';
$index['unique']='1';
$index['comment']='from field index PRI';
$index['name']='idx_invoice_item_create_date';
$index['type']='INDEX';
$index['fields']='create_date';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_create_uid';
$index['type']='INDEX';
$index['fields']='create_uid';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_update_date';
$index['type']='INDEX';
$index['fields']='update_date';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_update_uid';
$index['type']='INDEX';
$index['fields']='update_uid';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_owner';
$index['type']='INDEX';
$index['fields']='owner';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_invoice_id';
$index['type']='INDEX';
$index['fields']='invoice_id';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_position_no';
$index['type']='INDEX';
$index['fields']='position_no';
$index['unique']='0';
$index['comment']='from field index MUL';
$index['name']='idx_invoice_item_article_no';
$index['type']='INDEX';
$index['fields']='article_no';
$index['unique']='0';
$index['comment']='from field index MUL';

Beide DDs enthalten die Systemfelder create_date, create_uid, owner, update_date und update_uid. Diese Werte werden automatisch von dbxDB gesetzt. Das Modul setzt sie weder beim Insert noch beim Update selbst. Genau das ist ein Vorteil der DD-Nutzung. Die DDs folgen dem dbxapp-Exportformat mit expliziten TABLE-, FIELDS- und INDEXES-Abschnitten. Es gibt darin keine Closure oder Hilfsmethode, welche Feldattribute verbirgt.