Skip to content

Invoice Model

Core data types for building and inspecting invoices.

Invoice Builder

Create builder

Create a builder for a specific invoice type and subtype.

InvoiceBuilder::new(invoice_type: InvoiceType) -> InvoiceBuilder
InvoiceBuilder.new(invoice_type: InvoiceTypeKind, invoice_subtype: InvoiceSubType, original_invoice_id: Optional[str] = None, original_invoice_uuid: Optional[str] = None, original_invoice_issue_date: Optional[str] = None, original_invoice_reason: Optional[str] = None) -> InvoiceBuilder
FfiResult_FfiInvoiceBuilder fatoora_invoice_builder_new(FfiInvoiceTypeKind type_kind, FfiInvoiceSubType subtype, const char* original_id, const char* original_uuid, const char* original_issue_date, const char* original_reason);

Args

  • invoice_type / invoice_subtype: invoice classification.
  • original_*: original invoice references for credit/debit flows.

Returns

  • InvoiceBuilder: mutable builder handle.
Set fields

Set header fields and parties on the builder.

InvoiceBuilder::set_id(id: impl Into<String>) -> &mut Self
InvoiceBuilder::set_uuid(uuid: impl Into<String>) -> &mut Self
InvoiceBuilder::set_issue_datetime(value: impl Into<String>) -> &mut Self
InvoiceBuilder::set_currency(code: impl Into<String>) -> &mut Self
InvoiceBuilder::set_previous_invoice_hash(hash: impl Into<String>) -> &mut Self
InvoiceBuilder::set_invoice_counter(counter: u64) -> &mut Self
InvoiceBuilder::set_payment_means_code(code: impl Into<String>) -> &mut Self
InvoiceBuilder::set_vat_category(category: VatCategory) -> &mut Self
InvoiceBuilder::set_seller(seller: Seller) -> &mut Self
InvoiceBuilder::set_buyer(buyer: Buyer) -> &mut Self
InvoiceBuilder::set_note(note: InvoiceNote) -> &mut Self
InvoiceBuilder::set_allowance(reason: impl Into<String>, amount: f64) -> &mut Self
InvoiceBuilder::invoice_level_charge(charge: f64) -> &mut Self
InvoiceBuilder::invoice_level_discount(discount: f64) -> &mut Self
InvoiceBuilder::allowance_reason(reason: impl Into<String>) -> &mut Self
InvoiceBuilder::flags(flags: InvoiceFlags) -> &mut Self
InvoiceBuilder.set_id(invoice_id: str) -> None
InvoiceBuilder.set_uuid(uuid: str) -> None
InvoiceBuilder.set_issue_datetime(issue_datetime: str) -> None
InvoiceBuilder.set_currency(currency_code: str) -> None
InvoiceBuilder.set_previous_invoice_hash(hash: str) -> None
InvoiceBuilder.set_invoice_counter(counter: int) -> None
InvoiceBuilder.set_payment_means_code(code: str) -> None
InvoiceBuilder.set_vat_category(category: VatCategory) -> None
InvoiceBuilder.set_seller(...) -> None
InvoiceBuilder.set_buyer(...) -> None
InvoiceBuilder.set_note(language: str, text: str) -> None
InvoiceBuilder.set_allowance(reason: str, amount: float) -> None
InvoiceBuilder.set_invoice_level_charge(charge: float) -> None
InvoiceBuilder.set_invoice_level_discount(discount: float) -> None
InvoiceBuilder.set_allowance_reason(reason: str) -> None
InvoiceBuilder.set_flags(flags: int) -> None
FfiResult_bool fatoora_invoice_builder_set_id(FfiInvoiceBuilder* builder, const char* id);
FfiResult_bool fatoora_invoice_builder_set_uuid(FfiInvoiceBuilder* builder, const char* uuid);
FfiResult_bool fatoora_invoice_builder_set_issue_datetime(FfiInvoiceBuilder* builder, const char* value);
FfiResult_bool fatoora_invoice_builder_set_currency(FfiInvoiceBuilder* builder, const char* code);
FfiResult_bool fatoora_invoice_builder_set_previous_hash(FfiInvoiceBuilder* builder, const char* hash);
FfiResult_bool fatoora_invoice_builder_set_invoice_counter(FfiInvoiceBuilder* builder, uint64_t counter);
FfiResult_bool fatoora_invoice_builder_set_payment_means_code(FfiInvoiceBuilder* builder, const char* code);
FfiResult_bool fatoora_invoice_builder_set_vat_category(FfiInvoiceBuilder* builder, FfiVatCategory cat);
FfiResult_bool fatoora_invoice_builder_set_seller(FfiInvoiceBuilder* builder, const char* name, const char* country, const char* city, const char* street, const char* additional_street, const char* building_number, const char* additional_number, const char* postal_code, const char* subdivision, const char* district, const char* vat_id, const char* other_id, const char* other_id_scheme);
FfiResult_bool fatoora_invoice_builder_set_buyer(FfiInvoiceBuilder* builder, const char* name, const char* country, const char* city, const char* street, const char* additional_street, const char* building_number, const char* additional_number, const char* postal_code, const char* subdivision, const char* district, const char* vat_id, const char* other_id, const char* other_id_scheme);
FfiResult_bool fatoora_invoice_builder_set_note(FfiInvoiceBuilder* builder, const char* lang, const char* text);
FfiResult_bool fatoora_invoice_builder_set_allowance(FfiInvoiceBuilder* builder, const char* reason, double amount);
FfiResult_bool fatoora_invoice_builder_set_invoice_level_charge(FfiInvoiceBuilder* builder, double charge);
FfiResult_bool fatoora_invoice_builder_set_invoice_level_discount(FfiInvoiceBuilder* builder, double discount);
FfiResult_bool fatoora_invoice_builder_set_allowance_reason(FfiInvoiceBuilder* builder, const char* reason);
FfiResult_bool fatoora_invoice_builder_set_flags(FfiInvoiceBuilder* builder, uint8_t flags);

Args

  • Field values as shown in the signatures.

Returns

  • Rust: builder for chaining.
  • Python: None (raises on error).
  • C: ok=true on success, error set on failure.
Line items

Add invoice line items.

InvoiceBuilder::add_line_item(item: LineItem) -> &mut Self
InvoiceBuilder.add_line_item(description: str, quantity: float, unit_code: str, unit_price: float, vat_rate: float, vat_category: VatCategory) -> None
FfiResult_bool fatoora_invoice_builder_add_line_item(FfiInvoiceBuilder* builder, const char* description, double quantity, const char* unit_code, double unit_price, double vat_rate, FfiVatCategory vat_category);

Args

  • Line item fields as shown in the signatures.

Returns

  • Builder updated with the new line item.
Build

Finalize the builder into a finalized invoice.

InvoiceBuilder::build(self) -> Result<FinalizedInvoice, InvoiceError>
InvoiceBuilder.build() -> FinalizedInvoice
FfiResult_FfiFinalizedInvoice fatoora_invoice_builder_build(FfiInvoiceBuilder* builder);

Returns

  • FinalizedInvoice: immutable invoice handle.

Finalized Invoice

Accessors

Read finalized invoice fields.

FinalizedInvoice::data(&self) -> &InvoiceData
FinalizedInvoice::totals(&self) -> &InvoiceTotalsData
FinalizedInvoice::hash_base64(&self) -> Result<String, SigningError>
FinalizedInvoice::sign(self, signer: &InvoiceSigner) -> Result<SignedInvoice, SigningError>
FinalizedInvoice.id() -> str
FinalizedInvoice.uuid() -> str
FinalizedInvoice.issue_datetime() -> str
FinalizedInvoice.currency() -> str
FinalizedInvoice.previous_invoice_hash() -> str
FinalizedInvoice.invoice_counter() -> int
FinalizedInvoice.payment_means_code() -> str
FinalizedInvoice.vat_category() -> VatCategory
FinalizedInvoice.invoice_level_charge() -> float
FinalizedInvoice.invoice_level_discount() -> float
FinalizedInvoice.allowance_reason() -> Optional[str]
FinalizedInvoice.invoice_type_kind() -> InvoiceTypeKind
FinalizedInvoice.invoice_sub_type() -> InvoiceSubType
FinalizedInvoice.original_invoice_ref() -> Optional[OriginalInvoiceRef]
FinalizedInvoice.original_invoice_reason() -> Optional[str]
FinalizedInvoice.seller() -> Party
FinalizedInvoice.buyer() -> Optional[Party]
FinalizedInvoice.note() -> Optional[InvoiceNote]
FinalizedInvoice.line_items() -> list[InvoiceLineItem]
FinalizedInvoice.totals() -> InvoiceTotals
FinalizedInvoice.flags() -> set[InvoiceFlag]
FinalizedInvoice.is_third_party() -> bool
FinalizedInvoice.is_nominal() -> bool
FinalizedInvoice.is_export() -> bool
FinalizedInvoice.is_summary() -> bool
FinalizedInvoice.is_self_billed() -> bool
FinalizedInvoice.is_simplified() -> bool
FinalizedInvoice.xml() -> str
FinalizedInvoice.hash_base64() -> str
FfiResult_FfiString fatoora_invoice_id(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_uuid(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_issue_datetime(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_currency(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_previous_hash(FfiFinalizedInvoice* invoice);
FfiResult_u64 fatoora_invoice_counter(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_payment_means_code(FfiFinalizedInvoice* invoice);
FfiResult_FfiVatCategory fatoora_invoice_vat_category(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_allowance_reason(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_level_charge(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_level_discount(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_to_xml(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_hash_base64(FfiFinalizedInvoice* invoice);
FfiResult_FfiInvoiceTypeKind fatoora_invoice_type_kind(FfiFinalizedInvoice* invoice);
FfiResult_FfiInvoiceSubType fatoora_invoice_sub_type(FfiFinalizedInvoice* invoice);
FfiResult_FfiParty fatoora_invoice_seller(FfiFinalizedInvoice* invoice);
FfiResult_FfiParty fatoora_invoice_buyer(FfiFinalizedInvoice* invoice);
FfiResult_FfiInvoiceNote fatoora_invoice_note(FfiFinalizedInvoice* invoice);
FfiResult_FfiOriginalInvoiceRef fatoora_invoice_original_ref(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_original_reason(FfiFinalizedInvoice* invoice);
FfiResult_u8 fatoora_invoice_flags(FfiFinalizedInvoice* invoice);
FfiResult_bool fatoora_invoice_is_third_party(FfiFinalizedInvoice* invoice);
FfiResult_bool fatoora_invoice_is_nominal(FfiFinalizedInvoice* invoice);
FfiResult_bool fatoora_invoice_is_export(FfiFinalizedInvoice* invoice);
FfiResult_bool fatoora_invoice_is_summary(FfiFinalizedInvoice* invoice);
FfiResult_bool fatoora_invoice_is_self_billed(FfiFinalizedInvoice* invoice);
FfiResult_bool fatoora_invoice_is_simplified(FfiFinalizedInvoice* invoice);
FfiResult_u64 fatoora_invoice_line_item_count(FfiFinalizedInvoice* invoice);
FfiResult_FfiString fatoora_invoice_line_item_description(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_FfiString fatoora_invoice_line_item_unit_code(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_f64 fatoora_invoice_line_item_quantity(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_f64 fatoora_invoice_line_item_unit_price(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_f64 fatoora_invoice_line_item_total_amount(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_f64 fatoora_invoice_line_item_vat_rate(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_f64 fatoora_invoice_line_item_vat_amount(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_u8 fatoora_invoice_line_item_vat_category(FfiFinalizedInvoice* invoice, uint64_t index);
FfiResult_f64 fatoora_invoice_totals_tax_inclusive(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_totals_tax_amount(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_totals_line_extension(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_totals_allowance_total(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_totals_charge_total(FfiFinalizedInvoice* invoice);
FfiResult_f64 fatoora_invoice_totals_taxable_amount(FfiFinalizedInvoice* invoice);

Args

  • invoice: finalized invoice handle.

Returns

  • Field values for the finalized invoice.

Signed Invoice

Accessors

Read signed invoice fields and metadata.

SignedInvoice::data(&self) -> &InvoiceData
SignedInvoice::totals(&self) -> &InvoiceTotalsData
SignedInvoice::signed_properties(&self) -> &SignedProperties
SignedInvoice::qr_code(&self) -> &str
SignedInvoice::xml(&self) -> &str
SignedInvoice::uuid(&self) -> &str
SignedInvoice::invoice_hash(&self) -> &str
SignedInvoice::signature(&self) -> &str
SignedInvoice::public_key(&self) -> &str
SignedInvoice::zatca_key_signature(&self) -> Option<&str>
SignedInvoice::to_xml_base64(&self) -> String
SignedInvoice::hash_base64(&self) -> Result<String, SigningError>
SignedInvoice.xml() -> str
SignedInvoice.xml_base64() -> str
SignedInvoice.qr() -> str
SignedInvoice.invoice_hash() -> str
SignedInvoice.hash_base64() -> str
SignedInvoice.signature() -> str
SignedInvoice.public_key() -> str
SignedInvoice.zatca_key_signature() -> Optional[str]
SignedInvoice.cert_hash() -> str
SignedInvoice.signed_props_hash() -> str
SignedInvoice.signing_time() -> str
SignedInvoice.id() -> str
SignedInvoice.uuid() -> str
SignedInvoice.issue_datetime() -> str
SignedInvoice.currency() -> str
SignedInvoice.previous_invoice_hash() -> str
SignedInvoice.invoice_counter() -> int
SignedInvoice.payment_means_code() -> str
SignedInvoice.vat_category() -> VatCategory
SignedInvoice.invoice_level_charge() -> float
SignedInvoice.invoice_level_discount() -> float
SignedInvoice.allowance_reason() -> Optional[str]
SignedInvoice.invoice_type_kind() -> InvoiceTypeKind
SignedInvoice.invoice_sub_type() -> InvoiceSubType
SignedInvoice.original_invoice_ref() -> Optional[OriginalInvoiceRef]
SignedInvoice.original_invoice_reason() -> Optional[str]
SignedInvoice.seller() -> Party
SignedInvoice.buyer() -> Optional[Party]
SignedInvoice.note() -> Optional[InvoiceNote]
SignedInvoice.line_items() -> list[InvoiceLineItem]
SignedInvoice.totals() -> InvoiceTotals
SignedInvoice.flags() -> set[InvoiceFlag]
SignedInvoice.is_third_party() -> bool
SignedInvoice.is_nominal() -> bool
SignedInvoice.is_export() -> bool
SignedInvoice.is_summary() -> bool
SignedInvoice.is_self_billed() -> bool
SignedInvoice.is_simplified() -> bool
FfiResult_FfiString fatoora_signed_invoice_xml(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_xml_base64(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_qr(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_id(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_uuid(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_issue_datetime(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_currency(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_previous_hash(FfiSignedInvoice* signed);
FfiResult_u64 fatoora_signed_invoice_counter(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_payment_means_code(FfiSignedInvoice* signed);
FfiResult_FfiVatCategory fatoora_signed_invoice_vat_category(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_allowance_reason(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_level_charge(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_level_discount(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_hash(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_hash_base64(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_signature(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_public_key(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_zatca_key_signature(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_cert_hash(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_signed_props_hash(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_signing_time(FfiSignedInvoice* signed);
FfiResult_bool fatoora_signed_invoice_is_third_party(FfiSignedInvoice* signed);
FfiResult_bool fatoora_signed_invoice_is_nominal(FfiSignedInvoice* signed);
FfiResult_bool fatoora_signed_invoice_is_export(FfiSignedInvoice* signed);
FfiResult_bool fatoora_signed_invoice_is_summary(FfiSignedInvoice* signed);
FfiResult_bool fatoora_signed_invoice_is_self_billed(FfiSignedInvoice* signed);
FfiResult_bool fatoora_signed_invoice_is_simplified(FfiSignedInvoice* signed);
FfiResult_FfiInvoiceTypeKind fatoora_signed_invoice_type_kind(FfiSignedInvoice* signed);
FfiResult_FfiInvoiceSubType fatoora_signed_invoice_sub_type(FfiSignedInvoice* signed);
FfiResult_FfiParty fatoora_signed_invoice_seller(FfiSignedInvoice* signed);
FfiResult_FfiParty fatoora_signed_invoice_buyer(FfiSignedInvoice* signed);
FfiResult_FfiInvoiceNote fatoora_signed_invoice_note(FfiSignedInvoice* signed);
FfiResult_FfiOriginalInvoiceRef fatoora_signed_invoice_original_ref(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_original_reason(FfiSignedInvoice* signed);
FfiResult_u8 fatoora_signed_invoice_flags(FfiSignedInvoice* signed);
FfiResult_u64 fatoora_signed_invoice_line_item_count(FfiSignedInvoice* signed);
FfiResult_FfiString fatoora_signed_invoice_line_item_description(FfiSignedInvoice* signed, uint64_t index);
FfiResult_FfiString fatoora_signed_invoice_line_item_unit_code(FfiSignedInvoice* signed, uint64_t index);
FfiResult_f64 fatoora_signed_invoice_line_item_quantity(FfiSignedInvoice* signed, uint64_t index);
FfiResult_f64 fatoora_signed_invoice_line_item_unit_price(FfiSignedInvoice* signed, uint64_t index);
FfiResult_f64 fatoora_signed_invoice_line_item_total_amount(FfiSignedInvoice* signed, uint64_t index);
FfiResult_f64 fatoora_signed_invoice_line_item_vat_rate(FfiSignedInvoice* signed, uint64_t index);
FfiResult_f64 fatoora_signed_invoice_line_item_vat_amount(FfiSignedInvoice* signed, uint64_t index);
FfiResult_u8 fatoora_signed_invoice_line_item_vat_category(FfiSignedInvoice* signed, uint64_t index);
FfiResult_f64 fatoora_signed_invoice_totals_tax_inclusive(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_totals_tax_amount(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_totals_line_extension(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_totals_allowance_total(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_totals_charge_total(FfiSignedInvoice* signed);
FfiResult_f64 fatoora_signed_invoice_totals_taxable_amount(FfiSignedInvoice* signed);

Args

  • signed: signed invoice handle.

Returns

  • Signed XML, hashes, and signature metadata.
  • Optional handles are returned as NULL pointers on success when fields are absent.

Supporting Types

Types

  • CountryCode, CurrencyCode, InvoiceTimestamp, InvoiceDate, VatId, OtherId.
  • InvoiceNote, OriginalInvoiceRef, LineItem, Party (Seller/Buyer roles).

See also: Invoice Signing Reference