TalerProductLink
extends CommonObject
in package
Class TalerProductLink
Link table object between a Dolibarr Product and its representation in the Taler Merchant Backend. Holds mapping keys, last sync info, cached prices/stock and a few denormalized attributes.
Tags
Table of Contents
Properties
- $checksum_d_hex : mixed
- $checksum_t_hex : mixed
- $datec : mixed
- $element : string
- $entity : mixed
- $fields : mixed
- $fk_product : mixed
- $fk_unit : mixed
- $isextrafieldmanaged : int
- $ismultientitymanaged : int|string
- $last_error_code : mixed
- $last_error_message : mixed
- $last_sync_at : mixed
- $last_sync_status : mixed
- $lastsync_is_push : mixed
- $module : string
- $picto : string
- $price_is_ttc : mixed
- $product_ref_snap : mixed
- $product_tms_snap : mixed
- $rowid : mixed
- $sync_enabled : mixed
- $syncdirection_override : mixed
- $table_element : string
- $taler_address_json : mixed
- $taler_amount_str : mixed
- $taler_categories_json : mixed
- $taler_currency : mixed
- $taler_description : mixed
- $taler_fraction : mixed
- $taler_image_hash : mixed
- $taler_instance : mixed
- $taler_minimum_age : mixed
- $taler_next_restock : mixed
- $taler_product_id : mixed
- $taler_product_name : mixed
- $taler_taxes_json : mixed
- $taler_total_lost : mixed
- $taler_total_sold : mixed
- $taler_total_stock : mixed
- $taler_value : mixed
- $tms : mixed
Methods
- __construct() : mixed
- Constructor
- amountStrFromPrice() : string
- Convert a numeric price to the Taler “amount” string, e.g. 12.5 EUR → "EUR:12.50".
- buildVatDiagnosis() : array<string, mixed>
- Derive VAT diagnostics and a safe tax suggestion for UI warnings.
- computeSha256Hex() : string
- Compute SHA-256 hex of normalized data
- create() : int
- Create record in database
- createDolibarrProductFromTalerDetail() : int
- Create a Dolibarr Product from a Taler ProductDetail and (optionally) create the link row.
- delete() : int
- Delete object from database
- deleteOnTaler() : bool
- Delete the product on the Taler backend.
- dolibarrArrayFromTalerDetail() : array<string|int, mixed>
- Create a Dolibarr product "field array" from a Taler ProductDetail.
- fetch() : int
- Fetch object from database
- fetchByInstancePid() : int
- Fetch by Taler instance and product id
- fetchByProductId() : int
- Fetch by Dolibarr product id
- fillPriceFromAmountStr() : void
- Populate price fields from taler_amount_str
- getLabelForList() : string
- Build a concise label for lists.
- getNomUrl() : string
- Get HTML link for this object (standard Dolibarr pattern).
- markSyncResult() : void
- Mark synchronization result
- parseTalerAmount() : array<string|int, mixed>
- Parse Taler amount string
- prepareFromDolibarrAndTalerDetail() : $this
- Prepare this link row from a Dolibarr product AND a Taler ProductDetail (partial or full).
- pullFromTaler() : bool
- Pull latest product data from Taler and (optionally) update Dolibarr.
- pushToTaler() : bool
- Push (create or update) the linked Dolibarr product to the Taler inventory.
- setDolibarrSnapshot() : void
- Save Dolibarr product reference + timestamp snapshot
- talerAmountFromFloat() : string
- Build Taler amount string from float
- talerDetailFromDolibarrProduct() : array<string|int, mixed>
- Build a Taler ProductDetail array from a Dolibarr Product.
- talerPayloadFromDolibarr() : array<string|int, mixed>
- Backward-compatible payload wrapper
- update() : int
- Update object into database
- upsertFromDolibarr() : int
- Idempotent upsert driven by a *Dolibarr* product.
- upsertFromTaler() : int
- Idempotent upsert driven by a *Taler* ProductDetail array/object.
- _canon() : string
- Deterministic JSON encoding for hash calculation.
- _checksumDoli() : string
- Compute SHA-256 on a subset of Dolibarr product fields (canonicalized).
- amountStringToFloat() : float|null
- Convert "CUR:amount" into float, null on error.
- applyVatToProduct() : void
- Apply VAT details to a Product object.
- buildTaxesForDolibarrProduct() : array<string|int, mixed>
- Build a spec-compliant Tax[] array from a Dolibarr product line.
- fetchVatDetails() : array<string, mixed>|null
- Fetch VAT details from c_tva to apply on Product.
- findNearestVat() : array{fk_c_tva: int, rate: float, diff: float}|null
- Find the nearest active VAT line in Dolibarr's dictionary.
- getMerchantClient() : TalerMerchantClient|null
- Build a ready-to-use TalerMerchantClient for this link.
- guessDecimalsFromAmount() : int
- Guess how many decimals are present in a Taler amount string.
- log() : void
- Lightweight logger wrapper to keep messages consistent.
- logTalerError() : void
- Lightweight wrapper to persist an error row (if the table/class exists).
- parseTaxAmountToFloat() : float|null
- Parse a tax amount coming from Taler into float, updating decimals/currency hints.
- resolveInstanceFromConfig() : string
- Resolve instance from TalerConfig if available
- resolveUnitCodeById() : string
- Get unit code from fk_unit
- resolveUnitIdByCode() : int|null
- Get unit id from code
- resolveVatFromTalerTaxes() : array{rate: float|null, fk_c_tva: int|null}
- Try to resolve VAT rate/fk_c_tva from Taler taxes + price.
Properties
$checksum_d_hex
public
mixed
$checksum_d_hex
$checksum_t_hex
public
mixed
$checksum_t_hex
$datec
public
mixed
$datec
$element
public
string
$element
= 'talerproductlink'
$entity
public
mixed
$entity
$fields
public
mixed
$fields
= array('rowid' => array('type' => 'integer', 'label' => 'TechnicalID', 'visible' => 0, 'notnull' => 1, 'index' => 1, 'position' => 1), 'entity' => array('type' => 'integer', 'label' => 'Entity', 'visible' => 0, 'notnull' => 1, 'default' => 1, 'index' => 1, 'position' => 5), 'fk_product' => array('type' => 'integer:Product:product/class/product.class.php', 'label' => 'Product', 'visible' => 1, 'notnull' => 0, 'index' => 1, 'position' => 10, 'picto' => 'product'), 'product_ref_snap' => array('type' => 'varchar(64)', 'label' => 'ProductRefSnap', 'visible' => 1, 'notnull' => 0, 'position' => 12, 'enabled' => '1'), 'product_tms_snap' => array('type' => 'datetime', 'label' => 'ProductTMSSnap', 'visible' => 0, 'notnull' => 0, 'position' => 13, 'enabled' => '1'), 'taler_instance' => array('type' => 'varchar(64)', 'label' => 'TalerInstance', 'visible' => 1, 'notnull' => 1, 'index' => 1, 'position' => 20, 'enabled' => '1'), 'taler_product_id' => array('type' => 'varchar(128)', 'label' => 'TalerProductId', 'visible' => 1, 'notnull' => 1, 'index' => 1, 'position' => 21, 'enabled' => '1'), 'taler_product_name' => array('type' => 'varchar(128)', 'label' => 'TalerProdName', 'visible' => 1, 'notnull' => 1, 'position' => 22, 'enabled' => '1'), 'taler_description' => array('type' => 'varchar(2048)', 'label' => 'TalerDescription', 'visible' => 1, 'notnull' => 1, 'position' => 23, 'enabled' => '1'), 'taler_amount_str' => array('type' => 'varchar(64)', 'label' => 'TalerAmountStr', 'visible' => 1, 'notnull' => 0, 'position' => 30, 'help' => 'e.g. EUR:12.34', 'enabled' => '1'), 'taler_currency' => array('type' => 'varchar(16)', 'label' => 'Currency', 'visible' => 1, 'notnull' => 0, 'position' => 31, 'enabled' => '1'), 'taler_value' => array('type' => 'integer', 'label' => 'MajorUnits', 'visible' => 1, 'notnull' => 0, 'position' => 32, 'help' => 'Integer units'), 'taler_fraction' => array('type' => 'integer', 'label' => 'Fraction1e8', 'visible' => 1, 'notnull' => 0, 'position' => 33, 'help' => '0..99,999,999'), 'price_is_ttc' => array('type' => 'boolean', 'label' => 'PriceTTC', 'visible' => 1, 'notnull' => 1, 'default' => 1, 'position' => 34), 'fk_unit' => array('type' => 'integer', 'label' => 'Unit', 'visible' => 1, 'notnull' => 0, 'position' => 40), 'taler_total_stock' => array('type' => 'integer', 'label' => 'TotalStock', 'visible' => 1, 'notnull' => 0, 'position' => 41, 'default' => -1, 'help' => '-1 means infinite', 'enabled' => '1'), 'taler_total_sold' => array('type' => 'integer', 'label' => 'TotalSold', 'visible' => 1, 'notnull' => 0, 'position' => 42, 'enabled' => '1'), 'taler_total_lost' => array('type' => 'integer', 'label' => 'TotalLost', 'visible' => 1, 'notnull' => 0, 'position' => 43, 'enabled' => '1'), 'taler_categories_json' => array('type' => 'text', 'label' => 'TalerCategoriesJSON', 'visible' => 1, 'notnull' => 0, 'position' => 50, 'enabled' => '1'), 'taler_taxes_json' => array('type' => 'text', 'label' => 'TalerTaxesJSON', 'visible' => 1, 'notnull' => 0, 'position' => 51, 'enabled' => '1'), 'taler_address_json' => array('type' => 'text', 'label' => 'TalerAddressJSON', 'visible' => 1, 'notnull' => 0, 'position' => 52, 'enabled' => '1'), 'taler_image_hash' => array('type' => 'varchar(64)', 'label' => 'ImageHash', 'visible' => 0, 'notnull' => 0, 'position' => 53), 'taler_next_restock' => array('type' => 'datetime', 'label' => 'NextRestock', 'visible' => 1, 'notnull' => 0, 'position' => 54, 'enabled' => '1'), 'taler_minimum_age' => array('type' => 'integer', 'label' => 'MinimumAge', 'visible' => 1, 'notnull' => 0, 'position' => 55, 'enabled' => '1'), 'sync_enabled' => array('type' => 'boolean', 'label' => 'SyncEnabled', 'visible' => 1, 'notnull' => 1, 'default' => 1, 'position' => 60, 'index' => 1), 'syncdirection_override' => array('type' => 'integer', 'label' => 'SyncDirectionOverride', 'visible' => 1, 'notnull' => 0, 'position' => 61, 'arrayofkeyval' => array('1' => 'PullTalerToDoli', '0' => 'PushDoliToTaler')), 'lastsync_is_push' => array('type' => 'integer', 'label' => 'LastSyncIsPush', 'visible' => 0, 'notnull' => 0, 'position' => 70, 'arrayofkeyval' => array('0' => 'Pull', '1' => 'Push')), 'last_sync_status' => array('type' => 'varchar(16)', 'label' => 'LastSyncStatus', 'visible' => 1, 'notnull' => 0, 'position' => 71, 'arrayofkeyval' => array('ok' => 'OK', 'error' => 'Error', 'conflict' => 'Conflict')), 'last_sync_at' => array('type' => 'datetime', 'label' => 'LastSyncAt', 'visible' => 1, 'notnull' => 0, 'position' => 72), 'last_error_code' => array('type' => 'varchar(64)', 'label' => 'LastErrorCode', 'visible' => 0, 'notnull' => 0, 'position' => 73), 'last_error_message' => array('type' => 'text', 'label' => 'LastErrorMessage', 'visible' => 0, 'notnull' => 0, 'position' => 74), 'checksum_d_hex' => array('type' => 'varchar(64)', 'label' => 'ChecksumD', 'visible' => 0, 'notnull' => 0, 'position' => 80), 'checksum_t_hex' => array('type' => 'varchar(64)', 'label' => 'ChecksumT', 'visible' => 0, 'notnull' => 0, 'position' => 81), 'datec' => array('type' => 'datetime', 'label' => 'DateCreation', 'visible' => -2, 'notnull' => 0, 'position' => 500), 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'visible' => -2, 'notnull' => 1, 'position' => 501))
$fk_product
public
mixed
$fk_product
$fk_unit
public
mixed
$fk_unit
$isextrafieldmanaged
public
int
$isextrafieldmanaged
= 0
$ismultientitymanaged
public
int|string
$ismultientitymanaged
= 1
$last_error_code
public
mixed
$last_error_code
$last_error_message
public
mixed
$last_error_message
$last_sync_at
public
mixed
$last_sync_at
$last_sync_status
public
mixed
$last_sync_status
$lastsync_is_push
public
mixed
$lastsync_is_push
$module
public
string
$module
= 'talerbarr'
$picto
public
string
$picto
= 'fa-link'
$price_is_ttc
public
mixed
$price_is_ttc
$product_ref_snap
public
mixed
$product_ref_snap
$product_tms_snap
public
mixed
$product_tms_snap
$rowid
public
mixed
$rowid
$sync_enabled
public
mixed
$sync_enabled
$syncdirection_override
public
mixed
$syncdirection_override
$table_element
public
string
$table_element
= 'talerbarr_product_link'
$taler_address_json
public
mixed
$taler_address_json
$taler_amount_str
public
mixed
$taler_amount_str
$taler_categories_json
public
mixed
$taler_categories_json
$taler_currency
public
mixed
$taler_currency
$taler_description
public
mixed
$taler_description
$taler_fraction
public
mixed
$taler_fraction
$taler_image_hash
public
mixed
$taler_image_hash
$taler_instance
public
mixed
$taler_instance
$taler_minimum_age
public
mixed
$taler_minimum_age
$taler_next_restock
public
mixed
$taler_next_restock
$taler_product_id
public
mixed
$taler_product_id
$taler_product_name
public
mixed
$taler_product_name
$taler_taxes_json
public
mixed
$taler_taxes_json
$taler_total_lost
public
mixed
$taler_total_lost
$taler_total_sold
public
mixed
$taler_total_sold
$taler_total_stock
public
mixed
$taler_total_stock
$taler_value
public
mixed
$taler_value
$tms
public
mixed
$tms
Methods
__construct()
Constructor
public
__construct(DoliDB $db) : mixed
Parameters
- $db : DoliDB
-
Database handler
amountStrFromPrice()
Convert a numeric price to the Taler “amount” string, e.g. 12.5 EUR → "EUR:12.50".
public
static amountStrFromPrice(float $price, string $currency[, int $scale = 2 ]) : string
Parameters
- $price : float
-
Positive decimal amount (major units)
- $currency : string
-
ISO-4217 code, case-insensitive
- $scale : int = 2
-
Max decimals to keep (Taler allows up to 8)
Return values
string —Formatted "<CUR>:
buildVatDiagnosis()
Derive VAT diagnostics and a safe tax suggestion for UI warnings.
public
static buildVatDiagnosis(string|null $taxJson, string|null $priceStr, DoliDB $db) : array<string, mixed>
Parameters
- $taxJson : string|null
-
JSON from taler_taxes_json.
- $priceStr : string|null
-
Taler price string (CUR:amount).
- $db : DoliDB
-
DB handler.
Return values
array<string, mixed> —Diagnostic payload (rates, amounts, suggestion).
computeSha256Hex()
Compute SHA-256 hex of normalized data
public
static computeSha256Hex(array<string|int, mixed>|object|string $data) : string
Parameters
- $data : array<string|int, mixed>|object|string
-
Input data
Return values
string —Hash string
create()
Create record in database
public
create(User $user[, int $notrigger = 0 ]) : int
Parameters
- $user : User
-
User performing the action
- $notrigger : int = 0
-
1=do not call triggers
Return values
int —0 if OK, <0 if error
createDolibarrProductFromTalerDetail()
Create a Dolibarr Product from a Taler ProductDetail and (optionally) create the link row.
public
createDolibarrProductFromTalerDetail(array<string|int, mixed>|object $detail, User $user[, array<string|int, mixed> $opts = [] ]) : int
If no config/instance is available, the product is still created and we skip creating the link.
Parameters
- $detail : array<string|int, mixed>|object
-
ProductDetail
- $user : User
-
User performing the action
- $opts : array<string|int, mixed> = []
-
['instance'=>string, 'taler_product_id'=>string, 'create_link'=>bool (true)]
Return values
int —Product ID (>0) or -1 on error
delete()
Delete object from database
public
delete(User $user[, int $notrigger = 0 ]) : int
Parameters
- $user : User
-
User performing the action
- $notrigger : int = 0
-
1=do not call triggers
Return values
int —0 if OK, <0 if error
deleteOnTaler()
Delete the product on the Taler backend.
public
deleteOnTaler(User $user) : bool
Parameters
- $user : User
-
User performing the action
Return values
bool —true on 204, false otherwise
dolibarrArrayFromTalerDetail()
Create a Dolibarr product "field array" from a Taler ProductDetail.
public
static dolibarrArrayFromTalerDetail(array<string|int, mixed>|object $detail[, float|null $vatRate = null ]) : array<string|int, mixed>
Since Taler price is TTC when non-zero, we set price_base_type='TTC' and compute HT if VAT is provided.
Parameters
- $detail : array<string|int, mixed>|object
-
ProductDetail
- $vatRate : float|null = null
-
Optional override VAT rate (percentage) if you want to force a specific VAT
Return values
array<string|int, mixed> —Dolibarr product fields
fetch()
Fetch object from database
public
fetch(int $id[, string|null $ref = null ][, int $noextrafields = 1 ][, int $nolines = 1 ]) : int
Parameters
- $id : int
-
Rowid
- $ref : string|null = null
-
Optional reference
- $noextrafields : int = 1
-
1 = do not load extrafields
- $nolines : int = 1
-
1 = do not load lines
Return values
int —0 if OK, 0 if not found, <0 if error
fetchByInstancePid()
Fetch by Taler instance and product id
public
fetchByInstancePid(string $instance, string $pid) : int
Parameters
- $instance : string
-
Taler instance
- $pid : string
-
Taler product id
Return values
int —0 if OK, 0 if not found, <0 if error
fetchByProductId()
Fetch by Dolibarr product id
public
fetchByProductId(int $fk_product) : int
Parameters
- $fk_product : int
-
Dolibarr product rowid
Return values
int —0 if OK, 0 if not found, <0 if error
fillPriceFromAmountStr()
Populate price fields from taler_amount_str
public
fillPriceFromAmountStr() : void
getLabelForList()
Build a concise label for lists.
public
getLabelForList() : string
Return values
stringgetNomUrl()
Get HTML link for this object (standard Dolibarr pattern).
public
getNomUrl([int $withpicto = 0 ][, string $option = '' ][, int $notooltip = 0 ][, string $morecss = '' ][, int $save_lastsearch_value = -1 ]) : string
Parameters
- $withpicto : int = 0
-
Add picto (0=no, 1=with, 2=only picto)
- $option : string = ''
-
'nolink' to return a span instead of anchor
- $notooltip : int = 0
-
1 to disable tooltip
- $morecss : string = ''
-
Extra CSS classes on the link
- $save_lastsearch_value : int = -1
-
See CommonObject::getNomUrl
Return values
string —HTML
markSyncResult()
Mark synchronization result
public
markSyncResult(bool $isPush, string $status[, string|null $code = null ][, string|null $message = null ][, int|null $ts = null ]) : void
Parameters
- $isPush : bool
-
True if push, false if pull
- $status : string
-
Sync status
- $code : string|null = null
-
Optional error code
- $message : string|null = null
-
Optional error message
- $ts : int|null = null
-
Optional timestamp
parseTalerAmount()
Parse Taler amount string
public
static parseTalerAmount(string $amountStr) : array<string|int, mixed>
Parameters
- $amountStr : string
-
Amount string (aka "CUR:12.34")
Return values
array<string|int, mixed> —['currency'=>string,'value'=>int|null,'fraction'=>int|null]
prepareFromDolibarrAndTalerDetail()
Prepare this link row from a Dolibarr product AND a Taler ProductDetail (partial or full).
public
prepareFromDolibarrAndTalerDetail(Product $prod[, array<string|int, mixed>|object|null $detail = null ][, array<string|int, mixed> $opts = [] ]) : $this
Useful if you have both objects and want to mirror extra fields (taxes, address, etc.).
Parameters
- $prod : Product
-
Product from dolibarr
- $detail : array<string|int, mixed>|object|null = null
-
ProductDetail
- $opts : array<string|int, mixed> = []
-
['instance'=>string]
Return values
$thispullFromTaler()
Pull latest product data from Taler and (optionally) update Dolibarr.
public
pullFromTaler(User $user[, bool $writeDoli = true ][, string|null $productId = null ]) : bool
Parameters
- $user : User
-
User performing the action
- $writeDoli : bool = true
-
true = update or create Dolibarr product when missing
- $productId : string|null = null
-
productId which we have to update
Return values
bool —true on success, false on failure
pushToTaler()
Push (create or update) the linked Dolibarr product to the Taler inventory.
public
pushToTaler(User $user, Product $prod) : bool
Parameters
- $user : User
-
User performing the action
- $prod : Product
-
Dolibarr product to export (already loaded)
Return values
bool —true on success, false on failure (errors logged & set)
setDolibarrSnapshot()
Save Dolibarr product reference + timestamp snapshot
public
setDolibarrSnapshot(Product $prod) : void
Parameters
- $prod : Product
-
Dolibarr product
talerAmountFromFloat()
Build Taler amount string from float
public
static talerAmountFromFloat(float $price, string $currency) : string
Parameters
- $price : float
-
Price as number
- $currency : string
-
Currency (e.g. EUR)
Return values
stringtalerDetailFromDolibarrProduct()
Build a Taler ProductDetail array from a Dolibarr Product.
public
talerDetailFromDolibarrProduct(Product $prod[, array<string|int, mixed> $opts = [] ]) : array<string|int, mixed>
Price is exported as TTC Amount (as required by Taler).
Parameters
- $prod : Product
-
Product from dolibarr
- $opts : array<string|int, mixed> = []
-
['instance'=>string] // optional, not embedded in ProductDetail but used for category mapping
Return values
array<string|int, mixed> —ProductDetail
talerPayloadFromDolibarr()
Backward-compatible payload wrapper
public
static talerPayloadFromDolibarr(Product $prod[, TalerConfig|null $cfg = null ][, array<string|int, mixed> $opts = [] ]) : array<string|int, mixed>
Parameters
- $prod : Product
-
Product from dolibarr
- $cfg : TalerConfig|null = null
-
Taler config
- $opts : array<string|int, mixed> = []
-
Options array
Return values
array<string|int, mixed>update()
Update object into database
public
update(User $user[, int $notrigger = 0 ]) : int
Parameters
- $user : User
-
User performing the action
- $notrigger : int = 0
-
1=do not call triggers
Return values
int —0 if OK, <0 if error
upsertFromDolibarr()
Idempotent upsert driven by a *Dolibarr* product.
public
static upsertFromDolibarr(DoliDB $db, Product $prod, User $user[, TalerConfig|null $cfg = null ]) : int
Parameters
- $db : DoliDB
-
db handler
- $prod : Product
-
Product from dolibarr
- $user : User
-
User performing the action
- $cfg : TalerConfig|null = null
-
(optional) pre-loaded config
Return values
int —1 = OK, 0 = ignored (no active cfg / pull-only), -1 = functional/SQL error (already logged)
upsertFromTaler()
Idempotent upsert driven by a *Taler* ProductDetail array/object.
public
static upsertFromTaler(DoliDB $db, object|array<string|int, mixed> $detail, User $user[, array<string|int, mixed> $opts = [] ]) : int
Parameters
- $db : DoliDB
-
- db handler
- $detail : object|array<string|int, mixed>
-
- full JSON object returned by the backend
- $user : User
-
- User performing the action
- $opts : array<string|int, mixed> = []
-
- ['instance'=>string] REQUIRED, plus optional ['write_dolibarr'=>bool]
Return values
int —1=OK, 0=ignored, -1=error
_canon()
Deterministic JSON encoding for hash calculation.
private
static _canon(array<string|int, mixed> $a) : string
Parameters
- $a : array<string|int, mixed>
-
Input array
Return values
string —Canonical JSON
_checksumDoli()
Compute SHA-256 on a subset of Dolibarr product fields (canonicalized).
private
static _checksumDoli(Product $p) : string
Parameters
- $p : Product
-
Product
Return values
string —Hex digest
amountStringToFloat()
Convert "CUR:amount" into float, null on error.
private
static amountStringToFloat(string|null $amountStr) : float|null
Parameters
- $amountStr : string|null
-
Amount string as returned by Taler (e.g. "KUDOS:12.34")
Return values
float|null —Parsed amount as float, or null on failure
applyVatToProduct()
Apply VAT details to a Product object.
private
static applyVatToProduct(Product $prod, array{rate: float|null, fk_c_tva: int|null} $vatInfo) : void
Parameters
- $prod : Product
-
Product to update.
- $vatInfo : array{rate: float|null, fk_c_tva: int|null}
-
Derived VAT info from Taler.
buildTaxesForDolibarrProduct()
Build a spec-compliant Tax[] array from a Dolibarr product line.
private
buildTaxesForDolibarrProduct(Product $prod, string $currency, string $instance) : array<string|int, mixed>
Parameters
- $prod : Product
-
Source Dolibarr product
- $currency : string
-
ISO-4217 currency code (e.g. "EUR")
- $instance : string
-
Taler instance name (used for mapping side effects)
Return values
array<string|int, mixed> —Array of Tax objects suitable for Taler ProductDetail
fetchVatDetails()
Fetch VAT details from c_tva to apply on Product.
private
static fetchVatDetails(int $fkCtvA, DoliDB $db) : array<string, mixed>|null
Parameters
- $fkCtvA : int
-
Rowid in c_tva.
- $db : DoliDB
-
DB handler.
Return values
array<string, mixed>|null —VAT fields to copy onto the product, or null on failure
findNearestVat()
Find the nearest active VAT line in Dolibarr's dictionary.
private
static findNearestVat(float $ratePercent, DoliDB $db[, int|null $countryId = null ]) : array{fk_c_tva: int, rate: float, diff: float}|null
Parameters
- $ratePercent : float
-
Target VAT rate in percent.
- $db : DoliDB
-
DB handler.
- $countryId : int|null = null
-
Optional country filter (fk_pays); defaults to company country.
Return values
array{fk_c_tva: int, rate: float, diff: float}|null —Nearest VAT info or null if none.
getMerchantClient()
Build a ready-to-use TalerMerchantClient for this link.
private
getMerchantClient([TalerConfig|null &$cfg = null ][, string|null &$err = null ]) : TalerMerchantClient|null
Parameters
- $cfg : TalerConfig|null = null
-
Receives the config row (on success)
- $err : string|null = null
-
Receives error message (on failure)
Return values
TalerMerchantClient|nullguessDecimalsFromAmount()
Guess how many decimals are present in a Taler amount string.
private
static guessDecimalsFromAmount(string $amountStr) : int
Parameters
- $amountStr : string
-
Raw amount string (e.g., "EUR:3.65000000").
Return values
int —Number of decimals to keep (min 2, max 8).
log()
Lightweight logger wrapper to keep messages consistent.
private
log(string $method[, array<string|int, mixed> $ctx = [] ][, int $level = LOG_DEBUG ]) : void
Parameters
- $method : string
-
Method or action name
- $ctx : array<string|int, mixed> = []
-
Context payload to JSON-encode (kept small)
- $level : int = LOG_DEBUG
-
LOG_DEBUG|LOG_INFO|LOG_WARNING|LOG_ERR
logTalerError()
Lightweight wrapper to persist an error row (if the table/class exists).
private
logTalerError(string $context, string $operation, string $message) : void
Parameters
- $context : string
-
'product' | 'category' | ...
- $operation : string
-
'push' | 'fetch' | ...
- $message : string
-
human readable
parseTaxAmountToFloat()
Parse a tax amount coming from Taler into float, updating decimals/currency hints.
private
static parseTaxAmountToFloat(mixed $rawAmount, int &$decimals, string &$currency) : float|null
Parameters
- $rawAmount : mixed
-
Raw tax amount (string or structured array).
- $decimals : int
-
Current decimals guess (updated in-place).
- $currency : string
-
Current currency guess (updated in-place).
Return values
float|null —Parsed float amount or null if unavailable.
resolveInstanceFromConfig()
Resolve instance from TalerConfig if available
private
resolveInstanceFromConfig() : string
Return values
string —Instance or ''
resolveUnitCodeById()
Get unit code from fk_unit
private
resolveUnitCodeById(int|null $fk_unit) : string
Parameters
- $fk_unit : int|null
-
Foreign key of the unit
Return values
stringresolveUnitIdByCode()
Get unit id from code
private
resolveUnitIdByCode(string|null $code) : int|null
Parameters
- $code : string|null
-
code
Return values
int|nullresolveVatFromTalerTaxes()
Try to resolve VAT rate/fk_c_tva from Taler taxes + price.
private
static resolveVatFromTalerTaxes(array<string|int, mixed>|object $detail, string $instance, DoliDB $db) : array{rate: float|null, fk_c_tva: int|null}
Parameters
- $detail : array<string|int, mixed>|object
-
Taler product detail
- $instance : string
-
Taler instance name
- $db : DoliDB
-
DB handler
Return values
array{rate: float|null, fk_c_tva: int|null} —Rate in percent and matching c_tva rowid if found