1 # -*- coding: utf-8 -*-
2 ##############################################################################
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>)
9 # This file is a part of Non-real time point of sale
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.
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.
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/>.
24 ##############################################################################
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 _
34 class pos_config(orm
.Model
):
35 _inherit
= 'pos.config'
37 def _is_pos_used(self
, cr
, uid
, ids
, name
, args
, context
=None):
38 """Return True if the pos is already in use."""
40 session_obj
= self
.pool
.get('pos.session')
42 sessions
= session_obj
.search(cr
, uid
, [('config_id', 'in', ids
),('state', '!=', 'closed')], context
=context
)
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
,
56 string
='Is this pos in used?',
62 'nrt': lambda *a
: True,
66 class pos_session(orm
.Model
):
67 _inherit
= 'pos.session'
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')
81 'is_nrt_pos': is_nrt_pos
,
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."""
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
97 'start_at': fields
.datetime('Opening date'),
98 'stop_at': fields
.datetime('Closing date'),
99 'is_nrt_pos': fields
.function(_is_nrt_pos
,
101 string
='Is this session linked to a nrt pos?',
107 'start_at': strftime('%Y-%m-%d %H:%M:%S'),
110 def create(self
, cr
, uid
, values
, context
=None):
112 Put the same date in bank statements as pos session and define the
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)
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
)
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
)
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']
141 company_id
= order_obj
.browse(cr
, uid
, order_ids
, context
=context
)[0].company_id
.id
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
)
151 def wkf_action_closing_control(self
, cr
, uid
, ids
, context
=None):
153 Put same stop_at date in pos_session as its start_at date
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
)
161 def onchange_start_at(self
, cr
, uid
, ids
, start_at
, context
=None):
162 """Define same stop_at as start_at"""
164 return {'value': {'stop_at': start_at
}}
166 for session
in self
.browse(cr
, uid
, ids
, context
=context
):
167 if session
.config_id
.nrt
:
168 return {'value': {'stop_at': start_at
}}
171 class pos_order(orm
.Model
):
172 _inherit
= 'pos.order'
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
)
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
)
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')
197 for session
in session_obj
.browse(cr
, uid
, [session_id
],
199 if session
.config_id
.nrt
:
200 default_date_order
= session
.start_at
201 return {'value': {'date_order': default_date_order
}}
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')
207 order
= self
.browse(cr
, uid
, [order_id
], context
=context
)[0]
208 date_order
= order
.date_order
210 super(pos_order
, self
).add_payment(cr
, uid
, order_id
, data
, context
=context
)
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
)
218 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: