This document provides comprehensive context about the Croatia gem for future Claude sessions.
Note: This file should be updated by Claude whenever noteworthy changes or learnings occur during development sessions.
The Croatia gem provides utilities for performing Croatia-specific actions, primarily focused on Croatian fiscalization (tax reporting) requirements. It includes PIN validation, UMCN (JMBG) handling, invoice generation, payment barcodes, and XML digital signing for tax authorities.
croatia/
├── lib/croatia/
│ ├── config.rb # Configuration management
│ ├── enum.rb # Enum utility module
│ ├── fiscalizer.rb # Main fiscalization class
│ ├── fiscalizer/
│ │ └── xml_builder.rb # XML generation and signing
│ ├── invoice.rb # Invoice management
│ ├── invoice/
│ │ ├── fiscalizable.rb # Fiscalization concern
│ │ ├── identifiable.rb # ID generation concern
│ │ ├── line_item.rb # Invoice line items
│ │ ├── party.rb # Buyer/seller/issuer entities
│ │ ├── payable.rb # Payment methods concern
│ │ ├── surcharge.rb # Surcharges (naknade)
│ │ └── tax.rb # Tax handling
│ ├── payment_barcode.rb # HUB3 2D barcodes
│ ├── pin.rb # OIB validation
│ ├── qr_code.rb # QR code generation
│ ├── umcn.rb # JMBG validation/generation
│ └── version.rb # Gem version
├── test/
│ ├── croatia/
│ │ ├── fiscalizer/
│ │ │ └── xml_builder_test.rb # XML builder tests
│ │ └── invoice/
│ │ ├── line_item_test.rb # Line item tests
│ │ └── surcharge_test.rb # Surcharge tests
│ ├── fixtures/files/
│ │ ├── fake_fiskal1.p12 # Test certificate
│ │ └── fake_fiskal1_password.txt # Certificate password
│ └── helpers/
│ ├── fiscalization_credentials_helper.rb # Credential test utilities
│ └── xml_helper.rb # XML comparison utilities
├── README.md # User documentation
└── CLAUDE.md # This file
Central invoice management class with the following features:
Core Properties:
sequential_number- Invoice sequence numberbusiness_location_identifier- Business location ID (oznaka poslovnog prostora)register_identifier- Register device ID (oznaka naplatnog uredaja)issue_date/due_date- Invoice datespayment_method-:cash,:card,:check,:transfer,:othersequential_by-:registeror:business_location
Entities:
issuer- Invoice issuer (Croatia::Invoice::Party)seller- Seller entity (Croatia::Invoice::Party)buyer- Buyer entity (Croatia::Invoice::Party)
Line Items:
line_items- Array of Croatia::Invoice::LineItem objectsadd_line_item- Method to add items with block syntax
Calculations:
subtotal- Sum of line item subtotalstax- Sum of all taxessurcharge- Sum of all surchargesmargin- Sum of all marginstotal- Final invoice total
Individual invoice line items with:
Basic Properties:
description,quantity,unit,unit_pricediscount(fixed amount) ordiscount_rate(percentage)
Tax System:
add_tax(type:, category:, rate: nil)- Add tax with type (:value_added_tax, :consumption_tax, :other)remove_tax(type),clear_taxestax_breakdown- Detailed tax calculation
Surcharges (Naknade):
add_surcharge(name:, amount:)or block syntaxremove_surcharge(name),clear_surcharges- Aggregated by name across line items
Margins:
margin- Affects tax calculation viataxable_basemethod- When margin is set: tax calculated on margin instead of subtotal
Represents surcharges (naknade) with:
name- Max 100 characters, requiredamount- BigDecimal, required- Validation for nil values
Main fiscalization interface:
Certificate Management:
initialize(credential:, password:)- Loads PKCS12 credentialsload_credential- Handles .p12 files and private keys- Returns private key for signing operations
Core Methods:
fiscalize(invoice:, message_id:)- Generate fiscalization XMLgenerate_issuer_protection_code(invoice)- ZKI generation (MD5 of SHA1 signature)generate_verification_qr_code(invoice)- QR codes for verification
XML generation and digital signing:
Document Generation:
invoice(invoice:, message_id:, **options)- Standard invoice XMLsupporting_document(invoice:, message_id:, unique_identifier: nil, issuer_protection_code: nil, **options)- Supporting documentsverify(invoice:, message_id:, **options)- Verification requestsinvoice_payment_method_change(new_payment_method, **options)- Payment method changessupporting_document_payment_method_change(new_payment_method, **options)- Supporting doc payment changes
XML Envelopes:
INVOICE_ENVELOPE = "RacunZahtjev"SUPPORTING_DOCUMENT_ENVELOPE = "RacunPDZahtjev"PAYMENT_METHOD_CAHNGE_ENVELOPE = "PromijeniNacPlacZahtjev"VERIFY_ENVELOPE = "ProvjeraZahtjev"
Digital Signing:
sign(document:, credential:)- XML digital signatures- Expects PKCS12 objects (credential.key for signing, credential.certificate for cert info)
- Uses SHA1 with RSA, C14N canonicalization, enveloped signatures
- Embeds X.509 credentials with issuer and serial number
XML Structure:
- All documents have
Idattribute on root element (set to message_id) - Uses TNS namespace: "http://www.apis-it.hr/fin/2012/types/f73"
- Includes header (Zaglavlje) with message ID and timestamp
- Main content in Racun element
Croatia.configure do |config|
config.tax_rates = {
value_added_tax: {
standard: 0.25, # 25% PDV
lower_rate: 0.13, # 13% PDV
exempt: 0.0, # 0% PDV
zero_rated: 0.0,
outside_scope: 0.0,
reverse_charge: 0.0
},
consumption_tax: Hash.new(0.0),
other: Hash.new(0.0)
}
config.fiscalization = {
credential: "path/to/cert.p12",
password: "cert_password"
}
endTest Framework: Minitest Documentation: YARD format Test Commands:
bin/test- Run all testsbin/lint- Run linterbin/lint -A- Auto-fix linting issues
Key Test Helpers:
FixturesHelper- File fixture loadingXMLHelper- XML comparison withassert_xml_equalFiscalizationCredentialsHelper- Credential test utilities
Test Certificates:
test/fixtures/files/fake_fiskal1.p12- Test PKCS12 credentialtest/fixtures/files/fake_fiskal1_password.txt- Certificate password
Test Patterns:
- Use
Timecop.freeze(REFERENCE_TIME)for consistent timestamps - Use
assert_xml_equal expected_xml, actual_xmlfor XML comparisons - Test both validation and integration scenarios
- Use proper UUID format for message IDs (36 characters)
- Base calculation:
quantity * unit_price - discount - With margin: tax calculated on
margininstead ofsubtotal taxable_basemethod returnsmargin || subtotal
- Fiscalizer expects PKCS12 objects for signing
- XMLBuilder.sign method uses
credential.keyandcredential.certificate - Protection code generation uses private key directly
- XMLDSIG enveloped signatures
- SHA1 digest algorithm
- RSA-SHA1 signature method
- Exclusive C14N canonicalization
- Embeds full X.509 credential chain
- All financial calculations use BigDecimal for precision
.to_dconversion for user inputsformat_decimalhelper formats to 2 decimal places
- Surcharges Implementation - Added surcharge support with aggregation and validation
- Margins Implementation - Added margin support affecting tax calculation base
- XML Builder Enhancements - Added support for supporting documents, payment method changes, verification
- Digital Signing - Implemented XMLDSIG signatures with PKCS12 credential support
- Test Coverage - Comprehensive test suite with XML comparison and validation testing
-
Certificate vs Private Key Confusion
- XMLBuilder.sign expects PKCS12 objects
- Use
credential.keyfor signing,credential.certificatefor cert info
-
BigDecimal Precision
- Always use
.to_dfor financial inputs - Use
format_decimalfor XML output
- Always use
-
XML Testing
- Use
assert_xml_equalfor XML comparisons - Include
Idattributes in expected XML (set to message_id)
- Use
-
Tax Calculation Edge Cases
- Handle nil margins:
line_items.sum { |item| item.margin || 0 } - Use
taxable_basemethod for tax calculation base
- Handle nil margins:
rexml- XML document manipulationnokogiri- XML canonicalization for signaturesopenssl- Cryptographic operationsbase64- Encoding for signatures and credentialsbigdecimal- Precise financial calculationstimecop(test) - Time manipulation for testingminitest(test) - Testing framework