Added a refund purchase button in the pos session form. This action creates a stateme...
[burette/bikecoop.git] / bikecoop.py
index 63016b8..2dd81da 100644 (file)
@@ -1,5 +1,33 @@
 # -*- coding: utf-8 -*-
-from osv import fields, osv
+##############################################################################
+#
+#    Bikecoop module for OpenERP, Custom module for bike coop'
+#    Copyright (C) 2012-2014 L'Heureux Cyclage (<http://www.heureux-cyclage.org>)
+#
+#    This file is a part of Bikecoop
+#
+#    Bikecoop is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) any later version.
+#
+#    Bikecoop is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.osv import fields, osv
+import openerp.addons.decimal_precision as dp
+from openerp.tools.translate import _
+from openerp.addons.point_of_sale.wizard.pos_box import PosBoxOut
+
+from datetime import date
+
 
 class Theme(osv.osv):
     _name = 'bikecoop.partner.theme'
@@ -8,7 +36,7 @@ class Theme(osv.osv):
     _columns = {
         'code': fields.char('Code', size=8, help='Code of the occupation'),
         'name': fields.char('Name', size=128, help='Name of the job or studies', required=True, translate=True),
-        'domain': fields.char('Domain', size=64, help='Domain for filtering results'),
+        'domain': fields.selection([('gender', 'Gender'), ('occupation', 'Occupation'), ('volunteer', 'Volunteer')], 'Domain', required=True, size=24),
         'active': fields.boolean('Active', help='If check, this object is always available'),
     }
 
@@ -23,12 +51,66 @@ class Partner(osv.osv):
     _inherit = 'res.partner'
 
     _columns = {
-        'associate_members': fields.one2many('res.partner', 'associate_member', 'Associate members', help='Members who are associated to this partner.'),
         'nationality_id': fields.many2one('res.country', 'Nationality', help='Partner\'s nationality if he is a person'),
+        'year': fields.integer('Year of birth', help='This partner year of birth'),
         'occupation_id': fields.many2one('bikecoop.partner.theme', 'Occupation', help='Main occupation of this partner'),
         'volunteer_ids': fields.many2many('bikecoop.partner.theme', 'res_partner_bikecoop_theme_rel', 'partner_id', 'theme_id', 'Want to be volunteer?', help='What kind of volunteer activities you want to do with us?'),
+        'gender_id': fields.many2one('bikecoop.partner.theme', 'Gender'),
     }
 
+    def _check_year(self, cr, uid, ids, context=None):
+        obj = self.browse(cr, uid, ids[0], context=context)
+        if obj.year:
+            if obj.year < 1900 or obj.year > date.today().year:
+                return False
+        return True
+
+    _constraints = [
+        (_check_year, 'Error: this year is not valid.', ['year']),
+    ]
 Partner()
 
+
+class product_template(osv.osv):
+    _inherit = 'product.template'
+
+    _columns = {
+        'standard_price': fields.float('Cost', digits_compute=dp.get_precision('Product Price'), help="Cost price of the product used for standard stock valuation in accounting and used as a base price on purchase orders.", groups="base.group_user,point_of_sale.group_pos_user"),
+    }
+
+product_template()
+
+# Inheriting journal in order to define a purchase account which will be used when refunding an employee from an open register
+class account_journal(osv.osv):
+    _inherit = 'account.journal'
+    _columns = {
+       'purchase_account_id' : fields.many2one('account.account', 'Purchase Account', select=1),
+    }
+account_journal()
+
+class PurchaseBox(PosBoxOut):
+    # Copied from account/wizard/pos_box.py since there is no way to overload the account used to create the statement
+    def _run(self, cr, uid, ids, records, context=None):
+        for box in self.browse(cr, uid, ids, context=context):
+            for record in records:
+                if not record.journal_id:
+                    raise osv.except_osv(_('Error!'),
+                                         _("Please check that the field 'Journal' is set on the Bank Statement"))
+                    
+                if not record.journal_id.purchase_account_id:
+                    raise osv.except_osv(_('Error!'),
+                                         _("Please check that the field 'Purchase Account' is set on the payment method '%s'.") % (record.journal_id.name,))
+
+                self._create_bank_statement_line(cr, uid, box, record, context=context)
+
+        return {}
+    
+    def _compute_values_for_statement_line(self, cr, uid, box, record, context=None):
+       values = super(PosBoxOut, self)._compute_values_for_statement_line(cr, uid, box, record, context=context)
+       values['account_id'] = record.journal_id.purchase_account_id.id
+       return values
+
+PurchaseBox()
+    
+
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: