Changelog:
- Document global_margin_type feature for independent global limits calculation
- Update version from 18.0.1.1.0 to 18.0.1.2.0
- Update test coverage count (11 → 13 tests)
- Update manifest summary to include global limits enforcement
- Add global_margin_type field in res.config.settings
* Options: 'markup' (default) or 'margin' (commercial margin)
* Determines how global min/max percentages are interpreted
- Refactor _apply_global_margin_limits():
* Now receives price instead of margin percentage
* Calculates min/max prices based on global_margin_type
* Returns adjusted price instead of adjusted margin
* Supports both markup and commercial margin formulas
- Update _compute_price() to apply limits after price calculation
- Update res_config_settings_views.xml to show global_margin_type selector
- Update help texts with examples for both calculation methods
- Add 2 new tests to validate global limits with commercial margin type:
* test_global_minimum_with_commercial_margin_type
* test_global_maximum_with_commercial_margin_type
- All 13 tests passing (11 existing + 2 new)
Example with global min 25%:
- Markup: Min price = Cost × 1.25
- Commercial Margin: Min price = Cost / 0.75 (ensures 25% margin on PVP)
- Update README with margin_type field documentation
- Add detailed explanations for both calculation methods:
* Markup (on cost): PVP = Cost × (1 + markup%)
* Commercial Margin (on PVP): PVP = Cost / (1 - margin%)
- Add examples comparing both methods
- Update features list with new capabilities
- Update configuration steps to include margin_type selector
- Update technical details with new field specifications
- Update test coverage section (11 tests)
- Add logging examples for both methods
- Update changelog with v18.0.1.1.0 release notes
- Bump version to 18.0.1.1.0 in __manifest__.py
- Update summary to reflect new features
- Add margin_type field to choose between calculation methods:
* Markup (on cost): PVP = Cost × (1 + markup%)
* Commercial Margin (on PVP): PVP = Cost / (1 - margin%)
- Update _compute_price() to apply correct formula based on margin_type
- Add safety cap for commercial margin >= 100% (caps at 99%)
- Add detailed logging for both calculation types
- Update views to show margin_type field when use_total_margin is enabled
- Add 2 new tests to validate both calculation methods:
* test_total_margin_markup_type: validates markup formula
* test_total_margin_commercial_margin_type: validates commercial margin formula
- All 11 tests passing (9 existing + 2 new)
Example with Commercial Margin:
Base: 4.68€, Total Margin: 20%
- Markup: 4.68 × 1.20 = 5.616€ (margin = 16.67% of PVP)
- Commercial Margin: 4.68 / 0.80 = 5.85€ (margin = 20% of PVP) ✓
- Add use_total_margin field to pricelist items
- Override _compute_price() to sum margins additively instead of compounding
- Support chained pricelists with custom base types (last_purchase_price)
- Add global minimum and maximum margin limits configuration
- Store limits in ir.config_parameter via res.config.settings
- Apply global limits after total margin calculation
- Add comprehensive test suite (9 tests) covering:
* Basic additive vs compound margin behavior
* Three-level pricelist chains
* Global minimum/maximum margin enforcement
* Rounding and surcharge compatibility
- Add configuration UI in Settings > Sales
- All tests passing (9/9)
This module fixes the issue where chained pricelists were compounding margins
instead of calculating total margins. Example: base 4.68€ with -5% and +25%
now correctly results in 5.616€ (20% total) instead of 5.56€ (compound).