You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

166 lines
7.6 KiB

# -*- coding: utf-8 -*-
from openerp import SUPERUSER_ID
from openerp.osv import osv
from openerp.tools import float_is_zero
from openerp.exceptions import UserError
from openerp import api, fields, models, _
import openerp.addons.decimal_precision as dp
class PosInvoiceReportNew(osv.AbstractModel):
_name = 'report.discounts_in_pos.report_invoice'
def render_html(self, cr, uid, ids, data=None, context=None):
report_obj = self.pool['report']
posorder_obj = self.pool['pos.order']
report = report_obj._get_report_from_name(cr, uid, 'discounts_in_pos.report_invoice')
selected_orders = posorder_obj.browse(cr, uid, ids, context=context)
ids_to_print = []
invoiced_posorders_ids = []
for order in selected_orders:
if order.invoice_id:
ids_to_print.append(order.invoice_id.id)
invoiced_posorders_ids.append(order.id)
not_invoiced_orders_ids = list(set(ids) - set(invoiced_posorders_ids))
if not_invoiced_orders_ids:
not_invoiced_posorders = posorder_obj.browse(cr, uid, not_invoiced_orders_ids, context=context)
not_invoiced_orders_names = list(map(lambda a: a.name, not_invoiced_posorders))
raise UserError(_('No link to an invoice for %s.') % ', '.join(not_invoiced_orders_names))
docargs = {
'docs': self.pool['account.invoice'].browse(cr, uid, ids_to_print, context=context)
}
return report_obj.render(cr, SUPERUSER_ID, ids, 'discounts_in_pos.report_invoice', docargs, context=context)
class POSInvoiceNew(models.Model):
_inherit = 'account.invoice.line'
discount_fixed = fields.Float(string='Discount.Fixed', digits=dp.get_precision('DiscountFixed'),
default=0.0)
@api.one
@api.depends('price_unit', 'discount', 'invoice_line_tax_ids', 'quantity',
'product_id', 'invoice_id.partner_id', 'invoice_id.currency_id', 'invoice_id.company_id')
def _compute_price(self):
super(POSInvoiceNew, self)._compute_price()
currency = self.invoice_id and self.invoice_id.currency_id or None
price = self.price_unit * (1 - (self.discount or 0.0) / 100.0)
if self.discount != 0:
price = self.price_unit * (1 - (self.discount or 0.0) / 100.0)
if self.discount_fixed != 0:
price = self.price_unit
taxes = False
if self.invoice_line_tax_ids:
taxes = self.invoice_line_tax_ids.compute_all(price, currency, self.quantity, product=self.product_id,
partner=self.invoice_id.partner_id)
self.price_subtotal = price_subtotal_signed = taxes['total_excluded'] if taxes else self.quantity * price
if self.discount != 0:
self.price_subtotal = price_subtotal_signed = taxes['total_excluded'] if taxes else self.quantity * price
if self.discount_fixed != 0:
self.price_subtotal = price_subtotal_signed = taxes[
'total_excluded'] if taxes else self.quantity * price - self.discount_fixed
if self.invoice_id.currency_id and self.invoice_id.currency_id != self.invoice_id.company_id.currency_id:
price_subtotal_signed = self.invoice_id.currency_id.compute(price_subtotal_signed,
self.invoice_id.company_id.currency_id)
sign = self.invoice_id.type in ['in_refund', 'out_refund'] and -1 or 1
self.price_subtotal_signed = price_subtotal_signed * sign
class POSInvoiceTotalDisc(models.Model):
_inherit = 'account.invoice'
discount_total = fields.Float(string='Total Discount', default=0.0)
discount_percent = fields.Float(string='Total Discount(%)', default=0.0)
@api.one
@api.depends('invoice_line_ids.price_subtotal', 'tax_line_ids.amount', 'currency_id', 'company_id')
def _compute_amount(self):
super(POSInvoiceTotalDisc, self)._compute_amount()
self.amount_total = self.amount_untaxed + self.amount_tax
if self.discount_total > 0:
self.amount_total -= self.discount_total
if self.discount_percent > 0:
self.amount_total -= ((self.amount_untaxed + self.amount_tax) * self.discount_percent / 100)
def _compute_residual(self):
super(POSInvoiceTotalDisc, self)._compute_residual()
residual = 0.0
residual_company_signed = 0.0
sign = self.type in ['in_refund', 'out_refund'] and -1 or 1
for line in self.sudo().move_id.line_ids:
if line.account_id.internal_type in ('receivable', 'payable'):
residual_company_signed += line.amount_residual
if line.currency_id == self.currency_id:
residual += line.amount_residual_currency if line.currency_id else line.amount_residual
else:
from_currency = (line.currency_id and line.currency_id.with_context(date=line.date)) or line.company_id.currency_id.with_context(date=line.date)
residual += from_currency.compute(line.amount_residual, self.currency_id)
if self.discount_total > 0:
residual -= self.discount_total
if self.discount_percent > 0:
residual -= self.amount_untaxed * self.discount_percent / 100
self.residual_company_signed = abs(residual_company_signed) * sign
self.residual_signed = abs(residual) * sign
self.residual = abs(residual)
digits_rounding_precision = self.currency_id.rounding
if float_is_zero(self.residual, precision_rounding=digits_rounding_precision):
self.reconciled = True
else:
self.reconciled = False
@api.multi
def action_move_create(self):
res = super(POSInvoiceTotalDisc, self).action_move_create()
order = self.env['pos.order'].search([('invoice_id', '=', self.id)])
session = None
if order:
if order.discount_total > 0 or order.discount_percent > 0:
session = order.session_id
discount_ac = None
if session:
if session.config_id.discount_account:
discount_ac = session.config_id.discount_account
else:
raise UserError(_('Please set a discount account for this session'))
lines = self.env['account.move.line'].search([('move_id', '=', self.move_id.id), ('debit', '>', 0)], limit=1)
if order.discount_total > 0:
discount = order.discount_total
elif order.discount_percent > 0:
move_lines = self.env['account.move.line'].search([('move_id', '=', self.move_id.id), ('credit', '>', 0)])
sum = 0
for i in move_lines:
sum += i.credit
discount = sum - order.amount_total
lines.write({
'debit': lines.debit - discount
})
temp2 = {
'partner_id': self.partner_id.id,
'name': "Discount",
'credit': 0,
'debit': discount,
'account_id': discount_ac.id,
'quantity': 1,
'move_id': self.move_id.id,
}
self.env['account.move.line'].create(temp2)
return res
class PosConfigNew(models.Model):
_inherit = 'pos.config'
# discount account is used to enter the total discount values
discount_account = fields.Many2one('account.account', string="Discount Account", required=True)