[MODULE] ~maj description
[burette/nrt_point_of_sale.git] / point_of_sale.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 # Non-real time point of sale module for OpenERP, Permit user to record his
5 # sales in point of sale interface in non-real time.
6 # Copyright (C) 2016 L'Heureux Cyclage (<http://www.heureux-cyclage>)
7 # Ludovic CHEVALIER
8 #
9 # This file is a part of Non-real time point of sale
10 #
11 # Non-real time point of sale is free software: you can redistribute it
12 # and/or modify it under the terms of the GNU General Public License as
13 # published by the Free Software Foundation, either version 3 of the
14 # License, or (at your option) any later version.
15 #
16 # Non-real time point of sale is distributed in the hope that it will be
17 # useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
19 # Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #
24 ##############################################################################
25
26 from openerp.osv import osv
27 from openerp.osv import orm
28 from openerp.osv import fields
29 from time import strftime
30 import openerp.exceptions
31 from openerp.tools.translate import _
32
33
34 class pos_config(orm.Model):
35 _inherit = 'pos.config'
36
37 def _is_pos_used(self, cr, uid, ids, name, args, context=None):
38 """Return True if the pos is already in use."""
39 res = {}
40 session_obj = self.pool.get('pos.session')
41 for id in ids:
42 sessions = session_obj.search(cr, uid, [('config_id', 'in', ids),('state', '!=', 'closed')], context=context)
43 if sessions:
44 res[id] = True
45 else:
46 res[id] = False
47 return res
48
49 _columns = {
50 'nrt': fields.boolean('Non-real time', help='This pos move lines will '\
51 'be based on the session opening if this box is '\
52 'checked. This field is readonly if the point of '\
53 'sale is already in use.'),
54 'is_pos_used': fields.function(_is_pos_used,
55 method=True,
56 string='Is this pos in used?',
57 type='boolean',
58 store=False),
59 }
60
61 _defaults = {
62 'nrt': lambda *a: True,
63 }
64
65
66 class pos_session(orm.Model):
67 _inherit = 'pos.session'
68
69 def onchange_config_id(self, cr, uid, ids, config_id, context=None):
70 """Return is_nrt_pos and start_at date when config_id field changes."""
71 config_obj = self.pool.get('pos.config')
72 config = config_obj.browse(cr, uid, config_id, context=context)
73 start_at = strftime('%Y-%m-%d %H:%M:%S')
74 is_nrt_pos = False
75
76 if config.nrt:
77 is_nrt_pos = True
78 return {'value':
79 {
80 'start_at': start_at,
81 'is_nrt_pos': is_nrt_pos,
82 }
83 }
84
85 def _is_nrt_pos(self, cr, uid, ids, name, args, context=None):
86 """Return True if the current session refers to a nrt pos."""
87 res = {}
88 sessions = self.browse(cr, uid, ids, context=context)
89 config_obj = self.pool.get('pos.config')
90 for session in sessions:
91 res[session.id] = False
92 if session.config_id.nrt:
93 res[session.id] = True
94 return res
95
96 _columns = {
97 'start_at': fields.datetime('Opening date'),
98 'stop_at': fields.datetime('Closing date'),
99 'is_nrt_pos': fields.function(_is_nrt_pos,
100 method=True,
101 string='Is this session linked to a nrt pos?',
102 type='boolean',
103 store=False,),
104 }
105
106 _defaults = {
107 'start_at': strftime('%Y-%m-%d %H:%M:%S'),
108 }
109
110 def create(self, cr, uid, values, context=None):
111 """
112 Put the same date in bank statements as pos session and define the
113 appropriate period
114 """
115 context = context or {}
116 bank_st_obj = self.pool.get('account.bank.statement')
117 period_obj = self.pool.get('account.period')
118 context = dict(context, account_period_prefer_normal=True)
119
120 id = super(pos_session, self).create(cr, uid, values, context=context)
121 for session in self.browse(cr, uid, [id], context=context):
122 default_date = session.start_at
123 if session.config_id.nrt:
124 bank_st_ids = bank_st_obj.search(cr, uid, [('pos_session_id', '=', id)], context=context)
125 period = period_obj.find(cr, uid, dt=default_date, context=dict(context or {}, account_period_prefer_normal=True))[0]
126 bank_st_obj.write(cr, uid, bank_st_ids, {'date': default_date, 'period_id': period}, context=context)
127 return id
128
129 def _confirm_orders(self, cr, uid, ids, context=None):
130 """Put the same date in sale account move as pos session"""
131 account_move_obj = self.pool.get('account.move')
132 order_obj = self.pool.get('pos.order')
133 period_obj = self.pool.get('account.period')
134 super(pos_session, self)._confirm_orders(cr, uid, ids, context=context)
135
136 for session in self.browse(cr, uid, ids, context=context):
137 if session.config_id.nrt:
138 account_move_ids = []
139 order_ids = [order.id for order in session.order_ids if order.state == 'done']
140 if order_ids:
141 company_id = order_obj.browse(cr, uid, order_ids, context=context)[0].company_id.id
142 else:
143 company_id = self.pool.get('res.users').browse(cr, uid, [uid], context=context)[0].company_id.id
144 for order in order_obj.browse(cr, uid, order_ids, context=context):
145 if order.account_move.id not in account_move_ids:
146 account_move_ids.append(order.account_move.id)
147 period = period_obj.find(cr, uid, dt=session.start_at, context=dict(context or {}, company_id=company_id, account_period_prefer_normal=True))[0]
148 account_move_obj.write(cr, uid, account_move_ids, {'date': session.start_at, 'period_id': period}, context=context)
149 return True
150
151 def wkf_action_closing_control(self, cr, uid, ids, context=None):
152 """
153 Put same stop_at date in pos_session as its start_at date
154 """
155 res = super(pos_session, self).wkf_action_closing_control(cr, uid, ids, context=context)
156 for session in self.browse(cr, uid, ids, context=context):
157 if session.config_id.nrt:
158 self.write(cr, uid, [session.id], {'stop_at': session.start_at}, context=context)
159 return res
160
161 def onchange_start_at(self, cr, uid, ids, start_at, context=None):
162 """Define same stop_at as start_at"""
163 if not ids:
164 return {'value': {'stop_at': start_at}}
165 else:
166 for session in self.browse(cr, uid, ids, context=context):
167 if session.config_id.nrt:
168 return {'value': {'stop_at': start_at}}
169
170
171 class pos_order(orm.Model):
172 _inherit = 'pos.order'
173
174 def create(self, cr, uid, vals, context=None):
175 session = self.pool.get('pos.session').browse(cr, uid, vals['session_id'], context=context)
176 if session.config_id.nrt:
177 vals.update({'date_order': session.start_at})
178 res = super(pos_order, self).create(cr, uid, vals, context=context)
179 return res
180
181 def write(self, cr, uid, ids, vals, context=None):
182 for order in self.browse(cr, uid, ids, context=context):
183 if order.session_id.config_id.nrt:
184 default_date_order = order.session_id.start_at
185 vals.update({'date_order': default_date_order})
186 res = super(pos_order, self).write(cr, uid, ids, vals, context=context)
187 return res
188
189 def onchange_session_id(self, cr, uid, ids, session_id, context=None):
190 """Define date order by start date of current session"""
191 session_obj = self.pool.get('pos.session')
192 default_date_order = strftime('%Y-%m-%d %H:%M:%S')
193
194 if not session_id:
195 return {'value': {}}
196 else:
197 for session in session_obj.browse(cr, uid, [session_id],
198 context=context):
199 if session.config_id.nrt:
200 default_date_order = session.start_at
201 return {'value': {'date_order': default_date_order}}
202
203 def add_payment(self, cr, uid, order_id, data, context=None):
204 """Define payment date by the order date"""
205 statement_obj = self.pool.get('account.bank.statement.line')
206 statement_ids = []
207 order = self.browse(cr, uid, [order_id], context=context)[0]
208 date_order = order.date_order
209
210 super(pos_order, self).add_payment(cr, uid, order_id, data, context=context)
211
212 if order.session_id.config_id.nrt:
213 for statement in order.statement_ids:
214 statement_ids.append(statement.id)
215 statement_obj.write(cr, uid, statement_ids, {'date': date_order}, context=context)
216 return order_id
217
218 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: