Oihana PHP System

BusinessDocumentLine extends StructuredValue uses BusinessDocumentLineTrait, HasColor, HasPhysicalMeasures

A single line of a {@see BusinessDocument} : the item sold, its quantity and price, the taxes and adjustments applying to it, and the resulting line totals.

taxes and adjustments are scoped to this line — a document can mix lines taxed at different rates, or carry a line-specific discount, independently of the document-level DocumentTotals.

Tags
author

Marc Alcaraz (eKameleon)

since
1.3.0

Table of Contents

Constants

ADDITIONAL_PROPERTY  : string = 'additionalProperty'
ADJUSTMENTS  : string = 'adjustments'
COLOR  : string = 'color'
CONTEXT  : string = \xyz\oihana\schema\constants\Oihana::SCHEMA
The @context of the json-ld representation of the thing.
FREE_REASON  : string = 'freeReason'
INCLUDED_IN_TOTAL  : string = 'includedInTotal'
ITEM  : string = 'item'
JSON_PRIORITY_KEYS  : array<string|int, mixed> = [\org\schema\constants\Schema::AT_TYPE, \org\sc...
Defines the priority order of keys when serializing the object to JSON-LD.
POSITION  : string = 'position'
PRICE  : string = 'price'
QUANTITY  : string = 'quantity'
QUANTITY_ORIGIN  : string = 'quantityOrigin'
SECTION  : string = 'section'
SUBTOTAL  : string = 'subtotal'
TAXES  : string = 'taxes'
TECHNICAL_NOTE  : string = 'technicalNote'
TOTAL  : string = 'total'
UNIT  : string = 'unit'
VOLUME  : string = 'volume'
WEIGHT  : string = 'weight'

Properties

$_from  : string|null
The metadata to indicates the edge 'from' identifier.
$_id  : null|string
The metadata identifier of the item.
$_key  : null|string
The metadata unique key identifier of the thing.
$_rev  : null|string
The metadata revision value of the thing.
$_to  : string|null
The metadata to indicates the edge 'to' identifier.
$active  : bool|null
The visibility flag.
$additionalProperty  : null|array<string|int, mixed>|PropertyValue
A property-value pair representing an additional characteristic of the entity, e.g. a product feature or another characteristic for which there is no matching property in schema.org.
$additionalType  : array<string|int, mixed>|string|null|object
An additionalType for the item.
$adjustments  : null|array<string|int, mixed>|Adjustment
The adjustments (discounts, surcharges, fees...) applying to this line.
$alternateName  : string|object|array<string|int, mixed>|null
An alias for the item.
$color  : string|null
An optional house color, expressed as a `#RRGGBB` hex string.
$created  : null|string
Date of creation of the resource.
$description  : string|object|array<string|int, mixed>|null
A short description of the item.
$disambiguatingDescription  : string|null
A sub property of description. A short description of the item used to disambiguate from other, similar items. Information from other properties (in particular, name) may be necessary for the description to be useful for disambiguation.
$freeReason  : DefinedTerm|array<string|int, mixed>|null
Why the goods on this line leave without being invoiced — a gift, a breakage, a sample, goods that were the customer's to begin with.
$hasPart  : string|Thing|array<string|int, Thing>|null
Indicates an item that this part of this item.
$id  : null|int|string
The unique identifier of the item.
$identifier  : string|null
The identifier of the item.
$image  : string|ImageObject|array<string|int, ImageObject|string>|null
The image reference of this resource.
$includedInTotal  : bool|null
Whether this line counts towards the document totals.
$isPartOf  : string|Thing|array<string|int, Thing>|null
Indicates an item that this item is part of.
$item  : null|array<string|int, mixed>|Product|Service
The product or service sold on this line.
$license  : string|object|null
A legal document giving official permission to do something with the resource.
$mainEntityOfPage  : string|null
Indicates a page (or other CreativeWork) for which this thing is the main entity being described.
$modified  : null|string
Date on which the resource was changed.
$name  : int|string|null
The name of the item.
$owner  : null|string|Thing
The owner of this Thing.
$position  : int|string|null
The position of this line within the document (e.g. 1, 2, 3...).
$potentialAction  : array<string|int, mixed>|Action|null
Indicates a potential Action, which describes an idealized action in which this thing would play an 'object' role.
$price  : MonetaryAmount|PriceSpecification|array<string|int, mixed>|null
The unit price of the item.
$publisher  : string|array<string|int, string|Person|Organization>|Person|Organization|null
The publisher of the resource.
$quantity  : int|float|QuantitativeValue|array<string|int, mixed>|null
The quantity of the item sold on this line.
$quantityOrigin  : string|QuantityOrigin|null
Where the quantity above comes from — worked out by the system, or typed by someone ({@see QuantityOrigin}).
$sameAs  : string|array<string|int, mixed>|null
URL of a reference Web page that unambiguously indicates the item's identity.
$section  : string|null
The heading this line belongs to, when the document is written in chapters — « roof frame », « oak flooring », « laying ».
$subjectOf  : null|string|array<string|int, mixed>|CreativeWork|Event
A CreativeWork or Event about this Thing.
$subtotal  : MonetaryAmount|array<string|int, mixed>|null
The line total before tax (quantity × price, adjustments applied).
$taxes  : null|array<string|int, mixed>|TaxDetail
The taxes applying to this line.
$technicalNote  : string|null
A note meant for whoever prepares the goods, never for the customer.
$total  : MonetaryAmount|array<string|int, mixed>|null
The line total including tax.
$unit  : null|string|UnitOfSaleType
The unit of sale the quantity is expressed in.
$url  : int|string|null
URL of the item.
$volume  : null|array<string|int, mixed>|int|float|QuantitativeValue
The space this entry takes up.
$weight  : null|array<string|int, mixed>|int|float|QuantitativeValue|Mass
What this entry weighs.
$atContext  : string|null
The JSON-LD `@context` value.
$atType  : string|null
The JSON-LD `@type` value.
$DEFAULT_JSON_SERIALIZE_OPTIONS  : array<string|int, mixed>
The default static jsonSerialize options (class-level configuration).
$schemaTypeCache  : array<string, string>
Internal cache for resolved schema types.

Methods

__construct()  : mixed
Constructor to hydrate public properties from an array or stdClass.
getJsonSerializeOptions()  : array<string|int, mixed>
Returns the default JSON serialization options.
getSchemaType()  : string
Returns the fully qualified URI of the schema type.
jsonSerialize()  : array<string|int, mixed>
Serializes the current object into a JSON-LD array.
withAtContext()  : $this
Sets the internal JSON-LD `@context` attribute.
withAtType()  : $this
Sets the internal JSON-LD `@type` attribute.
withJSONLDMeta()  : $this
Initializes both JSON-LD metadata: `@type` and `@context`.

Constants

CONTEXT

The @context of the json-ld representation of the thing.

public string CONTEXT = \xyz\oihana\schema\constants\Oihana::SCHEMA

JSON_PRIORITY_KEYS

Defines the priority order of keys when serializing the object to JSON-LD.

public array<string|int, mixed> JSON_PRIORITY_KEYS = [\org\schema\constants\Schema::AT_TYPE, \org\schema\constants\Schema::AT_CONTEXT, \org\schema\constants\Schema::_KEY, \org\schema\constants\Schema::_FROM, \org\schema\constants\Schema::_TO, \org\schema\constants\Schema::ID, \org\schema\constants\Schema::NAME, \org\schema\constants\Schema::URL, \org\schema\constants\Schema::CREATED, \org\schema\constants\Schema::MODIFIED]

Keys listed here will always appear first in the serialized array, in the order specified. All remaining public properties will be sorted alphabetically after these priority keys.

This ensures that important JSON-LD metadata and system fields (like @type, @context, _key, id, url, created, modified, etc.) appear at the top of the output for consistency and readability.

Usage:

$orderedKeys = self::JSON_PRIORITY_KEYS;

Notes:

  • Can be overridden in a subclass by redefining the constant.
  • Late static binding (static::JSON_PRIORITY_KEYS) allows child classes to modify the serialization order.

List of JSON-LD keys in priority order.

Properties

$_from

The metadata to indicates the edge 'from' identifier.

public string|null $_from

$_id

The metadata identifier of the item.

public null|string $_id

$_key

The metadata unique key identifier of the thing.

public null|string $_key

$_rev

The metadata revision value of the thing.

public null|string $_rev

$_to

The metadata to indicates the edge 'to' identifier.

public string|null $_to

$active

The visibility flag.

public bool|null $active

$additionalProperty

A property-value pair representing an additional characteristic of the entity, e.g. a product feature or another characteristic for which there is no matching property in schema.org.

public null|array<string|int, mixed>|PropertyValue $additionalProperty = null
Attributes
#[HydrateWith]
\org\schema\PropertyValue::class

$additionalType

An additionalType for the item.

public array<string|int, mixed>|string|null|object $additionalType

$adjustments

The adjustments (discounts, surcharges, fees...) applying to this line.

public null|array<string|int, mixed>|Adjustment $adjustments
Attributes
#[HydrateWith]
\xyz\oihana\schema\business\documents\Adjustment::class

$alternateName

An alias for the item.

public string|object|array<string|int, mixed>|null $alternateName

$color

An optional house color, expressed as a `#RRGGBB` hex string.

public string|null $color

Example:

$term->color = '#7B1E3A' ;

$created

Date of creation of the resource.

public null|string $created

$description

A short description of the item.

public string|object|array<string|int, mixed>|null $description

$disambiguatingDescription

A sub property of description. A short description of the item used to disambiguate from other, similar items. Information from other properties (in particular, name) may be necessary for the description to be useful for disambiguation.

public string|null $disambiguatingDescription

$freeReason

Why the goods on this line leave without being invoiced — a gift, a breakage, a sample, goods that were the customer's to begin with.

public DefinedTerm|array<string|int, mixed>|null $freeReason = null

🔑 Its presence is what says the line is offered. There is deliberately no boolean beside it : an ERP carrying both a flag and a reason has been observed with the two drifting apart, and a line claiming to be a gift while still charging money is the one thing this property exists to prevent.

The term is frozen by its code and its label (id + name), never by its storage key : a controlled vocabulary re-harvested into a fresh collection is renumbered, and a line pointing at a key would silently designate another term.

Tags
since
1.4.0
Attributes
#[HydrateAs]
\org\schema\DefinedTerm::class

$hasPart

Indicates an item that this part of this item.

public string|Thing|array<string|int, Thing>|null $hasPart

$id

The unique identifier of the item.

public null|int|string $id

$identifier

The identifier of the item.

public string|null $identifier

$includedInTotal

Whether this line counts towards the document totals.

public bool|null $includedInTotal = null

🔑 Its absence means the line counts. Only a line left out says so, which keeps every document written before this property existed exactly as true as it was.

A priced line is not always a line to pay for. A quote may offer the same work twice — two floorings, two finishes — and expect the customer to keep one : both are printed, both are costed, one is billed. The lines of the discarded option are ordinary lines, with an item, a quantity and a price ; nothing about their content sets them apart. Summing them anyway has been measured to overstate a real quote by a factor of two.

The same slot serves anything shown but not owed — an informational fee, a figure quoted for reference.

⚠️ Do not read it as « this line is a variant » : the reason a line is left out is not its business, only the fact is.

Tags
since
1.4.0

$isPartOf

Indicates an item that this item is part of.

public string|Thing|array<string|int, Thing>|null $isPartOf

$item

The product or service sold on this line.

public null|array<string|int, mixed>|Product|Service $item

The Product|Service union is resolved from the payload's @type : a raw item hydrates into a Service when it says so, and into the commerce-enriched Product (a org\schema\Product) otherwise.

Attributes
#[HydrateWith]
\xyz\oihana\schema\products\Product::class
\org\schema\Service::class

$license

A legal document giving official permission to do something with the resource.

public string|object|null $license

$mainEntityOfPage

Indicates a page (or other CreativeWork) for which this thing is the main entity being described.

public string|null $mainEntityOfPage

$modified

Date on which the resource was changed.

public null|string $modified

$name

The name of the item.

public int|string|null $name

$owner

The owner of this Thing.

public null|string|Thing $owner

Represents any entity (person, organization, system, or other object) that can be considered the possessor of this Thing.

$position

The position of this line within the document (e.g. 1, 2, 3...).

public int|string|null $position

$potentialAction

Indicates a potential Action, which describes an idealized action in which this thing would play an 'object' role.

public array<string|int, mixed>|Action|null $potentialAction

$quantity

The quantity of the item sold on this line.

public int|float|QuantitativeValue|array<string|int, mixed>|null $quantity
Attributes
#[HydrateAs]
\org\schema\QuantitativeValue::class

$quantityOrigin

Where the quantity above comes from — worked out by the system, or typed by someone ({@see QuantityOrigin}).

public string|QuantityOrigin|null $quantityOrigin = null

A line written as the consequence of another — a treatment that comes with the timber, a service an article carries — holds a quantity nobody typed : it is worked out from the line it serves, and the two are bound. Four boards of 0.019 cubic metres each make 0.076 cubic metres of treatment, and nothing else.

🚨 Two rules are right, and they exclude each other. A bound quantity that stops following under-bills in silence — raise the boards to a hundred and the treatment stays at 0.076, twenty-five times short of the work that will be done, with nothing on screen to say so. A typed quantity that gets overwritten erases a decision just as quietly : whoever typed it had measured, or agreed a lump sum.

The line therefore has to remember which of the two it is under, and this is where it does. It is born CALCULATED and turns ENTERED on the first figure typed into it ; it does not come back on its own.

⚠️ An absent value states nothing, and must not be read as ENTERED : a line written before the property existed says nothing about where its number came from.

🔑 This says where the number came from, never what it is bound to. The line it follows — when it follows one — is named by the inherited isPartOf, and the two answer different questions : one is a provenance, the other a relation.

Tags
since
1.5.0

$sameAs

URL of a reference Web page that unambiguously indicates the item's identity.

public string|array<string|int, mixed>|null $sameAs

E.g. the URL of the item's Wikipedia page, Wikidata entry, or official website.

$section

The heading this line belongs to, when the document is written in chapters — « roof frame », « oak flooring », « laying ».

public string|null $section = null

A plain label, repeated on every line of the same group, and deliberately nothing more : no section class, no nesting, no subtotal of its own. The grouping is whatever shares the label, which is enough to print a document in chapters and cheap enough to be worth carrying even when nothing reads it yet.

🚨 Never store the group's subtotal here or beside it. A recap amount living next to the lines it recaps is the shortest path to counting the same goods twice — it is derived, and it stays derived.

Distinct from the inherited description, which names the item itself : a description belongs to one line, a heading is shared by several.

Tags
since
1.4.0

$subjectOf

A CreativeWork or Event about this Thing.

public null|string|array<string|int, mixed>|CreativeWork|Event $subjectOf

$subtotal

The line total before tax (quantity × price, adjustments applied).

public MonetaryAmount|array<string|int, mixed>|null $subtotal
Attributes
#[HydrateAs]
\org\schema\MonetaryAmount::class

$taxes

The taxes applying to this line.

public null|array<string|int, mixed>|TaxDetail $taxes
Attributes
#[HydrateWith]
\xyz\oihana\schema\business\documents\TaxDetail::class

$technicalNote

A note meant for whoever prepares the goods, never for the customer.

public string|null $technicalNote = null

The sibling of the inherited description, which is what the customer reads on the document : « reprendre les 3 colis palette 12, ne pas remettre en stock » belongs on the picking slip and nowhere else. Keeping the two apart is what lets a document be printed twice, for two audiences, from a single line.

Tags
since
1.4.0

$url

URL of the item.

public int|string|null $url

$volume

The space this entry takes up.

public null|array<string|int, mixed>|int|float|QuantitativeValue $volume

The twin of HasPhysicalMeasures::$weight, and read the same way : a plain number when the unit is implicit, a QuantitativeValue when it is stated ({ value: 1.403, unitCode: "MTQ" }) ; an array is hydrated as the latter and sits there until it is.

On a line, the quantity multiplied by what the unit it is counted in occupies. Summed over the lines, it gives the document's own volume.

Tags
since
1.4.0
Attributes
#[HydrateAs]
\org\schema\QuantitativeValue::class

$weight

What this entry weighs.

public null|array<string|int, mixed>|int|float|QuantitativeValue|Mass $weight

On a line, the quantity multiplied by what the unit it is counted in weighs. Summed over the lines, it gives the document's own weight.

A plain number carries it when the unit is implicit, a QuantitativeValue when the unit is stated ({ value: 537.6, unitCode: "KGM" }) ; an array is hydrated as the latter. The same union as BusinessDocument::$weight, so a weight reads the same wherever it is met.

Deliberately neutral about gross and net. Should the distinction ever be needed, it belongs to the additionalType of a QuantitativeValue, never to a second property — two weights held in parallel eventually disagree.

Tags
since
1.4.0
Attributes
#[HydrateAs]
\org\schema\QuantitativeValue::class

$atContext

The JSON-LD `@context` value.

protected string|null $atContext = null

Default is https://schema.org.

$atType

The JSON-LD `@type` value.

protected string|null $atType = null

This can be manually set or automatically inferred from the class name.

$DEFAULT_JSON_SERIALIZE_OPTIONS

The default static jsonSerialize options (class-level configuration).

protected static array<string|int, mixed> $DEFAULT_JSON_SERIALIZE_OPTIONS = []

$schemaTypeCache

Internal cache for resolved schema types.

private static array<string, string> $schemaTypeCache = []

Methods

__construct()

Constructor to hydrate public properties from an array or stdClass.

public __construct([array<string|int, mixed>|object|null $init = null ]) : mixed

This allows objects to be quickly populated with associative data without manually setting each property.

Parameters
$init : array<string|int, mixed>|object|null = null

A data array or object used to initialize the instance. Keys must match public property names.

Tags
throws
ReflectionException
example
use org\schema\Person;
use org\schema\constants\Prop;

$person = new Person
([
    Prop::NAME => 'Jane Doe',
    Prop::URL  => 'https://example.com/janedoe'
]);

echo $person->name; // Outputs: Jane Doe

getJsonSerializeOptions()

Returns the default JSON serialization options.

public getJsonSerializeOptions() : array<string|int, mixed>

This method determines how the jsonSerialize() output is reduced or compressed, etc. It can be overridden in child classes to customize serialization behavior.

Return values
array<string|int, mixed>

Returns the reduction/compression options for JSON serialization.

getSchemaType()

Returns the fully qualified URI of the schema type.

public static getSchemaType() : string

This method combines the class's CONTEXT constant with its short name to produce a globally unique identifier for the entity type.

  • It uses Late Static Binding to ensure the correct context is retrieved even when called from an inherited class (e.g., Corporation vs. Affiliate).
  • Performance Optimization: Results are stored in a static cache ($schemaTypeCache) to avoid redundant Reflection calls during the same execution lifecycle.
Return values
string

The absolute URI of the type (e.g., "https://schema.org/Thing"). ** @example

echo Thing::getSchemaType();      // https://schema.org/Thing
echo Affiliate::getSchemaType();  // https://schema.oihana.xyz/Pagination

jsonSerialize()

Serializes the current object into a JSON-LD array.

public jsonSerialize() : array<string|int, mixed>

Includes public properties, the JSON-LD @context and @type. Null values are automatically removed.

Tags
throws
ReflectionException

If reflection fails when accessing properties.

example
use org\schema\Person;
use org\schema\constants\Prop;

$person = new Person
([
    Prop::NAME => 'John Smith',
    Prop::ID   => 'jsmith-001'
]);

echo json_encode($person, JSON_PRETTY_PRINT);

Output:

{
   "@type": "Person",
   "@context": "https://schema.org",
   "id": "jsmith-001",
   "name": "John Smith"
}
Return values
array<string|int, mixed>

JSON-LD representation of the object.

withAtContext()

Sets the internal JSON-LD `@context` attribute.

public withAtContext(string $context) : $this

Useful if you need a custom JSON-LD context.

Parameters
$context : string

Optional JSON-LD context.

Return values
$this

withAtType()

Sets the internal JSON-LD `@type` attribute.

public withAtType(string $type) : $this

Allows overriding the default type inferred from the class.

Parameters
$type : string

Optional JSON-LD type

Return values
$this

withJSONLDMeta()

Initializes both JSON-LD metadata: `@type` and `@context`.

public withJSONLDMeta([string|null $atType = null ][, string|null $atContext = null ]) : $this

Can be called from constructor or later to override default values.

Parameters
$atType : string|null = null

Optional JSON-LD type

$atContext : string|null = null

Optional JSON-LD context

Return values
$this
On this page

Search results