Odoo Help


How to register POS invoice payment

Alejandro Perez Cosio
on 12/19/14, 7:18 AM 2,902 views

In Odoo 8, if you sell something and invoice it from POS, it will not register the payment at

Accounting > Current Invoices > (some invoice)

The invoice remains as 'Open' and the payment is not registered. 
Is this the correct behavior? Or is it a bug?


Ing. Daniel Blanco
On 1/2/15, 11:41 PM

The payment will be registered when the POS session is closed. Anyway, the associated invoice will remain open. This last, definitely is a bug, I did not find a way to reconcile, or associate the payment to the invoice yet.

I'll see what happen if I change de invoice status in some way.

Hello Daniel, thanks for your input, if the payment is being registered when the POS session is closed, then it wouldn't be so hard to make a function to set the status for all involved invoices to 'paid'. I will take a look at this and come back with some comments.

Alejandro Perez Cosio
on 1/3/15, 11:21 AM

I think the issue here is that the payment is registered. There should be an option to register an invoice without a payment. This way you could register a credit for a customer. If the customer will pay later. An invoice would be created to serve as the registry for that receivable amount. I've not yet found a way to make the POS not register a payment and allow me to register an invoice.

Joan Barros
on 11/17/15, 11:41 AM
Amarildo Golloshi
On 3/17/17, 7:35 AM

I have the same issue , i find this: https://github.com/odoo/odoo/issues/6534

I make same change to work for odoo 9:

from openerp.osv import fields, osvimport logging_logger = logging.getLogger(__name__) class pos_session(osv.osv): _inherit = 'pos.session' def _confirm_orders(self, cr, uid, ids, context=None): account_move_obj = self.pool.get('account.move') account_move_line_obj = self.pool.get('account.move.line') pos_order_obj = self.pool.get('pos.order') for session in self.browse(cr, uid, ids, context=context): local_context = dict(context or {}, force_company=session.config_id.journal_id.company_id.id) order_ids = [order.id for order in session.order_ids if order.state == 'paid'] move_id = account_move_obj.create(cr, uid, {'ref' : session.name, 'journal_id' : session.config_id.journal_id.id, }, context=local_context) pos_order_obj._create_account_move_line(cr, uid, order_ids, session, move_id, context=local_context) for order in session.order_ids: if order.state == 'done': continue if order.state not in ('paid', 'invoiced'): raise osv.except_osv( _('Error!'), _("You cannot confirm all orders of this session, because they have not the 'paid' status")) else: pos_order_obj.signal_workflow(cr, uid, [order.id], 'done') order_ids = self.pool.get('pos.order').search(cr, uid, [('session_id','=', session.id)]) for obj_order_id in self.pool.get('pos.order').browse(cr, uid, order_ids, context=context): move_line = [] for move_line_id in obj_order_id.invoice_id.move_id.line_ids: if move_line_id.name == obj_order_id.name: move_line.append(move_line_id.id) move_line_ids_1 = [] for statement_id in obj_order_id.statement_ids: move_line_ids = account_move_line_obj.search(cr, uid, [('statement_id','=', statement_id.statement_id and statement_id.statement_id.id)]) if (move_line_ids != move_line_ids_1) : for line in account_move_line_obj.browse(cr, uid, move_line_ids): if line.credit and line.name.strip().strip(':') == obj_order_id.name: move_line.append(line.id) if line.debit and 'return' in line.name: move_line.append(line.id) move_line_ids_1 = move_line_ids ctx = context.copy() ctx.update({'active_ids': move_line}) self.pool.get('account.move.line.reconcile').trans_rec_reconcile_full(cr, uid, [], ctx) return True 

The invoice change from Open to Paid only after closed the session of the Point Of Sale.

Mohamed Hagag
On 4/8/16, 3:23 AM

Just in case that there are people looking for a fix, here is a simple module that will auto reconcile the invoice with its payment so the invoice will be paid.


Thank you for you module. Two things :

1. the new name's module is **pos_fixes**

2. I had to adapt the code to fit with odoo v9

on 11/3/16, 2:00 AM

I found a bug (it seems). When you do two sales in POS in the same session for the same customer : **First** invoiced, the **second** without invoice. When I close session, the first invoice stll open and not paid.

on 2/10/17, 1:53 AM
On 3/7/16, 9:25 AM

Hi \Alejandro Perez Cosio

1)In POS, if any order is invoiced then you can check under POS Orders and you will find that particular order status as “Invoiced”.

Note :- Even if the session in which the Invoice was generated is validated and closed the invoice status does not change. This needs a relook.

2)But If you click on the POS Order and go to the Tab “Extra Info” , you will be able to find a field Invoice(e.g. SAJ/2016/0003Main/007) associated with the POS Order under Accounting Information. On clicking on it you will have the option to register payment.

Hope this helps


Javier Cotua
On 2/26/15, 12:01 PM

I have the same issue, did you find a solution?

About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

5 follower(s)


Asked: 12/19/14, 7:18 AM
Seen: 2902 times
Last updated: 3/17/17, 7:35 AM