How to calculate number of nights for hotel management module in Odoo 8 -


i working on hotel management module in odoo version 8.

i wish calculate number of nights stayed between check-in date , check-out date. can me this?

i defined class reservations, on change methods check-in , check-out. tried function calculating total_nights. here code,

class hotel_reservation(osv.model): _name = "hotel.reservation" _rec_name = "reservation_no" _description = "reservation" _order = 'reservation_no desc' _columns = {     'reservation_no': fields.char('reservation no', size=64, required=true, readonly=true),     'date_order':fields.datetime('date ordered', required=true, readonly=true, states={'draft':[('readonly', false)]}),     'warehouse_id':fields.many2one('stock.warehouse', 'hotel', readonly=true, required=true, states={'draft':[('readonly', false)]}),     'partner_id':fields.many2one('res.partner', 'guest name', readonly=true, required=true, states={'draft':[('readonly', false)]}),     'pricelist_id':fields.many2one('product.pricelist', 'price list', required=true, readonly=true, states={'draft':[('readonly', false)]}, help="pricelist current reservation. "),     'partner_invoice_id':fields.many2one('res.partner', 'invoice address', readonly=true, states={'draft':[('readonly', false)]}, help="invoice address current reservation. "),     'partner_order_id':fields.many2one('res.partner', 'ordering contact', readonly=true, states={'draft':[('readonly', false)]}, help="the name , address of contact requested order or quotation."),     'partner_shipping_id':fields.many2one('res.partner', 'delivery address', readonly=true, states={'draft':[('readonly', false)]}, help="delivery address current reservation. "),     'checkin': fields.datetime('expected-date-arrival', required=true, readonly=true, states={'draft':[('readonly', false)]}),     'checkout': fields.datetime('expected-date-departure', required=true, readonly=true, states={'draft':[('readonly', false)]}),     'adults':fields.integer('adults', size=64, readonly=true, states={'draft':[('readonly', false)]}, help='list of adults there in guest list. '),     'children':fields.integer('children', size=64, readonly=true, states={'draft':[('readonly', false)]}, help='number of children there in guest list. '),     'reservation_line':fields.one2many('hotel_reservation.line', 'line_id', 'reservation line', help='hotel room reservation details. '),     'state': fields.selection([('draft', 'draft'), ('confirm', 'confirm'), ('cancel', 'cancel'), ('done', 'done')], 'state', readonly=true),     'folio_id': fields.many2many('hotel.folio', 'hotel_folio_reservation_rel', 'order_id', 'invoice_id', 'folio'),     'dummy': fields.datetime('dummy'),     #'no_of_nights': fields.integer('number of nights', size=64, readonly=true, states={'draft':[('readonly', false)]}, help='number of nights.'),     'no_of_nights':fields.function(_total_nights, string='amount returned',                                    store={                                           'value': (lambda self, cr, uid, ids, c={}: ids, ['amount', 'roi'], 10),                                           },),  } _defaults = {     'reservation_no': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'hotel.reservation'),     'state': lambda *a: 'draft',     'date_order': lambda *a: time.strftime('%y-%m-%d %h:%m:%s'), }   def on_change_checkin(self, cr, uid, ids, date_order, checkin_date=time.strftime('%y-%m-%d %h:%m:%s'), context=none):     if date_order , checkin_date:         if checkin_date < date_order:             raise osv.except_osv(_('warning'), _('checkin date should greater current date.'))     return {'value':{}}  def on_change_checkout(self, cr, uid, ids, checkin_date=time.strftime('%y-%m-%d %h:%m:%s'), checkout_date=time.strftime('%y-%m-%d %h:%m:%s'), context=none):     if not (checkout_date , checkin_date):         return {'value':{}}     if checkout_date < checkin_date:         raise osv.except_osv(_('warning'), _('checkout date should greater checkin date.'))     delta = datetime.timedelta(days=1)     adddays = datetime.datetime(*time.strptime(checkout_date, '%y-%m-%d %h:%m:%s')[:5]) + delta     val = {'value':{'dummy':adddays.strftime('%y-%m-%d %h:%m:%s')}}     return val       def onchange_partner_id(self, cr, uid, ids, partner_id):     if not partner_id:         return {'value':{'partner_invoice_id': false, 'partner_shipping_id':false, 'partner_order_id':false}}     partner_obj = self.pool.get('res.partner')     addr = partner_obj.address_get(cr, uid, [partner_id], ['delivery', 'invoice', 'contact'])     pricelist = partner_obj.browse(cr, uid, partner_id).property_product_pricelist.id     return {'value':{'partner_invoice_id': addr['invoice'], 'partner_order_id':addr['contact'], 'partner_shipping_id':addr['delivery'], 'pricelist_id': pricelist}}  def total_nights(self, cr, uid, ids, context=none):     print("function calculating total nights !")      context = context or {}      res = {}     ''''''               value in self.browse(cr, uid, ids, checkin_date=time.strftime('%y-%m-%d %h:%m:%s'), checkout_date=time.strftime('%y-%m-%d %h:%m:%s'), context=context):          check_in = datetime.strptime(check_in, "%y-%m-%d")         check_out = datetime.strptime(check_out, "%y-%m-%d")         delta = check_out - check_in          print delta.days       return res  class hotel_room_reservation_line(osv.model): _name = 'hotel.room.reservation.line' _description = 'hotel room reservation' _rec_name = 'room_id' _columns = {     'room_id': fields.many2one('hotel.room', 'room id'),     'check_in':fields.datetime('check in date', required=true),     'check_out': fields.datetime('check out date', required=true),     'state': fields.selection([('assigned', 'assigned'), ('unassigned', 'unassigned')], 'room status'),     'reservation_id': fields.many2one('hotel.reservation', 'reservation'), }  hotel_room_reservation_line() 

this code may you:

# making difference in dates no. of days .....  @api.one @api.onchange('check_in')    def onchange_date_time(self):     # print 'working till ----------------------------'     if self.check_in:         check_in = datetime.datetime.strptime(self.check_in, "%y-%m-%d").date()         if check_in<datetime.date.today():             #raise except_orm('error','please enter correct date')             self.check_in = none         else:             pass   @api.one @api.onchange('check_out')   def onchange_check_out(self):     if self.check_out:         check_out = datetime.datetime.strptime(self.check_out, "%y-%m-%d").date()         check_in = datetime.datetime.strptime(self.check_in, "%y-%m-%d").date()         if check_out<datetime.date.today():             self.check_out = false             # if not self.check_out:                 # raise osv.except_orm('error','please enter correct date')          else:             pass   @api.onchange('check_out') def onchange_num_day(self):     if self.check_out , self.check_in:         check_in = datetime.datetime.strptime(self.check_in, "%y-%m-%d").date()         check_out = datetime.datetime.strptime(self.check_out, "%y-%m-%d").date()         self.days = (check_out-check_in).days+1         if self.days == 0:             self.days = 1    #hence no.of days .. ends  

fields: checked_in,checked_out,days

thanks


Comments