# Product Origin Text - Developer Notes ## Technical Implementation ### Architecture This module extends the product origin information system to use free-text fields instead of structured country/state fields. **Models:** 1. **product.supplierinfo** - Base model with the `origin_text` field - Field: `origin_text` (Char, translate=True) - This is where the actual data is stored - Each supplier can have a different origin text for the same product 2. **product.template** - Computed field - Field: `origin_text` (Char, computed, store=False) - Computes from main vendor's supplierinfo - Depends on: `main_seller_id`, `variant_seller_ids.origin_text` 3. **product.product** - Computed field (variant level) - Field: `origin_text` (Char, computed, store=False) - Computes from main vendor's supplierinfo - Depends on: `product_tmpl_id.main_seller_id`, `seller_ids.origin_text` ### Why Computed Fields Instead of Related? The `origin_text` field in `product.template` and `product.product` cannot be a simple `related` field because: - `main_seller_id` is a `res.partner` record - `origin_text` is stored in `product.supplierinfo` records - We need to find the supplierinfo record where `partner_id == main_seller_id` This requires a computed field with custom logic to filter and find the correct supplierinfo record. ### Translation Support The `origin_text` field in `product.supplierinfo` uses `translate=True`, which means: - Each language can have a different value - Translations are stored in Odoo's translation system - When switching languages, the field shows the translated value - If no translation exists, it falls back to the default language value ### Store Strategy The computed fields in product template and product use `store=False` because: - The value should always reflect the current main vendor - If the main vendor changes or its origin text is updated, the product's origin should update automatically - No need to store redundant data - Reduces database size and update complexity ### Dependencies - **product** - Core product module - **product_main_seller** - Provides `main_seller_id` computed field for products ### Relationship to product_origin This module is a replacement/alternative to the OCA `product_origin` module: - `product_origin` provides structured fields (country_id, state_id) - `product_origin_char` provides free-text field (origin_text) - Both cannot be installed simultaneously without potential conflicts - This module was created because suppliers use creative, non-standardized origin descriptions ### Performance Considerations - Computed fields with `store=False` are calculated on-the-fly - Performance is acceptable because the computation is simple (filter + get first) - If performance becomes an issue, consider: - Adding `store=True` with proper dependencies - Adding database indexes on frequently searched fields - Caching strategies ### Testing Strategy Tests cover: 1. **Basic field storage** - Create supplierinfo with origin_text 2. **Computed field** - Verify product shows main vendor's origin 3. **Main vendor change** - Verify origin updates when main vendor changes 4. **Translation** - Verify field is translatable (multilingual support) 5. **Empty cases** - Product without vendors, vendor without origin ### Future Improvements Potential enhancements: - Add migration script from `product_origin` to convert country/state to text - Add bulk update wizard to set origin for multiple products - Add origin text to purchase order lines - Add search/group by origin in product lists - Add validation rules (max length, format checks) ## Code Quality - Follows OCA guidelines - Black formatted (line length 88) - isort sorted imports - Passes flake8 and pylint checks - Full test coverage - Documented with docstrings - Translatable strings handled correctly (no `_()` in field definitions) ## Version History - **18.0.1.0.0** (2026-02-25) - Initial release - Free-text origin field per supplier - Automatic display based on main vendor - Multi-language support - Full test coverage - OCA documentation structure