# Product Sale Price from Pricelist

Automatically calculate and update product sale prices based on the last purchase price and configurable pricelists.

## Features

- **Automatic Price Calculation**: Set sale prices based on last purchase price and a configured pricelist
- **Flexible Discount Handling**: Choose how to apply discounts to the cost:
  - Without discounts
  - First discount only
  - Double discount
  - Triple discount
  - Manual update
- **Tax-Aware Pricing**: Automatically includes tax calculations in pricing
- **UoM Conversion**: Handles different purchase and sale units of measure
- **Batch Updates**: Update theoretical prices for multiple products
- **Product Flags**: Mark products for price updates and track status
- **Sales Orders Update**: Action/button to sync non-invoiced sale order lines with current product sale price

## Configuration

1. **Settings > Sales > Automatic Price Configuration**: Select the pricelist for automatic price calculation
2. **Products > Products**: Configure per product:
   - **Last purchase price**: Cost at which the product was last purchased
   - **Last purchase price calculation type**: Choose how to apply discounts
   - Mark **Last purchase price updated** when prices need to be reviewed

## Price Calculation Types

- **Without Discounts**: Uses base purchase price without discounts
- **First Discount**: Applies only the first discount
- **Double Discount**: Applies first and second discount
- **Triple Discount**: Applies first, second, and third discount
- **Manual Update**: Price must be set manually

## Usage

1. Products are priced when received from purchase orders
2. System automatically updates **last_purchase_price** field
3. Sale price is calculated from the configured pricelist using the cost price
4. Taxes are automatically applied based on product tax settings
5. Go to **Products > Update Theoretical Prices** to batch update prices
6. Go to **Sales > Orders** and use **Update with List Price** (form or list). Applies only to non-invoiced/non-canceled orders, skips notes and downpayments, preserves discounts.

## Technical Architecture

### Models

All main fields and business logic are stored in `product.product` for proper variant handling:

**product.product (Main model)**
- `last_purchase_price_updated` (Boolean): Flag for price update needed
- `list_price_theoritical` (Float): Calculated theoretical price
- `last_purchase_price_received` (Float): Last purchase price received
- `last_purchase_price_compute_type` (Selection): How to calculate price
- `_compute_theoritical_price()`: Main price calculation method
- `action_update_list_price()`: Update sale price from theoretical

**product.template (Related fields)**
- All fields are `related` to `product_variant_id` fields
- Allows views on template to continue working
- Delegates actions to product variants

This architecture prevents issues with pricelist reports and ensures proper handling of product variants.

## License

AGPL-3.0 or later
