[IMP]point of sale: added fiscal_position_id field in pos config to set fiscal postion on each shop.

This commit is contained in:
Darshan Kalola
2015-09-21 12:10:10 +02:00
committed by qdp-odoo
parent 991e0cbef7
commit 5327869356
3 changed files with 57 additions and 36 deletions
+24 -24
View File
@@ -126,6 +126,7 @@ class pos_config(osv.osv):
'group_pos_manager_id': fields.many2one('res.groups','Point of Sale Manager Group', help='This field is there to pass the id of the pos manager group to the point of sale client'),
'group_pos_user_id': fields.many2one('res.groups','Point of Sale User Group', help='This field is there to pass the id of the pos user group to the point of sale client'),
'tip_product_id': fields.many2one('product.product','Tip Product', help="The product used to encode the customer tip. Leave empty if you do not accept tips."),
'fiscal_position_id': fields.many2one('account.fiscal.position', 'Fiscal Position'),
}
def _check_company_location(self, cr, uid, ids, context=None):
@@ -663,7 +664,7 @@ class pos_order(osv.osv):
_order = "id desc"
def _amount_line_tax(self, cr, uid, line, context=None):
taxes = line.product_id.taxes_id.filtered(lambda t: t.company_id.id == line.order_id.company_id.id)
taxes = (line.tax_ids or line.product_id.taxes_id).filtered(lambda t: t.company_id.id == line.order_id.company_id.id)
price = line.price_unit * (1 - (line.discount or 0.0) / 100.0)
cur = line.order_id.pricelist_id.currency_id
taxes = taxes.compute_all(price, cur, line.qty, product=line.product_id, partner=line.order_id.partner_id or False)['taxes']
@@ -1148,10 +1149,10 @@ class pos_order(osv.osv):
#Oldlin trick
invoice_line = inv_line_ref.new(cr, SUPERUSER_ID, inv_line, context=local_context)
invoice_line._onchange_product_id()
invoice_line.invoice_line_tax_ids = [tax.id for tax in invoice_line.invoice_line_tax_ids if tax.company_id.id == company_id]
# We convert a new id object back to a dictionary to write to bridge between old and new api
inv_line = invoice_line._convert_to_write(invoice_line._cache)
inv_line.update(price_unit=line.price_unit, discount=line.discount)
taxes = (line.tax_ids or invoice_line.invoice_line_tax_ids).filtered(lambda t: t.company_id.id == company_id)
inv_line.update(price_unit=line.price_unit, discount=line.discount, invoice_line_tax_ids=[(6, 0, taxes.ids)])
inv_line_ref.create(cr, SUPERUSER_ID, inv_line, context=local_context)
inv_ref.compute_taxes(cr, SUPERUSER_ID, [inv_id], context=local_context)
self.signal_workflow(cr, uid, [order.id], 'invoice')
@@ -1313,12 +1314,10 @@ class pos_order(osv.osv):
# Create the tax lines
taxes = []
for t in line.product_id.taxes_id:
if t.company_id.id == current_company.id:
taxes.append(t.id)
taxes = (line.tax_ids or line.product_id.taxes_id).filtered(lambda t: t.company_id.id == current_company.id)
if not taxes:
continue
for tax in account_tax_obj.browse(cr,uid, taxes, context=context).compute_all(line.price_unit * (100.0-line.discount) / 100.0, cur, line.qty)['taxes']:
for tax in taxes.compute_all(line.price_unit * (100.0-line.discount) / 100.0, cur, line.qty)['taxes']:
insert_data('tax', {
'name': _('Tax') + ' ' + tax['name'],
'product_id': line.product_id.id,
@@ -1395,19 +1394,18 @@ class pos_order_line(osv.osv):
def _amount_line_all(self, cr, uid, ids, field_names, arg, context=None):
res = dict([(i, {}) for i in ids])
account_tax_obj = self.pool.get('account.tax')
for line in self.browse(cr, uid, ids, context=context):
cur = line.order_id.pricelist_id.currency_id
taxes_ids = [ tax.id for tax in line.product_id.taxes_id if tax.company_id.id == line.order_id.company_id.id ]
taxes = (line.tax_ids or line.product_id.taxes_id).filtered(lambda t: t.company_id.id == line.order_id.company_id.id)
price = line.price_unit * (1 - (line.discount or 0.0) / 100.0)
res[line.id]['price_subtotal'] = res[line.id]['price_subtotal_incl'] = price * line.qty
if taxes_ids:
taxes = account_tax_obj.browse(cr, uid, taxes_ids, context).compute_all(price, cur, line.qty, product=line.product_id, partner=line.order_id.partner_id or False)
res[line.id]['price_subtotal'] = taxes['total_excluded']
res[line.id]['price_subtotal_incl'] = taxes['total_included']
if taxes:
dict_taxes = taxes.compute_all(price, cur, line.qty, product=line.product_id, partner=line.order_id.partner_id or False)
res[line.id]['price_subtotal'] = dict_taxes['total_excluded']
res[line.id]['price_subtotal_incl'] = dict_taxes['total_included']
return res
def onchange_product_id(self, cr, uid, ids, pricelist, product_id, qty=0, partner_id=False, context=None):
def onchange_product_id(self, cr, uid, ids, pricelist, product_id, qty=0, partner_id=False, session_id=False, context=None):
context = context or {}
if not product_id:
return {}
@@ -1419,28 +1417,30 @@ class pos_order_line(osv.osv):
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist],
product_id, qty or 1.0, partner_id)[pricelist]
result = self.onchange_qty(cr, uid, ids, pricelist, product_id, 0.0, qty, price, context=context)
result = self.onchange_qty(cr, uid, ids, pricelist=pricelist, product=product_id, discount=0.0, qty=qty, price_unit=price, session_id=session_id, context=context)
result['value']['price_unit'] = price
return result
def onchange_qty(self, cr, uid, ids, pricelist, product, discount, qty, price_unit, context=None):
def onchange_qty(self, cr, uid, ids, pricelist, product, discount, qty, price_unit, session_id=False, context=None):
result = {}
if not product:
return result
if not pricelist:
raise UserError(_('You have to select a pricelist in the sale form !'))
account_tax_obj = self.pool.get('account.tax')
session = self.pool['pos.session'].browse(cr, uid, session_id, context)
prod = self.pool.get('product.product').browse(cr, uid, product, context=context)
taxes = prod.taxes_id
if session.config_id and session.config_id.fiscal_position_id:
taxes = session.config_id.fiscal_position_id.map_tax(prod.taxes_id)
price = price_unit * (1 - (discount or 0.0) / 100.0)
result['price_subtotal'] = result['price_subtotal_incl'] = price * qty
cur = self.pool.get('product.pricelist').browse(cr, uid, [pricelist], context=context).currency_id
if (prod.taxes_id):
taxes = prod.taxes_id.compute_all(price, cur, qty, product=prod, partner=False)
result['price_subtotal'] = taxes['total_excluded']
result['price_subtotal_incl'] = taxes['total_included']
if (taxes):
dict_taxes = taxes.compute_all(price, cur, qty, product=prod, partner=False)
result['price_subtotal'] = dict_taxes['total_excluded']
result['price_subtotal_incl'] = dict_taxes['total_included']
result['tax_ids'] = taxes
return {'value': result}
_columns = {
@@ -1455,7 +1455,7 @@ class pos_order_line(osv.osv):
'discount': fields.float('Discount (%)', digits=0),
'order_id': fields.many2one('pos.order', 'Order Ref', ondelete='cascade'),
'create_date': fields.datetime('Creation Date', readonly=True),
'tax_ids': fields.many2many('account.tax', string='Taxes', readonly=True),
'tax_ids': fields.many2many('account.tax', string='Taxes'),
}
_defaults = {
+10 -8
View File
@@ -34,20 +34,21 @@
<page string="Products">
<field name="lines" colspan="4" nolabel="1">
<tree string="Order lines" editable="bottom">
<field name="product_id" on_change="onchange_product_id(parent.pricelist_id,product_id,qty,parent.partner_id)"/>
<field name="qty" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, context)"/>
<field name="price_unit" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, context)" widget="monetary"/>
<field name="discount" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, context)" widget="monetary"/>
<field name="product_id" on_change="onchange_product_id(parent.pricelist_id, product_id, qty, parent.partner_id, parent.session_id)"/>
<field name="qty" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, parent.session_id, context)"/>
<field name="price_unit" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, parent.session_id, context)" widget="monetary"/>
<field name="discount" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, parent.session_id, context)" widget="monetary"/>
<field name="tax_ids" widget="many2many_tags"/>
<field name="price_subtotal" widget="monetary"/>
<field name="price_subtotal_incl" widget="monetary"/>
</tree>
<form string="Order lines">
<group col="4">
<field name="product_id" on_change="onchange_product_id(parent.pricelist_id,product_id,qty,parent.partner_id)"/>
<field name="qty" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, context)"/>
<field name="discount" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, context)" widget="monetary"/>
<field name="price_unit" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, context)" widget="monetary"/>
<field name="product_id" on_change="onchange_product_id(parent.pricelist_id, product_id, qty, parent.partner_id, parent.session_id)"/>
<field name="qty" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, parent.session_id, context)"/>
<field name="price_unit" on_change="onchange_qty(parent.pricelist_id,product_id, discount, qty, price_unit, parent.session_id, context)" widget="monetary"/>
<field name="discount" on_change="onchange_qty(parent.pricelist_id, product_id, discount, qty, price_unit, parent.session_id, context)" widget="monetary"/>
<field name="tax_ids" widget="many2many_tags"/>
<field name="price_subtotal" invisible="1" widget="monetary"/>
<field name="price_subtotal_incl" invisible="1" widget="monetary"/>
<field name="notice"/>
@@ -661,6 +662,7 @@
<field name="group_by" groups="account.group_account_user"/>
<field name="barcode_nomenclature_id" />
<field name="sequence_id" readonly="1" groups="base.group_no_one"/>
<field name="fiscal_position_id" options="{'no_create': True}"/>
<field name="currency_id" invisible="1"/>
</group>
<separator string="Available Payment Methods" colspan="4"/>
+23 -4
View File
@@ -276,6 +276,13 @@ exports.PosModel = Backbone.Model.extend({
self.users = pos_users;
},
},{
model: 'account.fiscal.position.tax',
fields: ['position_id', 'tax_src_id', 'tax_dest_id'],
domain: function(self) { return [['position_id', '=', self.config.fiscal_position_id && self.config.fiscal_position_id[0]]]; },
loaded: function(self, fiscal_position_tax) {
self.fiscal_position_tax = fiscal_position_tax;
},
},{
model: 'stock.location',
fields: [],
ids: function(self){ return [self.config.stock_location_id[0]]; },
@@ -1241,11 +1248,24 @@ exports.Orderline = Backbone.Model.extend({
get_tax: function(){
return this.get_all_prices().tax;
},
get_fiscal_tax: function() {
var self = this;
var product_tax = this.get_product().taxes_id;
if(product_tax && this.pos.config.fiscal_position_id) {
_.each(product_tax, function(v, i) {
var fiscal_tax = _.filter(self.pos.fiscal_position_tax, function(t) { return t.tax_src_id[0] == v });
if(fiscal_tax.length) {
product_tax[i] = fiscal_tax[0].tax_dest_id[0];
}
});
}
return _.uniq(_.compact(product_tax));
},
get_applicable_taxes: function(){
var i;
// Shenaningans because we need
// to keep the taxes ordering.
var ptaxes_ids = this.get_product().taxes_id;
var ptaxes_ids = this.get_fiscal_tax();
var ptaxes_set = {};
for (i = 0; i < ptaxes_ids.length; i++) {
ptaxes_set[ptaxes_ids[i]] = true;
@@ -1262,7 +1282,7 @@ exports.Orderline = Backbone.Model.extend({
return this.get_all_prices().taxDetails;
},
get_taxes: function(){
var taxes_ids = this.get_product().taxes_id;
var taxes_ids = this.get_fiscal_tax();
var taxes = [];
for (var i = 0; i < taxes_ids.length; i++) {
taxes.push(this.pos.taxes_by_id[taxes_ids[i]]);
@@ -1332,8 +1352,7 @@ exports.Orderline = Backbone.Model.extend({
var price_unit = this.get_unit_price() * (1.0 - (this.get_discount() / 100.0));
var taxtotal = 0;
var product = this.get_product();
var taxes_ids = product.taxes_id;
var taxes_ids = this.get_fiscal_tax();
var taxes = this.pos.taxes;
var taxdetail = {};
var product_taxes = [];