gaebboss
GAEB DA XML is how German construction tenders travel: the Leistungsverzeichnis (bill of quantities) goes out as X83, bidders send their prices back as X84, the order is placed as X86. gaebboss reads every version from 3.0 to 3.3, writes X83, X84 and X86 that the official schemas accept, and turns a tender into a priced bid without a single floating-point operation.
It is built from the standard, not from other parsers: the typed model, the readers, the writers and the per-phase rules are generated from the official XSDs that GAEB publishes. Where the Fachdokumentation prescribes a rule, such as how totals round or which items count towards the sum, that rule is implemented and tested against the official sample files.
What you get
gaebboss-core, a Rust crate with no C dependencies: tokenizer, typed model, navigation over categories and items, text projections, writers, validation and bid construction.gaebboss, the command line:info,items,text,json,validate,roundtrip,bid.gaebboss, the Python package: the same engine behind a small API that hands outdecimal.Decimal, never floats.
How it treats bad input
Real files are not clean. Vendor elements, HTML where the schema has none, decimal commas, duplicated elements, truncated files and Latin-1 bytes under a UTF-8 declaration all occur in the wild. gaebboss reads all of them, reports each defect as a warning with its byte offset, keeps unknown elements for writing back, and raises an error only when the input is not GAEB DA XML at all.
Quickstart
cargo install gaebboss-cli
pip install gaebboss
Look at a tender:
gaebboss info tender.X83
gaebboss items tender.X83
gaebboss text tender.X83 --oz 01.02.0010 --markdown
Price it:
gaebboss items tender.X83 --tsv | cut -f1 > prices.csv # then add ",<unit price>" per line
cat > bidder.toml <<'EOT'
name1 = "Bau GmbH"
street = "Weg 1"
pcode = "12345"
city = "Berlin"
vat_percent = "19"
EOT
gaebboss bid tender.X83 --prices prices.csv --bidder bidder.toml -o bid.X84
gaebboss validate bid.X84 --tender tender.X83
The same in Python:
from decimal import Decimal
import gaebboss
tender = gaebboss.Document("tender.X83")
for item in tender.items():
print(item.oz, item.quantity, item.unit, item.short_text)
bid = gaebboss.Bid.from_tender(tender, {"name1": "Bau GmbH", "street": "Weg 1", "pcode": "12345", "city": "Berlin"})
for item in tender.items():
bid.price(item.id, Decimal("12.50"))
bid.vat_percent(Decimal("19"))
open("bid.X84", "wb").write(bid.finish().write())
And in Rust:
#![allow(unused)]
fn main() {
use gaebboss_core::Document;
let doc = Document::open(std::path::Path::new("tender.X83"))?;
for item in doc.items() {
println!("{} {:?} {}", item.oz, item.quantity(), item.short_text());
}
}
Reading a bill
Document::open or Document::parse reads a file of any GAEB DA XML version
from 3.0 to 3.3. The version and phase come from the namespace first, then
from GAEBInfo/Version and Award/DP, then from the file extension; every
guess is a warning you can read in doc.warnings.
The typed tree is doc.gaeb: one struct per schema type, strings as spans
resolved with doc.str(span), decimals as Decimal. Most callers never touch
it and use the navigation layer instead:
doc.items()yields every item in document order with itsOz(the Ordnungszahl formed from theBoQBkdnlevels), its kind, quantity, unit, prices and texts, plus the categories above it inpath.doc.categories()yields the LV-Bereiche with label, depth and declared totals.doc.markup_items()yields Zuschlagspositionen.doc.computed_totals()sums items per Fachdokumentation 4.6.17 and puts the result next to what the file declares.
Kinds of items
ItemRef::kind() tells a Standard item from a LumpSum, a Bedarfsposition
with or without Gesamtbetrag (ProvisionalWithTotal,
ProvisionalWithoutTotal), a Grundposition (Base) and its alternatives
(Alternative { group, serial }), hourly and key items, a free quantity the
bidder fills in, and a not-applicable item. counts_towards_total() applies
the standard’s rule: alternatives, Bedarfspositionen ohne GB, not-applicable
and not-offered items stay out of the sums, whatever else they are.
Ordnungszahl
item.oz.dotted() prints 001.002.0010A: levels zero-padded to their
declared width (or space-padded per alignment for non-numeric levels),
joined by dots, the index appended directly; a skipped level shows as _.
compact() gives the fixed-width form, trade() the first level, lot()
the lot when the breakdown starts with one.
Texts and bidder fields
Long texts are formatted text: paragraphs, spans with styles, lists, tables
and images, with TextComplement fields inside. gaebboss renders them from
the tape in document order, so vendor deviations such as a list placed
directly under DetailTxt or a <b> inside a span still read.
item.short_text()is the OutlineText as one line.item.long_text()is plain text: paragraphs on their own lines, list items bulleted, table cells tab-separated, fields inline. An empty bidder field reads'....'.item.long_text_markdown()turns bold and italic spans into Markdown emphasis and tables into GFM tables.item.complements()lists the fields with mark, kind (Owner or Bidder), caption, body, tail, the number behindComplBodyDec/ComplBodyInt, andvalue()which strips the quote marks a body is written with.
The same functions work on any text-carrying node: text::plain(&doc, node)
takes a category label, a remark or an AddText as well.
From tender to bid
Bid::from_tender(&tender, bidder) re-reads the tender, relabels it X84 and
carries the bidder as CTR. Then:
price(id, up)sets the unit price (three decimals) and the total from the quantity.price_components(id, &[...])sets up to six components that must add up to the unit price.free_quantity(id, qty)fills a quantity the tender left open (QtyTBD).not_offered(id)marks an item as not offered: no price is transmitted.fill_complement(id, mark, text)answers a bidder field in the long text.markup(id, base, percent)prices a Zuschlagsposition.discount_percent,vat_percentset the bill-level figures.
finish() refuses when an item is neither priced nor marked, computes the
total of every category and of the bill with the standard’s rounding, writes
no total on items that do not count (an X84 no longer says why they would
not), and returns the X84 document. doc.write(&doc.x84_options()) writes
it strictly: a missing required element is an error, not a report.
Tenders in 3.0 or 3.1 are answered in 3.2, the oldest version gaebboss writes; 3.2 and 3.3 tenders are answered in their own version.
Validation
validate(&doc) checks a document on its own:
- phase rules from the official schema profile: elements the phase does not carry, required elements that are missing (3.2 and 3.3 only);
- identifiers: duplicated
ID, danglingIDRef; - Ordnungszahlen: the
RNoPartpattern, 14 characters at most, unique and ascending in the standard’s sort order; - decimals: Qty and UP with at most three places, IT and VAT with two;
- arithmetic:
IT = round2(Qty × UP), category totals against their items, the bill total against its categories; - X84: no unit price on a not-offered item.
validate_against_tender(&bid, &tender) checks a bid against the tender it
answers: the same categories, the same items, quantities unchanged unless
the tender left them open. Items are matched by ID and, failing that, by
Ordnungszahl; a changed ID is a warning.
Findings carry a severity, a code, the Ordnungszahl where there is one and a message. The CLI exits 1 when any finding is an error.
Writing files
doc.write(&WriteOptions { version, phase, indent, prog_system, strict })
writes the typed tree as XML in the target version’s element order, applying
the target phase’s profile: elements the phase does not carry are dropped
and reported in WriteReport.dropped; required elements that are missing
are reported in missing, or refused when strict is set.
Writing the version and phase a file came in reproduces its content: every official fixture and every file of the real-world corpus round-trips to byte-identical output on the second pass, with unknown vendor elements copied verbatim.
Children that may interleave in the schema (texts and bidder fields, items and remarks, paragraphs and lists) keep the order they were read in; everything else follows the schema. Pretty printing never touches text-level elements, so whitespace inside a paragraph is never changed.
make conformance writes X81 to X84 files from the official fixtures and
validates them against the official XSDs with lxml.
Python
pip install gaebboss
gaebboss.Document(path) or gaebboss.Document(data=bytes, name="x.X83")
parses with the GIL released; data takes bytes, bytearray, memoryview
or any other buffer and copies it once. Everything it returns is a plain object:
items(), categories(), markup_items(), boq, project, warnings,
validate(), validate_against(tender), to_json(), write(...) and
write_report(...). Every GAEB number is a decimal.Decimal built from its
exact text; passing a float to a bid raises GaebError.
from decimal import Decimal
import gaebboss
tender = gaebboss.Document("tender.X83")
bid = gaebboss.Bid.from_tender(tender, {"name1": "Bau GmbH", "street": "Weg 1", "pcode": "12345", "city": "Berlin"})
for item in tender.items():
if item.kind == "FreeQuantity":
bid.free_quantity(item.id, Decimal("10.000"))
bid.price(item.id, Decimal("12.50"))
bid.vat_percent(Decimal("19"))
doc = bid.finish()
assert [f for f in doc.validate() if f.severity == "Error"] == []
open("bid.X84", "wb").write(doc.write())
Documents are immutable and can be shared between threads; parsing sixteen
copies in a thread pool scales with cores. Reading a file, items(),
validate(), validate_against(), write(), write_report(), to_json(),
Bid.from_tender() and Bid.finish() all run with the GIL released, so
other Python threads keep running meanwhile. Item decimals become
decimal.Decimal when the attribute is read.
Command line
gaebboss info FILE # version, phase, project, counts, total, warnings
gaebboss items FILE [--counting] [--tsv]
gaebboss text FILE --oz OZ [--markdown]
gaebboss json FILE [--compact]
gaebboss validate FILE [--tender X83] # exit 1 on errors
gaebboss roundtrip FILE -o OUT [--phase X84] [--version 3.3] [--pretty] [--strict]
gaebboss bid X83 --prices prices.csv --bidder bidder.toml -o OUT.X84 [--pretty]
prices.csv has a header oz,up or id,up, one row per item, - for a
not-offered item and an optional third column with the quantity of a free
quantity item. bidder.toml holds name1, street, pcode, city and
optionally name2, contact, email, bidder_no, vat_percent,
discount_percent.
Rust API
The crate is gaebboss-core; cargo doc --open -p gaebboss-core has the
full reference. The entry points:
| item | what it is |
|---|---|
Document::open, Document::parse, Document::parse_named | read a file; the name decides the phase when nothing inside does |
Document::items, categories, markup_items | navigation with Oz, ItemKind, texts and prices |
Document::computed_totals, declared_total | sums per Fachdokumentation 4.6.17 |
text::plain, text::markdown, text::complements | projections of any text node |
validate::validate, validate::validate_against_tender | findings |
Document::write, Document::write_with_report, WriteOptions | XML out, per version and phase |
bid::Bid | X83 to X84 |
json::to_json | the document as JSON with string decimals |
decimal::Decimal | fixed-point numbers, item_total, total_after_discount |
model::* | the generated typed model, one struct per schema type |
Lower layers are public too: bytes::normalize, lexer::lex and tape::Tape
give the flat tape; version::detect the route; read::Reader and the
generated generated::read the typed readers.
Python API
The authoritative signatures are the stubs shipped with the package,
gaebboss/_gaebboss.pyi. In short:
Document(path=None, *, data=None, name=None); propertiesversion,phase,warnings,project,boq; methodsitems(kind="all"),categories(),markup_items(),to_json(),validate(),validate_against(tender),write(*, phase, version, pretty, strict),write_report(*, phase, version, strict).Item:id,oz,kind,alternative_group,alternative_serial,short_text,long_text,long_text_markdown,quantity,unit,unit_price,total,vat,counts_towards_total,not_offered,category_ozs,complements.Bid.from_tender(document, bidder);price,price_components,not_offered,free_quantity,fill_complement,markup,discount_percent,vat_percent,finish().GaebErrorfor every failure.
CLI reference
gaebboss --help and gaebboss <command> --help print the options. Exit
codes: 0 on success, 1 when validate finds errors, 2 on an unreadable
input or a bad argument.
Schema coverage
Generated by cargo xtask coverage from standard/3.3/GAEB_DA_XML_Lib_3.3_2021-05.xsd.
Every element the 3.3 library declares is read into the typed model and
written back; this table says which ones the semantic layer (items,
texts, bids, validation, JSON) also interprets.
| elements | read and written | interpreted by the semantic layer |
|---|---|---|
| 525 | 525 | 112 |
| element | in types | semantic | restricted in phases |
|---|---|---|---|
ALNBGroupNo | tgBoQCtgy | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
ALNBSerNo | tgBoQCtgy | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
ALNGroupNo | tgItem, tgMarkupItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
ALNSerNo | tgItem, tgMarkupItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
AQU | tgOrderItem | ||
AcceptDate | tgAwardInfo | X80 X83 | |
AcceptType | tgAwardInfo | X80 X83 X86 X87 | |
Accepted | tgBoQCtgy, tgItem, tgMarkupItem | X52 X80 X81 X82 X86 X87 X89 X89B | |
AcctNo | tgBank | ||
AcctRecNo | tgOWN | X86 X86ZE X86ZR X87 | |
AcctsPayNo | tgCTR | X84 X86 X87 | |
AddItem | tgBoQItemRef | ||
AddText | tgArticle, tgAward, tgCTR, tgCnstSite, tgDateOfInformation, tgECInfo, tgGAEB, tgGAEB_Cost, tgInvoice, tgInvoiceInfo, tgNotifSite, tgOWN, tgOrderInfo, tgPrjInfo, tgProduct, tgRequester, tgSC_Evaluation, tgSC_GAEB | X50.1 X50.2 X51.2 X52 X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B X93 X94 X96 X97 X98 X99 | |
Address | tgCTR, tgCnstSite, tgConsortiumMember, tgCustomerInfo, tgDeliveryPlaceInfo, tgInvoiceCreator, tgInvoiceRecipient, tgNotifSite, tgOWN, tgOrderItem, tgPlannerInfo, tgProduct, tgRequester, tgSupplierInfo | yes | X83Z X84 X84Z X86 X86ZE X86ZR X87 |
Alignment | tgBoQBkdn, tgECBkdn | yes | |
AlterBidPerm | tgPrjInfo | ||
AlterBidStatus | tgBoQCtgy, tgItem, tgMarkupItem, tgPerfDescr, tgRemark | X52 X80 X81 X82 X85 X86 X87 | |
Annotation | tgCheckNote | ||
ArithmeticQuantityApproach | tgProperty | ||
ArtChIdx | tgSTLBBauID | ||
ArtChrIdent | tgSTLBBauID | ||
ArtNo | tgArticle, tgOrderItem | ||
ArtNoID | tgOrderItem | ||
ArtOutline | tgArticle | ||
Article | tgProduct | ||
Attachment | CtlgAttachment | yes | |
AttestPerson | tgIndivAgrInfo | ||
Award | tgGAEB, tgSC_Evaluation | yes | X52 X80 X81 X82 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 |
AwardAgencyAdr | tgMastAgrInfo | X83Z X86ZR | |
AwardInfo | tgAward | X80 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 | |
AwardNo | tgCTR, tgOWN | X83Z X84 X84Z X86 X86ZE X86ZR X87 | |
BIC | tgBank | ||
BRNo | tgBank | ||
BU | tgMetalResources | ||
Bank | tgAddress | ||
Base | tgWeightPart | yes | |
BaseDELQuotation | tgMetalResources | ||
BaseValue | tgMetalResources | ||
BidComm | tgItem, tgOrderItem | X52 X80 X81 X82 X84 X85 X86 X87 | |
BidCommPerm | tgPrjInfo | X85 | |
BidDate | tgAwardInfo | X80 X83 X84 X84Z X85 X86 X86ZR X87 | |
BidUpDown | tgMastAgrInfo | X83Z X86ZR | |
BidUpDownPct | tgBoQCtgy, tgItem, tgMaterialItem | X84Z X86ZR | |
BidUpDownReq | tgBoQCtgy, tgItem | X83Z | |
Bidder | tgBidderList | yes | |
BidderList | tgSC_Evaluation | ||
BidderNo | tgCTR | yes | X86 X87 |
BillElement | tgCostElement | X50.1 X50.2 X51.1 X51.2 | |
BillQty | tgItem | X52 X80 X81 X82 X89 X89B | |
BoQ | tgAward, tgElementalCosting, tgInvoice, tgQtyDetermination | yes | X80 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 X89 X89B |
BoQBkdn | tgBoQInfo, tgBoQQD | yes | X52 X80 X81 X82 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 X89 X89B |
BoQBody | tgBoQ, tgBoQCtgy, tgBoQCtgyQD, tgBoQQD | yes | X52 X80 X81 X82 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 X89 X89B |
BoQCtgy | tgBoQBody, tgBoQBodyQD | yes | X83Z X84Z X86ZE X86ZR |
BoQCtgyRef | tgRefGroup | X50 | |
BoQID | tgAwardInfo | X80 X83 X84 | |
BoQInfo | tgBoQ | yes | X83Z X84Z X86ZE X86ZR |
BoQItemRNo | tgProjectBoQItemRef | ||
BoQItemRef | tgRefGroup | X50 | |
BoQName | tgProjectBoQItemRef | ||
Body | tgSpatialHierarchy | yes | |
BookingNo | tgInvoice | X89 | |
Brand | tgArticle | ||
BudgetDept | tgInvoice | X89 | |
BuildingElement | tgTopologyElement | ||
CAD_ID | tgProperty | ||
CODate | tgCOInfo | ||
COInfo | tgAwardInfo | X80 X83 X86 X87 | |
COInit | tgCOInfo | ||
CONo | tgBoQCtgy, tgBoQInfo, tgCOInfo, tgItem, tgMarkupItem, tgPerfDescr, tgRemark | X52 X80 X81 X82 X83 X86 X87 X89 X89B | |
COPhase | tgCOInfo | ||
COReas | tgCOInfo | ||
COStatus | tgBoQCtgy, tgBoQInfo, tgCOInfo, tgItem, tgMarkupItem | X52 X80 X81 X82 X83 X86 X87 X89 X89B | |
CPVCode | tgBoQCtgy, tgBoQInfo | X52 X80 X81 X82 X83 X86 X87 X89 X89B | |
CPVNo | tgCPVCode | ||
CPVText | tgCPVCode | ||
CTR | tgAward, tgInvoice, tgQtyDetermination | yes | X80 X84 X84Z X85 X86 X86ZR X87 X89 X89B |
CallOrder | tgOrderInfo | ||
CashDiscDate | tgCashDiscount | ||
CashDiscDays | tgCashDiscount | ||
CashDiscount | tgAwardInfo, tgInvoiceInfo, tgOrderInfo | X80 X84 X85 X86 X87 | |
Cat | tgAwardInfo | yes | X80 X83 X83Z X86ZR |
CatID | tgCategoryElement, tgCostElement, tgDimensionElement | X50.1 X50.2 X51.1 X51.2 | |
CatalogArtNo | tgOrderItem | ||
CatalogDescription | SpatialHierarchyInfo | ||
CatalogNo | tgOrderItem | ||
CatalogReference | BuildingElement, NumValue, tgTopologyElement | ||
CategoryElement | tgECBody | ||
CategoryElementRef | tgRefGroup | X50 | |
Certific | tgGAEBInfo, tgGAEBInfoQD | X83Z X84Z X86ZE X86ZR | |
ChVIdent | tgSTLBBauID | ||
CheckDate | tgCheckNote | ||
CheckNote | tgInvoice, tgItem, tgMarkupItem | X89 X89B | |
City | tgAddress | yes | |
CnstEnd | tgAwardInfo | X80 X83 X86 X86ZE X87 | |
CnstSite | tgAward, tgInvoice | X80 X83 X83Z X86 X86ZE X86ZR X87 X89 X89B | |
CnstSiteIDNo | tgCnstSite | X83Z X86 X86ZR X87 | |
CnstSiteLoc | tgIndivAgrInfo | ||
CnstSiteName | tgCnstSite | X83Z X86 X86ZR X87 | |
CnstStart | tgAwardInfo | X80 X83 X86 X86ZE X87 | |
CntryName | tgCTR, tgOWN | X84 X86 X87 | |
CntryType | tgCTR, tgOWN | X84 X86 X87 | |
Communication | tgPrjInfo | ||
ComplBody | tgTextComplement | yes | X52 X80 X81 X82 X83 X84 X86 X87 |
ComplBodyDec | tgTextComplement | yes | X52 X80 X81 X82 X83 X84 X86 X87 |
ComplBodyInt | tgTextComplement | yes | X52 X80 X81 X82 X83 X84 X86 X87 |
ComplCaption | tgTextComplement | yes | X52 X80 X81 X82 X83 X86 X87 |
ComplTSA | tgCompleteText | X83Z X86ZR | |
ComplTSB | tgCompleteText | ||
ComplTail | tgTextComplement | yes | X52 X80 X81 X82 X83 X86 X87 |
CompleteText | tgDescription, tgPerfDescription | yes | X52 X83 X83Z X84 X85 X86 X86ZR X87 X89 X89B |
ConsortiumMember | tgECInfo | X50.2 X51.2 | |
ConsortiumMemberRef | tgRefGroup | X50 | |
Contact | tgAddress | yes | |
ContrDate | tgAwardInfo | X80 X83 X86 X86ZE X87 | |
ContrLaw | tgMaintInfo | ||
ContrNo | tgAwardInfo | X80 X83 X86 X86ZE X87 | |
ContrTransDate | tgMaintInfo | ||
ContrTransTime | tgMaintInfo | ||
ContrValCode | tgMastAgrInfo | ||
ConversionRate | tgQuotation | ||
CostApproach | tgItem | X52 X80 | |
CostApproachQU | tgCostApproach | ||
CostApproachQty | tgCostApproach | ||
CostDescription | tgCostType | ||
CostElement | tgCostElement, tgECBody | X50.2 X51.1 X51.2 | |
CostElementRef | tgRefGroup | X50 | |
CostGrp | tgSTLBBauCtlg | ||
CostResponsible | tgMastAgrInfo | X83Z X86ZR | |
CostType | tgBoQInfo | X52 X80 | |
CostTypeUnit | tgCostType | ||
CounterClaim | tgInvoiceShare | ||
Country | tgAddress | ||
CountryOfOrigin | tgOrderItem | ||
Creator | tgQtyDetermInfo | ||
CreditNote | tgInvoiceHeader | X89 | |
Ctlg | tgBoQInfo, tgBoQQD, tgECInfo, tgOrderInfo | X50.2 X51.2 X52 X80 X81 X82 X83 X83Z X85 X86 X86ZR X87 X89 X89B | |
CtlgAssign | tgAddress, tgAwardInfo, tgBoQCtgy, tgBoQCtgyQD, tgBoQInfo, tgBoQQD, tgCategoryElement, tgCostElement, tgDimensionElement, tgECCtgy, tgECInfo, tgHourItem, tgItem, tgItemQD, tgLotGrp, tgMarkupItem, tgMarkupItemCTR, tgMarkupItemOWN, tgMaterialItem, tgOrderInfo, tgOrderItem, tgPerfDescr, tgPerfDescription, tgPrjInfo, tgProjectBoQItemRef, tgQDetermItem, tgQtyDetermInfo, tgQtySplit, tgRemark, tgSubDescr, tgTextComplement | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X83 X83Z X85 X86 X86ZR X87 X89 X89B | |
CtlgAssignType | tgCtlg | ||
CtlgAttachment | tgBoQQD | ||
CtlgCode | tgCtlgAssign | ||
CtlgDescription | tgECCtlg | ||
CtlgID | tgCtlg, tgCtlgAssign, tgECCtlg | ||
CtlgName | tgCtlg, tgECCtlg, tgSTLBBauCtlg | ||
CtlgRef | tgECCtlg | ||
CtlgType | tgCtlg, tgECCtlg | ||
Cur | tgAwardInfo, tgECInfo, tgInvoiceInfo, tgOrderInfo, tgPrjInfo, tgQuotation | yes | X50.2 X51.2 X80 X83 X83Z X84 X85 X86 X86ZR X87 X89 X89B |
CurDELQuotation | tgMetalResources | ||
CurLbl | tgAwardInfo, tgECInfo, tgInvoiceInfo, tgOrderInfo, tgPrjInfo, tgQuotation | X50.2 X51.2 X80 X83 X84 X85 X86 X87 X89 X89B | |
Customer | tgRefItems | ||
CustomerArtNo | tgOrderItem | ||
CustomerBoQBkdn | tgOrderInfo | ||
CustomerCtlgAssign | tgRefItems | ||
CustomerInfo | tgOrder | ||
CustomerReferenceNo | tgOrderInfo | ||
CustomerSubNo | tgRefItems | ||
DP | tgAward, tgElementalCosting, tgInvoice, tgOrder, tgQtyDetermination, tgSC_Evaluation | yes | X80 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 X89 X89B |
DPNo | tgCTR, tgOWN | X84 X86 X87 | |
Data | Attachment | ||
Date | tgBoQInfo, tgDateOfInformation, tgECInfo, tgGAEBInfo, tgGAEBInfoQD | yes | X50.2 X51.2 X52 X80 X81 X82 X83 X83Z X84Z X85 X86 X86ZE X86ZR X87 X89 X89B |
DateOfInformation | tgECInfo | X50.2 X51.2 | |
DateOfPrice | tgECInfo | X50.2 X51.2 | |
DateValue | tgCatalogRef | ||
Deadline | tgMaintInfo | ||
DeliveryChara | tgOrderItem | ||
DeliveryDate | tgOrderInfo, tgOrderItem | ||
DeliveryNo | tgOrderInfo | ||
DeliveryNoteVoucherDate | tgOrderInfo | ||
DeliveryPlaceInfo | tgOrder | ||
DeliveryTime | tgOrderInfo, tgOrderItem | ||
DeliveryType | tgOrderInfo | ||
DeliveryWeek | tgOrderInfo, tgOrderItem | ||
Descr | tgCategoryElement, tgCostElement, tgDimensionElement, tgECCtgy | yes | X50.1 X50.2 X51.1 X51.2 |
Descrip | Attachment, tgMastAgrInfo, tgPrjInfo | yes | X83Z X85 X86ZR X89 X89B |
Description | BuildingElement, CatalogDescription, tgConsortiumMember, tgCostElement, tgHourItem, tgInvoiceShare, tgItem, tgMarkupItem, tgMarkupItemCTR, tgMarkupItemOWN, tgMaterialItem, tgOrderItem, tgPerfDescr, tgRemark, tgSubDescr, tgTopologyElement | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X83 X83Z X84 X85 X86 X86ZE X86ZR X87 X89 X89B |
DetailAddText | tgAddText | ||
DetailTxt | tgCompleteText | yes | X83Z X84 X86ZR |
Dimension | tgOrderItem | ||
DimensionElement | tgECBody | ||
DimensionElementRef | tgRefGroup | X50 | |
DiscountAbs | tgPriceModification | ||
DiscountAmt | tgPaymentMade, tgTotals | yes | |
DiscountPcnt | tgCashDiscount, tgItem, tgMarkupItem, tgPriceModification, tgTotals | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
DiscountVATAmt | tgPaymentMade | ||
Discountable | tgOrderItem | ||
EAN | tgOrderItem | ||
ECBkdn | tgECInfo | X50.2 X51.2 | |
ECBody | tgECCtgy, tgElementalCosting | X50.1 X50.2 X51.1 X51.2 | |
ECCtgy | tgECBody | ||
ECInfo | tgElementalCosting | ||
ECMethod | tgECInfo | X50.2 X51.2 | |
ECType | tgECInfo | X50.2 X51.2 | |
EleNo | tgCategoryElement, tgCostElement, tgDimensionElement, tgECCtgy | X50.2 X51.2 | |
ElementalCosting | tgGAEB_Cost | X50.1 X51.2 | |
Email | tgAddress | yes | |
EvalEnd | tgAwardInfo | X80 X83 X83Z | |
Expression | NumValue | ||
Fax | tgAddress | ||
FixedPriceDate | tgOrderInfo | ||
GAEBInfo | tgGAEB, tgGAEBQD, tgGAEB_Cost, tgSC_GAEB | yes | X50.1 X51.2 X52 X80 X81 X82 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 X89 X89B X93 X94 X96 X97 X98 X99 |
Group | tgSTLBBauCtlg | ||
Height | tgDimension | ||
HoldOutType | tgItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
HourIt | tgItem, tgMarkupItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
HourItem | tgMastAgrItems | X84Z | |
IBAN | tgBank | ||
IDNo | tgCustomerInfo, tgDeliveryPlaceInfo, tgPlannerInfo, tgSupplierInfo | ||
ILN | tgAddress | ||
IT | tgCostElement, tgHourItem, tgItem, tgMarkupItem | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
ITMarkup | tgMarkupItem | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
Image | tgFText, tgFTextTC | yes | |
IndivAgrInfo | tgAward | X86ZE | |
InfoPerson | tgIndivAgrInfo | ||
Inquiry | tgOrderInfo | ||
InquiryNo | tgOrderInfo | ||
InsAs | tgCTR | X84 X86 X87 | |
InsAsDate | tgInsAs | ||
InsAsName | tgInsAs | ||
InsAsNo | tgInsAs | ||
Invoice | tgGAEB | X89 X89B | |
InvoiceCreator | tgInvoice | X89 X89B | |
InvoiceDate | tgInvoiceHeader, tgInvoiceInfo, tgInvoiceMadeOut | X89 | |
InvoiceHeader | tgInvoice | X89 X89B | |
InvoiceInfo | tgOrder | ||
InvoiceMadeOut | tgInvoice | X89 | |
InvoiceNo | tgInvoiceHeader, tgInvoiceInfo, tgInvoiceMadeOut, tgPaymentMade | X89 | |
InvoiceRecipient | tgInvoice | X89 | |
InvoiceShare | tgInvoice | X89 | |
InvoiceShareType | tgInvoiceShare | ||
InvoiceTotalsGross | tgInvoiceInfo | ||
InvoiceType | tgInvoiceHeader, tgInvoiceMadeOut, tgPaymentMade | X89 | |
Item | tgItemlist, tgItemlistQD | yes | X80 X81 X82 X83 X83Z X84 X84Z X85 X86 X86ZE X86ZR X87 X89 X89B |
ItemChara | tgOrderItem | ||
ItemTotal | tgOrderTotals | ||
ItemType | tgOrderItem | ||
Itemlist | tgBoQBody, tgBoQBodyQD | yes | X83Z X84Z X86ZE X86ZR |
KeyIt | tgItem, tgMarkupItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
Kind | tgQuotation | yes | |
KindOfDate | tgOrderItem | ||
LblBank | tgBank | ||
LblBoQ | tgBoQInfo | yes | X52 X80 X81 X82 X83 X83Z X85 X86 X86ZE X86ZR X87 X89 X89B |
LblBoQBkdn | tgBoQBkdn | yes | X83Z X84Z X86ZE X86ZR |
LblEC | tgECInfo | X50.2 X51.2 | |
LblOutline | tgECBkdn | ||
LblPrj | tgPrjInfo | yes | X84 X85 X89 X89B |
LblProp | tgProperty | ||
LblRefWage | tgWgChange | X84 | |
LblTime | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
LblTx | tgBoQCtgy | yes | X52 X80 X81 X82 X83 X83Z X85 X86 X86ZR X87 X89 X89B |
LblUPComp1 | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
LblUPComp2 | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
LblUPComp3 | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
LblUPComp4 | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
LblUPComp5 | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
LblUPComp6 | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
Length | tgBoQBkdn, tgDimension, tgECBkdn | yes | X83Z X84Z X86ZE X86ZR |
Line | Expression | yes | |
LotGrNo | tgLotGrp | X83 X84 X89 X89B | |
LotGrp | tgBoQ | ||
LumpSumItem | tgItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
MaintInfo | tgAwardInfo | X80 X83 X86 X87 | |
MaintType | tgMaintInfo | ||
Markup | tgCategoryElement, tgCostElement, tgCostType, tgDimensionElement, tgMarkupItem, tgMarkupItemCTR, tgMarkupItemOWN | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X83Z X84 X84Z X85 X86 X86ZR X87 X89 X89B |
MarkupAbs | tgPriceModification | ||
MarkupIt | tgHourItem, tgItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
MarkupItem | tgItemlist | yes | X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B |
MarkupItemCTR | tgMastAgrItems | X84Z | |
MarkupItemOWN | tgMastAgrItems | ||
MarkupPcnt | tgPriceModification | ||
MarkupSubQty | tgMarkupItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
MarkupType | tgMarkupItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
MastAgrBeg | tgMastAgrInfo | X83Z X86ZR | |
MastAgrDate | tgMastAgrInfo | X86ZR | |
MastAgrDur | tgMastAgrInfo | ||
MastAgrEnd | tgMastAgrInfo | X83Z X86ZR | |
MastAgrInfo | tgAwardInfo | X83 X83Z X86 X86ZR X87 | |
MastAgrItems | tgItemlist | X83Z X84Z X86ZE X86ZR | |
MastAgrLbl | tgMastAgrInfo | X83Z X86ZR | |
MastAgrNo | tgMastAgrInfo | X83Z X86ZR | |
MastAgrVers | tgMastAgrInfo | ||
MaterialItem | tgMastAgrItems | X84Z | |
MaxContrVal | tgMastAgrInfo | ||
MetalResources | tgOrderItem | ||
MethodDescription | tgQtyDetermInfo | ||
MinContrAwd | tgMastAgrInfo | X83Z X86ZR | |
MinContrVal | tgMastAgrInfo | X83Z X86ZR | |
ModeOfShipment | tgOrderInfo, tgOrderItem | ||
Multiplicator | tgPriceModification | ||
Name | Attachment, tgBoQInfo, tgECInfo, tgPriceModification, tgProperty, tgUserValue | yes | X50.2 X51.2 X52 X80 X81 X82 X83 X83Z X84 X85 X86 X86ZE X86ZR X87 X89 X89B |
Name1 | tgAddress | yes | |
Name2 | tgAddress | yes | |
Name3 | tgAddress | ||
Name4 | tgAddress | ||
NamePrj | tgPrjInfo | yes | X84 X85 X89 X89B |
NetPrice | tgOrderItem | ||
NoUPComps | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
NotAppl | tgItem, tgMarkupItem | yes | X52 X80 X81 X82 X86 X87 |
NotApplBoQ | tgBoQCtgy | X52 X80 X81 X82 X83 X86 X87 | |
NotOffered | tgItem | yes | X84 |
NotifSite | tgAward, tgInvoice | X80 X83 X86 X87 X89 X89B | |
NotifSiteIDNo | tgNotifSite | ||
NotifSiteName | tgNotifSite | ||
Num | tgBoQBkdn, tgECBkdn | yes | X83Z X84Z X86ZE X86ZR |
NumValue | tgCatalogRef | ||
Number | tgContrValCode | yes | |
OWN | tgAward, tgInvoice, tgQtyDetermination | X80 X83 X83Z X84Z X86 X86ZE X86ZR X87 X89 X89B | |
OfferFixedPriceDate | tgOrderInfo | ||
OfferFixedPriceWeek | tgOrderInfo | ||
OfferNo | tgOrderInfo | ||
OfferPrice | tgOrderItem | ||
OpenDate | tgAwardInfo | X80 X83 X83Z | |
OpenTime | tgAwardInfo | X80 X83 X83Z | |
OrdDescr | tgQtyDetermInfo | ||
Order | tgGAEB | X93 X94 X96 X97 X98 X99 | |
OrderConfNo | tgOrderInfo | ||
OrderInfo | tgOrder | ||
OrderItem | tgOrder | ||
OrderPosNo | tgOrderItem | ||
OutlCompl | tgBoQInfo | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
OutlTSA | tgOutlineText | ||
OutlTextPart | tgSTLBBauID | ||
OutlTxt | tgOutlineText | ||
OutlineAddText | tgAddText | ||
OutlineText | tgCompleteText, tgDescription, tgPerfDescription | yes | X52 X83 X83Z X85 X86 X86ZR X87 X89 X89B |
PCode | tgAddress | ||
PartNo | tgOrderInfo | ||
PaymentDate | tgPaymentMade | ||
PaymentMade | tgInvoice | X89 | |
PaymentNo | tgPaymentMade | ||
PaymentNote | tgPaymentMade | ||
Percent | tgContrValCode, tgInvoiceShare | yes | |
PerfDescr | tgBoQBody, tgItemlist | X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B | |
PerfLbl | tgPerfDescr | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
PerfNo | tgPerfDescr | X52 X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B | |
PerformPcnt | tgAwardInfo | X80 X83 X86 X87 | |
Performance | tgCostApproach | ||
Phone | tgAddress | ||
PlannerInfo | tgOrder | ||
Portion | tgBoQCtgyRef, tgBoQItemRef, tgCategoryElementRef, tgCostElementRef, tgDimensionElementRef, tgECCtgy | X50.1 X50.2 X51.1 X51.2 | |
PredIT | tgMaterialItem | X83Z X86ZE X86ZR | |
PredQty | tgHourItem, tgItem | X52 X80 X81 X82 X83Z X86 X86ZR X87 | |
PrefBidType | tgCTR | X84 X86 X87 | |
PriceBasis | tgOrderItem | ||
PriceChara | tgOrderItem | ||
PriceFrom | tgQuotation | ||
PriceInfo | tgItem | X52 X80 X81 X82 X85 X89 X89B | |
PriceModification | tgOrderInfo, tgOrderItem | ||
PriceTo | tgQuotation | ||
PrjID | tgPrjInfo | X84 X85 X89 X89B | |
PrjInfo | tgGAEB, tgGAEB_Cost, tgQtyDetermination, tgSC_GAEB | yes | X50.1 X51.2 X52 X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B X93 X94 X96 X97 X98 X99 |
ProcessType | tgMaintInfo | ||
Product | tgItem | X52 X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B | |
Profiler | tgQtyDetermInfo | ||
ProgName | tgGAEBInfo, tgGAEBInfoQD | X83Z X84Z X86ZE X86ZR | |
ProgSystem | tgGAEBInfo, tgGAEBInfoQD | X83Z X84Z X86ZE X86ZR | |
ProjDescr | tgQtyDetermInfo | ||
ProjectBoQItemRef | tgRefGroup | ||
Property | tgCategoryElement, tgCostElement, tgDimensionElement, tgECCtgy | X50.1 X50.2 X51.1 X51.2 | |
Provis | tgItem, tgMarkupItem | yes | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B |
ProvisAccpt | tgItem, tgMarkupItem | X52 X80 X81 X82 X86 X87 X89 X89B | |
ProvisionDate | tgOrderInfo, tgOrderItem | ||
QDetermItem | tgQtyDeterm | ||
QTakeoff | tgQDetermItem | ||
QU | tgArticle, tgCostElement, tgDimensionElement, tgHourItem, tgItem, tgOrderItem, tgProperty, tgSubDescr | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X83 X83Z X85 X86 X86ZR X87 X89 X89B |
Qty | tgArticle, tgCostElement, tgDimensionElement, tgHourItem, tgItem, tgOrderItem, tgQtyDeterm, tgQtySplit, tgSubDescr | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X83 X83Z X84 X85 X86 X86ZE X86ZR X87 |
QtyDeterm | tgGAEBQD, tgItem, tgItemQD | X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B | |
QtyDetermInfo | tgBoQInfo, tgQtyDetermination | X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B | |
QtyPcnt | tgQtySplit | ||
QtySpec | tgSubDescr | X52 X80 X81 X82 X83 X83Z X85 X86 X87 | |
QtySplit | tgItem | X52 X80 X81 X82 X83 X85 X86 X87 | |
QtyTBD | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X83 X85 X86 X87 |
Quantity | tgCtlgAssign | yes | |
QuantityDeterminationRemark | tgInvoice | X89 | |
Quotation | tgOrderInfo, tgPriceModification | ||
RedPriceComp | tgWgChange | X84 | |
RefBaseItem | tgItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
RefBoQ | tgWgChange | X84 | |
RefBoQCOInfo | tgCOInfo | ||
RefBoQID | tgBoQQD | ||
RefBoQName | tgBoQQD | ||
RefDescr | tgItem, tgMarkupItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
RefGroup | tgCostElement | X50.1 X50.2 X51.1 X51.2 | |
RefInvoiceNo | tgInvoiceHeader | X89B | |
RefItem | tgMarkupItemCTR, tgMarkupItemOWN, tgMarkupSubQty, tgWgChange | X84 X86ZE | |
RefItems | tgOrderItem | ||
RefLotGrNo | tgWgChange | X84 | |
RefLotNo | tgLotGrp, tgWgChange | X83 X84 X89 X89B | |
RefPerfNo | tgItem, tgMarkupItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
RefPrjID | tgPrjInfoQD | ||
RefPrjName | tgPrjInfoQD | ||
RefRNo | tgItem, tgMarkupItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
RegNo | tgSupplierInfo | ||
Remark | tgBoQBody, tgCategoryElement, tgCostElement, tgDimensionElement, tgItemlist | X50.1 X50.2 X51.1 X51.2 X80 X81 X82 X83 X83Z X84 X85 X86 X86ZR X87 X89 X89B | |
RepOrder | tgOrderInfo, tgOrderItem | ||
RequestIDNo | tgRequester | ||
RequestName | tgRequester | ||
Requester | tgAward, tgInvoice | X80 X83 X86 X87 X89 X89B | |
Resource | tgMetalResources | ||
SCType | tgCTR | X84 X86 X87 | |
SC_Evaluation | tgSC_GAEB | ||
STLBBau | tgDescription, tgPerfDescription | X52 X83 X83Z X85 X86 X86ZR X87 X89 X89B | |
STLBBauCtlg | tgSTLBBau | ||
STLBBauID | tgSTLBBau | ||
SectorType | tgCTR | X84 X86 X87 | |
SequentialNo | tgInvoiceHeader | X89 | |
Service | tgOrderItem | ||
ServiceProvisionEndDate | tgInvoiceHeader, tgQtyDetermInfo | X89 X89B | |
ServiceProvisionStartDate | tgInvoiceHeader, tgQtyDetermInfo | X89 X89B | |
SettlementType | tgInvoiceHeader | X89 | |
Signature | tgGAEB | ||
SpatialHierarchyInfo | tgSpatialHierarchy | ||
SpecialPayTime | tgOrderInfo | ||
SpecialType | tgAwardInfo | X80 X83 | |
StLNo | tgDescription, tgPerfDescription | X52 X83 X83Z X85 X86 X86ZR X87 X89 X89B | |
StandardText | tgInvoiceInfo | ||
State | tgCheckNote | ||
StorageGoods | tgOrderItem | ||
Street | tgAddress | yes | |
Style | tgBoQText, tgOutlTxt | yes | X83Z X84 X86ZR |
SubDNo | tgSubDescr | X52 X80 X81 X82 X83 X83Z X84 X85 X86 X86ZR X87 | |
SubDescr | tgItem | yes | X52 X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B |
SubQty | tgMarkupSubQty, tgPriceModification | ||
SubmLoc | tgAwardInfo | X80 X83 X83Z | |
SubmissionComment | tgDescription, tgPerfDescription | ||
SumDescr | tgItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
Supplier | tgRefItems | ||
SupplierArtNo | tgOrderItem | ||
SupplierArtNoID | tgOrderItem | ||
SupplierBoQBkdn | tgOrderInfo | ||
SupplierCtlgAssign | tgRefItems | ||
SupplierInfo | tgOrder | ||
SupplierReferenceNo | tgOrderInfo | ||
SupplierSubNo | tgRefItems | ||
TaxNo | tgInvoiceCreator, tgInvoiceRecipient, tgSupplierInfo | ||
TechnClarification | tgOrderItem | ||
TenderDate | tgOrderInfo | ||
Terms | tgInvoice | X89 | |
Text | Attachment, tgBoQText | yes | X83Z X84 X86ZR |
TextComplement | tgBoQText, tgFTextTC, tgOutlTxt, tgdivTC, tgliTC, tgpTC, tgtdTC | yes | X83Z X84 X86ZR |
TextOutlTxt | tgOutlTxt | X83Z X86ZR | |
TextValue | tgCatalogRef | ||
Threshold | tgPriceModification | ||
Time | tgGAEBInfo, tgGAEBInfoQD | X83Z X84Z X86ZE X86ZR | |
TimeQu | tgItem | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B | |
Title | tgRefGroup | X50 | |
Topology | SpatialHierarchyInfo | ||
TopologyElement | Body, tgTopologyElement | ||
TotAfterDisc | tgTotals | yes | |
TotContrVal | tgMastAgrInfo | ||
Total | tgInvoiceMadeOut, tgInvoiceShare, tgPaymentMade, tgTotals | yes | |
TotalGross | tgInvoice, tgTotals | yes | X89 |
TotalLSUM | tgTotals | ||
TotalNet | tgTotals | ||
TotalNetPart | tgVATPart | ||
TotalNetUpComp | tgTotals | ||
TotalVAT | tgInvoiceMadeOut, tgPaymentMade | ||
TotalWeight | tgOrderInfo | ||
Totals | tgBoQCtgy, tgBoQInfo, tgECCtgy, tgECInfo, tgInvoiceInfo, tgLotGrp | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
Type | Attachment, tgBoQBkdn, tgECBkdn, tgPriceModification, tgProperty | yes | X83Z X84Z X86ZE X86ZR |
UM | tgDimension | ||
UP | tgCostElement, tgHourItem, tgItem, tgSubDescr | yes | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 X83Z X84 X84Z X85 X86 X86ZR X87 X89 X89B |
UP110 | tgItem | X52 X80 X81 X82 X85 X86 X87 | |
UPAvg | tgCostElement, tgItem | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 | |
UPBkdn | tgItem, tgSubDescr | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
UPComp1 | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
UPComp2 | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
UPComp3 | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
UPComp4 | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
UPComp5 | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
UPComp6 | tgItem, tgSubDescr | yes | X52 X80 X81 X82 X84 X85 X86 X87 X89 X89B |
UPFracDig | tgPrjInfo | X89 X89B | |
UPFrom | tgCostElement, tgItem | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 | |
UPSpec | tgSubDescr | X52 X80 X81 X82 X83 X83Z X85 X86 X86ZR X87 | |
UPTo | tgCostElement, tgItem | X50.1 X50.2 X51.1 X51.2 X52 X80 X81 X82 | |
UPWgAvg | tgItem | X52 X80 X81 X82 | |
UPWgFrom | tgItem | X52 X80 X81 X82 | |
UPWgTo | tgItem | X52 X80 X81 X82 | |
UW | tgOrderInfo, tgOrderItem, tgQuotation, tgWeightPart | ||
UnitBase | tgWeightPart | ||
UpComp1 | tgTotalNetUpComp | yes | |
UpComp2 | tgTotalNetUpComp | yes | |
UpComp3 | tgTotalNetUpComp | yes | |
UpComp4 | tgTotalNetUpComp | yes | |
UpComp5 | tgTotalNetUpComp | yes | |
UpComp6 | tgTotalNetUpComp | yes | |
UseDur | tgItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
UseDurLblTime | tgItem | X52 X80 X81 X82 X83 X85 X86 X87 X89 X89B | |
UserValue | tgOrderItem | ||
VAT | tgItem, tgOrderInfo, tgOrderItem, tgTotals | yes | X52 X80 X81 X82 X83 X84 X85 X86 X87 X89 X89B |
VATAmount | tgTotals, tgVATPart | yes | |
VATID | tgAddress | ||
VATPart | tgTotals | ||
VATRate | tgOrderTotals | ||
Value | tgCostApproach, tgUserValue | yes | |
ValueQuantityApproach | tgProperty | ||
ValutaDate | tgInvoiceInfo | ||
VersDate | tgGAEBInfo, tgGAEBInfoQD, tgSTLBBauCtlg | X83Z X84Z X86ZE X86ZR | |
Version | tgGAEBInfo, tgGAEBInfoQD | yes | X83Z X84Z X86ZE X86ZR |
WCtg | tgSTLBBauCtlg | ||
WICNo | tgDescription, tgPerfDescription | X52 X83 X85 X86 X86ZE X87 X89 X89B | |
WPU | tgMetalResources | ||
WarrDur | tgAwardInfo | X80 X83 X86 X87 | |
WarrEnd | tgAwardInfo | X80 X83 X86 X87 | |
WarrUnit | tgAwardInfo | X80 X83 X86 X87 | |
WarrantPcnt | tgAwardInfo | X80 X83 X86 X87 | |
Weight | tgOrderItem, tgQuotation, tgWeightPart | ||
WeightPart | tgQuotation | ||
WeigthPart | tgQuotation | ||
WeigthPartValue | tgMetalResources | ||
WgChange | tgAward | X80 X83 X84 X85 X86 X87 | |
WgChangeRate | tgWgChange | X84 | |
Width | tgDimension | yes | |
attachment | tgBoQText | yes | |
br | tgFText, tgFTextTC, tgMLText, tgdiv, tgdivTC, tgli, tgliTC, tgp, tgpMLText, tgpTC, tgtd, tgtdTC, tgth | yes | X83Z X86ZR |
div | tgFText, tgFTextTC, tgMLText, tgli, tgliTC, tgtd, tgtdTC, tgth | yes | X83Z X84 X86ZR |
image | tgp, tgpTC | yes | |
li | tgol, tgolTC, tgul, tgulTC | yes | X84 |
ol | tgFText, tgFTextTC, tgli, tgliTC, tgol, tgtd, tgtdTC, tgth, tgul | yes | X84 |
p | tgFText, tgFTextTC, tgMLText, tgli, tgliTC, tgtd, tgtdTC, tgth | yes | X83Z X84 X86ZR |
page | tgFText, tgFTextTC | yes | |
span | tgFText, tgFTextTC, tgMLText, tgdiv, tgdivTC, tgli, tgliTC, tgp, tgpMLText, tgpTC, tgtd, tgtdTC, tgth | yes | X83Z X86ZR |
table | tgFText, tgFTextTC, tgtd, tgtdTC, tgth | yes | X84 |
td | tgtr, tgtrTC | yes | X84 |
th | tgtr, tgtrTC | yes | |
tr | tgtable, tgtableTC | yes | |
ul | tgFText, tgFTextTC, tgli, tgliTC, tgol, tgtd, tgtdTC, tgth, tgul | yes | X84 |
Performance
Measured on 2026-11-01 on an aarch64 workstation (Cortex-X925, 20 cores,
single-threaded throughout), Rust 1.99, release profile. Reproduce with
cargo bench -p gaebboss-core and cargo xtask corpus --dir <files>.
Stages, criterion
| benchmark | input | throughput |
|---|---|---|
lex/bvbs-x83-10mb | the BVBS X83 repeated to 10 MB | 2.36 GiB/s |
lex/corpus-largest | a 75 MB real X81 | 15.2 GiB/s |
parse/bvbs-x83-10mb | full typed parse | 675 MiB/s |
parse/corpus-largest | full typed parse | 2.59 GiB/s |
items/oz-and-kind | Ordnungszahl and kind per item | 4.5 M items/s |
items/with-texts | plus short and long text | 1.5 M items/s |
items/totals | category and bill sums | 22 M items/s |
write/compact | typed tree back to XML | 497 MiB/s |
write/pretty | indented | 471 MiB/s |
The synthetic file is dense: small items with long texts and many elements per byte. Real files carry more text per element, which is why the 75 MB X81 reads four times faster per byte.
Whole corpus, cargo xtask corpus
164 real-world files, 189.6 MB, DA XML 3.0 to 3.3:
| stage | throughput |
|---|---|
| tokenize | 2585 MB/s (1.12 M nodes) |
| typed parse | 866 MB/s, 0 errors |
| items with texts | 3797 MB/s (28 418 items, 15.4 MB of text) |
| write back | 421 MB/s (76.4 MB written) |
Warnings over the corpus: 800 unknown elements (vendor extensions such
as Codetext and OZ, and HTML placed where the schema has none) and 9
duplicated Totals, all kept.
Why it is fast
- One pass over the bytes with
memchrbuilds a flat tape of spans; nothing is copied unless an entity has to be decoded. - Element names resolve through a generated length-switched match, no hashing.
- The typed model stores spans and fixed-point decimals, so building it
allocates one
Vecper repeated field and nothing per string. - Readers and writers are generated per type as straight loops: no reflection, no per-value dispatch, no intermediate DOM.
- Texts are rendered from the tape on demand, so a caller that never asks for a long text never pays for it.
perf is not available in the environment this was built in; the
remaining profiling work is listed under limitations.
Limitations
- GAEB 90 (
.d8x), GAEB 2000 (.p8x) and DA XML before 3.0 are detected and named, not parsed. - Writing targets 3.2 and 3.3. A 3.0 or 3.1 document is written as 3.2.
- Phases outside X80 to X89 (trade X93 to X97, cost X50 to X52, quantity X31, Zeitvertrag) are read into the typed model and written back, but have no navigation layer, no validation rules and no tests beyond “reads without error”.
- Converting a document to a phase that requires elements the source lacks
yields an invalid file by construction; the write report names the missing
elements, and
strictturns them into an error. - Validation checks decimal places for Qty, UP, IT and VAT; other facets
(string lengths, patterns beyond RNoPart) are left to the XSD check in
make conformance. - Text projections and complements read the parsed source; edits made
through
Bidshow up after the document is written and read again. perfwas unavailable where this was built, so the profiling pass is still open; see performance.