# Modelo de Datos: Sale **Modulo:** sale **Total Modelos:** 15+ **Modelos Documentados:** 2 (principales) --- ## 1. Indice de Modelos Principales | Modelo | Descripcion | Campos | Archivo | |--------|-------------|--------|---------| | sale.order | Orden de venta | 60+ | sale_order.py | | sale.order.line | Linea de orden | 40+ | sale_order_line.py | --- ## 2. Detalle por Modelo ### 2.1 sale.order (Orden de Venta) **Archivo:** `models/sale_order.py` **Descripcion:** Sales Order **Hereda de:** portal.mixin, product.catalog.mixin, mail.thread, mail.activity.mixin, utm.mixin #### Estado (state) | Estado | Nombre UI | Descripcion | |--------|-----------|-------------| | draft | Quotation | Cotizacion | | sent | Quotation Sent | Enviada | | sale | Sales Order | Confirmada | | cancel | Cancelled | Cancelada | #### Campos Principales | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Referencia de orden | | state | Selection | Si | Estado | | locked | Boolean | No | Orden bloqueada | | client_order_ref | Char | No | Referencia del cliente | | create_date | Datetime | No | Fecha creacion | | date_order | Datetime | Si | Fecha de orden | | commitment_date | Datetime | No | Fecha entrega prometida | | origin | Char | No | Documento origen | | reference | Char | No | Referencia de pago | #### Campos de Partner | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | partner_id | Many2one | Si | Cliente | | partner_invoice_id | Many2one | Si | Direccion facturacion | | partner_shipping_id | Many2one | Si | Direccion envio | #### Campos de Firma/Pago Online | Campo | Tipo | Descripcion | |-------|------|-------------| | require_signature | Boolean | Requiere firma | | require_payment | Boolean | Requiere pago | | prepayment_percent | Float | Porcentaje anticipo | | signature | Image | Firma digital | | signed_by | Char | Nombre firmante | | signed_on | Datetime | Fecha firma | #### Campos de Configuracion | Campo | Tipo | Descripcion | |-------|------|-------------| | validity_date | Date | Fecha expiracion cotizacion | | journal_id | Many2one | Diario facturacion | | fiscal_position_id | Many2one | Posicion fiscal | | payment_term_id | Many2one | Terminos de pago | | pricelist_id | Many2one | Lista de precios | | currency_id | Many2one | Moneda | | user_id | Many2one | Vendedor | | team_id | Many2one | Equipo de ventas | | company_id | Many2one | Empresa | #### Campos Monetarios | Campo | Tipo | Descripcion | |-------|------|-------------| | amount_untaxed | Monetary | Subtotal (computed) | | amount_tax | Monetary | Impuestos (computed) | | amount_total | Monetary | Total (computed) | | amount_to_invoice | Monetary | Pendiente facturar | | amount_invoiced | Monetary | Ya facturado | #### Campos de Facturacion | Campo | Tipo | Descripcion | |-------|------|-------------| | invoice_ids | Many2many | Facturas vinculadas | | invoice_count | Integer | Cantidad facturas | | invoice_status | Selection | Estado facturacion | #### Campos de Pago | Campo | Tipo | Descripcion | |-------|------|-------------| | transaction_ids | Many2many | Transacciones | | authorized_transaction_ids | Many2many | Autorizadas | | amount_paid | Float | Monto pagado | #### Campos de Lineas | Campo | Tipo | Descripcion | |-------|------|-------------| | order_line | One2many | Lineas de orden | | note | Html | Terminos y condiciones | | tag_ids | Many2many | Etiquetas | --- ### 2.2 sale.order.line (Linea de Orden) **Archivo:** `models/sale_order_line.py` **Descripcion:** Sales Order Line #### Campos Principales | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | order_id | Many2one | Si | Orden padre | | sequence | Integer | No | Secuencia | | company_id | Many2one | No | Empresa (related) | | name | Text | Si | Descripcion | | display_type | Selection | No | Tipo display (section/note/line_note) | | state | Selection | No | Estado (related) | #### Campos de Producto | Campo | Tipo | Descripcion | |-------|------|-------------| | product_id | Many2one | Producto | | product_template_id | Many2one | Plantilla producto | | product_uom | Many2one | Unidad de medida | | product_uom_qty | Float | Cantidad ordenada | | product_custom_attribute_value_ids | One2many | Valores atributos custom | #### Campos de Cantidad | Campo | Tipo | Descripcion | |-------|------|-------------| | product_uom_qty | Float | Cantidad ordenada | | qty_delivered | Float | Cantidad entregada | | qty_delivered_method | Selection | Metodo calculo entrega | | qty_invoiced | Float | Cantidad facturada | | qty_to_invoice | Float | Pendiente facturar | | untaxed_amount_invoiced | Float | Importe facturado sin imp | | untaxed_amount_to_invoice | Float | Importe pendiente sin imp | #### Campos de Precio | Campo | Tipo | Descripcion | |-------|------|-------------| | price_unit | Float | Precio unitario | | discount | Float | Descuento % | | price_subtotal | Monetary | Subtotal (computed) | | price_tax | Float | Impuestos | | price_total | Monetary | Total con impuestos | | price_reduce | Float | Precio con descuento | | price_reduce_taxinc | Float | Precio con desc+imp | | price_reduce_taxexcl | Float | Precio con desc sin imp | #### Campos de Impuestos | Campo | Tipo | Descripcion | |-------|------|-------------| | tax_id | Many2many | Impuestos aplicables | #### Campos de Facturacion | Campo | Tipo | Descripcion | |-------|------|-------------| | invoice_lines | Many2many | Lineas de factura | | invoice_status | Selection | Estado facturacion (computed) | | is_downpayment | Boolean | Es anticipo | #### Campos de Vendedor | Campo | Tipo | Descripcion | |-------|------|-------------| | salesman_id | Many2one | Vendedor (related) | --- ## 3. Diagrama Entidad-Relacion ``` ┌───────────────────────┐ order_line ┌───────────────────────┐ │ sale.order │──────────────────────►│ sale.order.line │ │ │ │ │ │ - name │ order_id │ - product_id │ │ - state │◄──────────────────────│ - product_uom_qty │ │ - partner_id │ │ - price_unit │ │ - date_order │ │ - qty_delivered │ │ - amount_total │ │ - qty_invoiced │ └───────────┬───────────┘ └───────────┬───────────┘ │ │ │ partner_id │ invoice_lines ▼ ▼ ┌───────────────────────┐ ┌───────────────────────┐ │ res.partner │ │ account.move.line │ │ │ │ │ │ (Cliente) │ │ (Linea factura) │ └───────────────────────┘ └───────────────────────┘ ┌───────────────────────┐ invoice_ids ┌───────────────────────┐ │ sale.order │──────────────────────►│ account.move │ │ │ │ │ │ - invoice_status │ │ (Factura cliente) │ │ - invoice_count │ │ type = 'out_invoice' │ └───────────────────────┘ └───────────────────────┘ ┌───────────────────────┐ transaction_ids ┌───────────────────────┐ │ sale.order │──────────────────────►│ payment.transaction │ │ │ │ │ │ - amount_paid │ │ (Transaccion pago) │ │ - require_payment │ │ │ └───────────────────────┘ └───────────────────────┘ ``` --- ## 4. Constantes del Modulo ```python # Estados de facturacion INVOICE_STATUS = [ ('upselling', 'Upselling Opportunity'), ('invoiced', 'Fully Invoiced'), ('to invoice', 'To Invoice'), ('no', 'Nothing to Invoice') ] # Estados de orden SALE_ORDER_STATE = [ ('draft', "Quotation"), ('sent', "Quotation Sent"), ('sale', "Sales Order"), ('cancel', "Cancelled"), ] ``` --- ## 6. Constraints (Restricciones) | Modelo | Campos | Validacion | Mensaje | |--------|--------|------------|---------| | sale.order | company_id, order_line | Productos deben pertenecer a la misma empresa | Product belongs to different company | | sale.order | prepayment_percent | Porcentaje entre 0 y 100% si require_payment | Prepayment percentage must be valid | | sale.order.line | combo_item_id | No debe setearse manualmente | Combo item cannot be set manually | | product.template | company_id | No restringir a empresa si fue vendido en otra | Product sold in other company | --- **Referencias:** - Carpeta models: `addons/sale/models/` - Constantes: `addons/sale/const.py`