|
@@ -0,0 +1,128 @@
|
|
|
+# -*- encoding: utf-8 -*-
|
|
|
+
|
|
|
+from openerp import models, api, fields
|
|
|
+from pytz import timezone
|
|
|
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
|
|
|
+from datetime import datetime,timedelta
|
|
|
+
|
|
|
+DATE_FORMAT = '%Y-%m-%d'
|
|
|
+
|
|
|
+class SaleOrder(models.Model):
|
|
|
+ _inherit = 'sale.order'
|
|
|
+ _name = 'sale.order'
|
|
|
+
|
|
|
+ invoice_number = fields.Char('Numero de Factura')
|
|
|
+ contado = fields.Boolean('Contado')
|
|
|
+ credito = fields.Boolean('Crédito')
|
|
|
+
|
|
|
+ _defaults = {
|
|
|
+ 'contado': True
|
|
|
+ }
|
|
|
+
|
|
|
+ @api.one
|
|
|
+ @api.onchange('credito')
|
|
|
+ def cambiar_estado_credito(self):
|
|
|
+ self.contado = not self.credito
|
|
|
+
|
|
|
+ @api.one
|
|
|
+ @api.onchange('contado')
|
|
|
+ def cambiar_estado_contado(self):
|
|
|
+ self.credito = not self.contado
|
|
|
+
|
|
|
+ ''' Timezone '''
|
|
|
+ def get_timezone(self):
|
|
|
+ return timezone(self._context.get('tz') or self.env.user.tz)
|
|
|
+
|
|
|
+ def _convert_str_to_datetime(self, date):
|
|
|
+ return datetime.strptime(date,DEFAULT_SERVER_DATETIME_FORMAT)
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def order_process_now(self):
|
|
|
+ """
|
|
|
+ Confirms order and creates and validates invoice, confirms pickings.
|
|
|
+ """
|
|
|
+ for sale in self:
|
|
|
+ sale.action_button_confirm()
|
|
|
+ inv_id = sale.action_invoice_create()
|
|
|
+ if inv_id:
|
|
|
+ inv = self.env['account.invoice'].browse(inv_id)
|
|
|
+ date = self._convert_str_to_datetime(sale.date_order)
|
|
|
+ date = date.strftime(DATE_FORMAT)
|
|
|
+ inv.write({
|
|
|
+ 'date_invoice':date,
|
|
|
+ 'supplier_invoice_number':self.invoice_number,
|
|
|
+ 'contado':self.contado,
|
|
|
+ 'credito':self.credito
|
|
|
+ })
|
|
|
+ self.update_state()
|
|
|
+ inv.signal_workflow('invoice_open')
|
|
|
+ for picking in sale.picking_ids:
|
|
|
+ picking.force_assign()
|
|
|
+ picking.action_done()
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def update_state(self):
|
|
|
+ for order in self:
|
|
|
+ order.write({'state': 'done'})
|
|
|
+ return True
|
|
|
+
|
|
|
+class account_invoice(models.Model):
|
|
|
+ _inherit = 'account.invoice'
|
|
|
+ _name = 'account.invoice'
|
|
|
+
|
|
|
+ contado = fields.Boolean('Contado')
|
|
|
+ credito = fields.Boolean('Crédito')
|
|
|
+
|
|
|
+ _defaults = {
|
|
|
+ 'contado': True
|
|
|
+ }
|
|
|
+
|
|
|
+ @api.one
|
|
|
+ @api.onchange('credito')
|
|
|
+ def cambiar_estado_credito(self):
|
|
|
+ self.contado = not self.credito
|
|
|
+
|
|
|
+ @api.one
|
|
|
+ @api.onchange('contado')
|
|
|
+ def cambiar_estado_contado(self):
|
|
|
+ self.credito = not self.contado
|
|
|
+
|
|
|
+class SaleOrderLine(models.Model):
|
|
|
+ _inherit = 'sale.order.line'
|
|
|
+ _name = 'sale.order.line'
|
|
|
+
|
|
|
+ amount_total = fields.Float(compute='_calculate_total_sale_line',string='Total',default=0.0)
|
|
|
+ standard_price = fields.Float(compute='_standard_price',string='Precio de costo',default=0.0)
|
|
|
+
|
|
|
+ discount_id = fields.Many2one(
|
|
|
+ 'sale.purchase.discount',
|
|
|
+ string='Desc. Costo',
|
|
|
+ ondelete='restrict'
|
|
|
+ )
|
|
|
+
|
|
|
+ sale_percentage_id = fields.Many2one(
|
|
|
+ 'sale.purchase.discount',
|
|
|
+ string='% Venta',
|
|
|
+ ondelete='restrict'
|
|
|
+ )
|
|
|
+
|
|
|
+ @api.depends('price_unit','product_uom_qty')
|
|
|
+ def _calculate_total_sale_line(self):
|
|
|
+ for line in self:
|
|
|
+ line.amount_total = line.product_uom_qty * line.price_unit
|
|
|
+
|
|
|
+ @api.depends('product_id')
|
|
|
+ def _standard_price(self):
|
|
|
+ for line in self:
|
|
|
+ line.standard_price = line.product_id.standard_price
|
|
|
+ # line.price_unit = line.product_id.standard_price
|
|
|
+
|
|
|
+ @api.onchange('discount_id','sale_percentage_id')
|
|
|
+ def _calculate_price_unit(self):
|
|
|
+ for line in self:
|
|
|
+ if line.discount_id and not line.sale_percentage_id:
|
|
|
+ line.price_unit = line.standard_price - ((line.standard_price * (line.discount_id.value or 0.0))/100)
|
|
|
+ if line.sale_percentage_id and not line.discount_id:
|
|
|
+ line.price_unit = line.standard_price + ((line.standard_price * (line.sale_percentage_id.value or 0.0))/100)
|
|
|
+ if line.discount_id and line.sale_percentage_id:
|
|
|
+ line.price_unit = (line.standard_price - ((line.standard_price * (line.discount_id.value or 0.0))/100)) + (((line.standard_price - ((line.standard_price * (line.discount_id.value or 0.0))/100)) * (line.sale_percentage_id.value or 0.0))/100)
|