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
Post a Comment