İçereği Atla
Odoo Menü
  • Portal
  • Ücretsiz deneyin
  • Uygulamalar
    Finans
    • Muhasebe
    • Faturalama
    • Masraf Yönetimi
    • Elektronik Çizelge (BI)
    • Belgeler
    • İmza
    Satış
    • Müşteri İlişkileri Yönetimi (CRM)
    • Satış
    • Satış Noktası Mağaza
    • Satış Noktası Restoran
    • Abonelikler
    • Kiralama
    Web Sitesi
    • Web Sitesi Oluşturucu
    • eTicaret
    • Blog
    • Forum
    • Canlı Sohbet
    • eÖğrenme
    Tedarik Zinciri
    • Envanter
    • Üretim
    • Ürün Yaşam Döngüsü Yönetimi
    • Satın Alma
    • Bakım
    • Kalite
    İnsan Kaynakları
    • Çalışanlar
    • İşe Alım
    • İzin
    • Değerlendirme
    • Referans
    • Filo Yönetimi
    Pazarlama
    • Sosyal Medyada Pazarlama
    • E-posta ile Pazarlama
    • SMS ile Pazarlama
    • Etkinlikler
    • Pazarlama Otomasyonu
    • Anket
    Hizmetler
    • Proje Yönetimi
    • Çalışma Çizelgeleri
    • Saha Hizmeti
    • Yardım Masası
    • Planlama
    • Randevular
    Verimlilik
    • Sohbet
    • Onay
    • Nesnelerin İnterneti
    • VoIP
    • Bilgi Bankası
    • WhatsApp
    Üçüncü taraf uygulamalar Odoo Stüdyo Odoo Bulut Platformu
  • Sektörler
    Perakende satış
    • Kitapçı
    • Giyim Mağazası
    • Mobilya Mağazası
    • Gıda Marketi
    • Hırdavat Dükkanı
    • Oyuncak Dükkanı
    Gıda ve Konaklama
    • Bar ve Pub
    • Restoran
    • Fast Food Restoranı
    • Konuk Evi
    • İçecek Distribütörü
    • Otel
    Gayrimenkul
    • Emlak Acentesi
    • Mimarlık Firması
    • İnşaat
    • Property Management
    • Bahçe Tasarımı
    • Mülk Sahipleri Derneği
    Uzmanlık
    • Muhasebe Firması
    • Odoo Partner
    • Pazarlama Ajansı
    • Hukuk Firması
    • Yetenek Kazanımı
    • Denetim ve Belgelendirme
    Üretim
    • Tekstil
    • Metal
    • Mobilyalar
    • Gıda
    • Bira fabrikası
    • Kurumsal Hediye
    Sağlık ve Spor
    • Spor Kulübü
    • Optik Mağazası
    • Fitness Merkezi
    • Sağlıklı Yaşam Merkezi
    • Eczane
    • Kuaför Salonu
    Ticaret
    • Tamirci
    • BT Donanım & Destek
    • Güneş Enerjisi Sistemleri
    • Ayakkabı İmalatçısı
    • Temizlik Hizmetleri
    • HVAC Hizmetleri
    Diğerleri
    • Kar Amacı Gütmeyen Kuruluş
    • Çevre Ajansı
    • Reklam Panosu Kiralama
    • Fotoğrafçılık
    • Bisiklet Kiralama
    • Yazılım Bayisi
    Tüm Sektörlere Göz Atın
  • Topluluk
    Öğrenim
    • Eğitim Araçları
    • Dokümantasyon
    • Sertifikasyonlar
    • Eğitim Etkinlikleri
    • Blog
    • Podcast
    Eğitim ve Gelişim
    • Eğitim Programı
    • Scale Up! İşletme Oyunu
    • Odoo'yu Ziyaret Edin
    Yazılım
    • İndirin
    • Sürümleri Kıyaslayın
    • Sürümler
    İş Birliği
    • Github
    • Forum
    • Etkinlikler
    • Çeviriler
    • Partner Olun
    • Partnerler için Hizmetler
    • Muhasebe Firmanızı Kaydettirin
    Hizmetler
    • Partner Bulun
    • Muhasebeci Bulun
    • Bir danışmanla görüşün
    • Kurulum Hizmetleri
    • Müşteri Referansları
    • Destek
    • Sürüm Yükseltme
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Demo randevusu alın
  • Fiyatlandırma
  • Yardım
You need to be registered to interact with the community.
All Posts People Badges
Etiketler (View all)
odoo accounting v14 pos v15
About this forum
You need to be registered to interact with the community.
All Posts People Badges
Etiketler (View all)
odoo accounting v14 pos v15
About this forum
Yardım

What is this error stack ?

Abone Ol

Get notified when there's activity on this post

Bu soru işaretlendi
3 Cevaplar
4152 Görünümler
Avatar
ABU K


##############################################################################

from openerp.osv import fields, osv
import time
from openerp import netsvc
import datetime
from openerp.tools.translate import _
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT

class hotel_floor(osv.Model):
    _name = "hotel.floor"
    _description = "Floor"
    _columns = {
        'name': fields.char('Floor Name', size=64, required=True, select=True),
        'sequence': fields.integer('Sequence', size=64),
    }

hotel_floor()


class product_category(osv.Model):
    _inherit = "product.category"
    _columns = {
        'isroomtype':fields.boolean('Is Room Type'),
        'isamenitype':fields.boolean('Is amenities Type'),
        'isservicetype':fields.boolean('Is Service Type'),
    }

product_category()


class hotel_room_type(osv.Model):
    _name = "hotel.room.type"
    _inherits = {'product.category': 'cat_id'}
    _description = "Room Type"
    _columns = {
        'cat_id': fields.many2one('product.category', 'category', required=True, select=True, ondelete='cascade'),
    }
    _defaults = {
        'isroomtype': 1,
    }

hotel_room_type()


class product_product(osv.Model):
    _inherit = "product.product"
    _columns = {
        'isroom':fields.boolean('Is Room'),
        'iscategid':fields.boolean('Is categ id'),
        'isservice':fields.boolean('Is Service id'),
    }

product_product()

class hotel_room_amenities_type(osv.Model):
    _name = 'hotel.room.amenities.type'
    _description = 'amenities Type'
    _inherits = {'product.category':'cat_id'}
    _columns = {
        'cat_id':fields.many2one('product.category', 'category', required=True, ondelete='cascade'),
    }
    _defaults = {
        'isamenitype': 1,
    }

hotel_room_amenities_type()

class hotel_room_amenities(osv.Model):
    _name = 'hotel.room.amenities'
    _description = 'Room amenities'
    _inherits = {'product.product':'room_categ_id'}
    _columns = {
        'room_categ_id':fields.many2one('product.product', 'Product Category', required=True, ondelete='cascade'),
        'rcateg_id':fields.many2one('hotel.room.amenities.type', 'Amenity Catagory'),
#        'amenity_rate':fields.integer('Amenity Rate'),
    }
    _defaults = {
        'iscategid': 1,
    }

hotel_room_amenities()


class hotel_room(osv.Model):
    _name = 'hotel.room'
    _inherits = {'product.product': 'product_id'}
    _description = 'Hotel Room'

#     def _default_room_rent_ids(self, cr, uid, context=None):
#         result = [
#             dict(day=value) for value in ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
#         ]
#         return result
    
    _columns = {
        'product_id': fields.many2one('product.product', 'Product_id', required=True, ondelete='cascade'),
        'floor_id':fields.many2one('hotel.floor', 'Floor No', help='At which floor the room is located.'),
        'max_adult':fields.integer('Max Adult'),
        'max_child':fields.integer('Max Child'),
        'room_amenities':fields.many2many('hotel.room.amenities', 'temp_tab', 'room_amenities', 'rcateg_id', 'Room Amenities', help='List of room amenities. '),
        'status':fields.selection([('available', 'Available'), ('occupied', 'Occupied')], 'Status'),
#        'room_reservation_line_ids': fields.one2many('hotel.room.reservation.line','room_id','Room Reservation Line'),
        'room_rent_ids':fields.one2many('room.rent', 'rent_id', 'Room Rent'),
    }
    _defaults = {
        'isroom': 1,
        'rental': 1,
        'status': 'available',
#         'room_rent_ids' : _default_room_rent_ids,
    }
    
    def set_room_status_occupied(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'status': 'occupied'}, context=context)

    def set_room_status_available(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'status': 'available'}, context=context)

#    def cron_room_line(self, cr, uid, context=None):
#        reservation_line_obj = self.pool.get('hotel.room.reservation.line')
#        now = datetime.datetime.now()
#        curr_date = now.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
#        room_ids = self.search(cr, uid, [], context=context)
#        for room in self.browse(cr, uid, room_ids, context=context):
#            status = {}
#            reservation_line_ids = [reservation_line.id for reservation_line in room.room_reservation_line_ids]
#            reservation_line_ids = reservation_line_obj.search(cr, uid, [('id', 'in', reservation_line_ids), ('check_in', '<=', curr_date), ('check_out', '>=', curr_date)], context=context)
#            if reservation_line_ids:
#                status = {'status': 'occupied'}
#            else:
#                status = {'status': 'available'}
#            self.write(cr, uid, [room.id], status, context=context)
#        return True

hotel_room()


class room_rent(osv.Model):
    _name = 'room.rent'
    _columns = {
        'rent_id': fields.many2one('hotel.room', 'Room Rent'),
        'price': fields.float('Price (Per night)'),
        'mon': fields.boolean('Monday'),
        'tue': fields.boolean('Tuesday'),
        'wed': fields.boolean('Wednesday'),
        'thu': fields.boolean('Thursday'),
        'fri': fields.boolean('Friday'),
        'sat': fields.boolean('Saturday'),
        'sun': fields.boolean('Sunday'),
    }

room_rent()


class hotel_folio(osv.Model):

#    def _incoterm_get(self, cr, uid, context=None):
#        return self.pool.get('sale.order')._incoterm_get(cr, uid, context=None)

    def copy(self, cr, uid, id, default=None, context=None):
        return self.pool.get('sale.order').copy(cr, uid, id, default=None, context=None)

    def _invoiced(self, cursor, user, ids, name, arg, context=None):
        return self.pool.get('sale.order')._invoiced(cursor, user, ids, name, arg, context=None)

    def _invoiced_search(self, cursor, user, obj, name, args):
        return self.pool.get('sale.order')._invoiced_search(cursor, user, obj, name, args)

#    def _amount_untaxed(self, cr, uid, ids, field_name, arg, context):
#        return self.pool.get('sale.order')._amount_untaxed(cr, uid, ids, field_name, arg, context)

#    def _amount_tax(self, cr, uid, ids, field_name, arg, context):
#        return self.pool.get('sale.order')._amount_tax(cr, uid, ids, field_name, arg, context)

#    def _amount_total(self, cr, uid, ids, field_name, arg, context):
#        return self.pool.get('sale.order')._amount_ total(cr, uid, ids, field_name, arg, context)

    _name = 'hotel.folio'
    _description = 'hotel folio new'
    _inherits = {'sale.order': 'order_id'}
    _rec_name = 'order_id'
    _order = 'id desc'
    _columns = {
      'name': fields.char('Folio Number', size=24, readonly=True),
      'order_id': fields.many2one('sale.order', 'Order', required=True, ondelete='cascade'),
      'checkin_date': fields.datetime('Check In', required=True, readonly=True, states={'draft':[('readonly', False)]}),
      'checkout_date': fields.datetime('Check Out', required=True, readonly=True, states={'draft':[('readonly', False)]}),
      'room_lines': fields.one2many('hotel.folio.line', 'folio_id', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Hotel room reservation detail."),
      'service_lines': fields.one2many('hotel.service.line', 'folio_id', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Hotel services detail provide to customer and it will include in main Invoice."),
      'hotel_policy': fields.selection([('prepaid', 'On Booking'), ('manual', 'On Check In'), ('picking', 'On Checkout')], 'Hotel Policy', help="Hotel policy for payment that either the guest has to payment at booking time or check-in check-out time."),
      'duration': fields.float('Duration in Days', readonly=True, help="Number of days which will automatically count from the check-in and check-out date. "),
    }
    _defaults = {
      'name': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'hotel.folio'),
      'hotel_policy':'manual'
    }
    _sql_constraints = [
        ('check_in_out', 'CHECK (checkin_date<=checkout_date)', 'Check in Date Should be less than the Check Out Date!'),
    ]

    def _check_room_vacant(self, cr, uid, ids, context=None):
        folio = self.browse(cr, uid, ids[0], context=context)
        rooms = []
        for room in folio.room_lines:
            if room.product_id in rooms:
                return False
            rooms.append(room.product_id)
        return True

    _constraints = [
        (_check_room_vacant, 'You cannot allocate the same room twice!', ['room_lines'])
    ]

    def onchange_dates(self, cr, uid, ids, checkin_date=False, checkout_date=False, duration=False):
        # This mathod gives the duration between check in checkout if customer will leave only for some hour it would be considers as
        # a whole day. If customer will checkin checkout for more or equal hours , which configured in company as additional hours than
        # it would be consider as full day
        value = {}
        company_obj = self.pool.get('res.company')
        configured_addition_hours = 0
        company_ids = company_obj.search(cr, uid, [])
        if company_ids:
            company = company_obj.browse(cr, uid, company_ids[0])
            configured_addition_hours = company.additional_hours
        if not duration:
            duration = 0
            if checkin_date and checkout_date:
                chkin_dt = datetime.datetime.strptime(checkin_date, '%Y-%m-%d %H:%M:%S')
                chkout_dt = datetime.datetime.strptime(checkout_date, '%Y-%m-%d %H:%M:%S')
                dur = chkout_dt - chkin_dt
                duration = dur.days
                if configured_addition_hours > 0:
                    additional_hours = abs((dur.seconds / 60) / 60)
                    if additional_hours >= configured_addition_hours:
                        duration += 1
            value.update({'value':{'duration':duration}})
        else:
            if checkin_date:
                chkin_dt = datetime.datetime.strptime(checkin_date, '%Y-%m-%d %H:%M:%S')
                chkout_dt = chkin_dt + datetime.timedelta(days=duration)
                checkout_date = datetime.datetime.strftime(chkout_dt, '%Y-%m-%d %H:%M:%S')
                value.update({'value':{'checkout_date':checkout_date}})
        return value

    def create(self, cr, uid, vals, context=None, check=True):
        tmp_room_lines = vals.get('room_lines', [])
        vals['order_policy'] = vals.get('hotel_policy', 'manual')
        if not 'service_lines' and 'folio_id' in vals:
#             if not 'folio_id' in vals:
                vals.update({'room_lines':[]})
                folio_id = super(hotel_folio, self).create(cr, uid, vals, context=context)
                for line in (tmp_room_lines):
                    line[2].update({'folio_id':folio_id})
                vals.update({'room_lines':tmp_room_lines})
                super(hotel_folio, self).write(cr, uid, [folio_id], vals, context=context)
        else:
            folio_id = super(hotel_folio, self).create(cr, uid, vals, context=context)
        return folio_id

    def onchange_shop_id(self, cr, uid, ids, shop_id):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order').onchange_shop_id(cr, uid, order_ids, shop_id)

    def onchange_partner_id(self, cr, uid, ids, part, context=None):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids, context=context)]
        return self.pool.get('sale.order').onchange_partner_id(cr, uid, order_ids, part, context=None)

    def button_dummy(self, cr, uid, ids, context=None):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order').button_dummy(cr, uid, order_ids, context={})

    def action_invoice_create(self, cr, uid, ids, grouped=False, states=['confirmed', 'done']):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        invoice_id = self.pool.get('sale.order').action_invoice_create(cr, uid, order_ids, grouped=False, states=['confirmed', 'done'])
        for line in self.browse(cr, uid, ids):
            values = {  
                'invoiced': True,
                'state': 'progress' if grouped else 'progress',
            }
            line.write(values)
        return invoice_id

    def action_invoice_cancel(self, cr, uid, ids, context=None):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        res = self.pool.get('sale.order').action_invoice_cancel(cr, uid, order_ids, context=context)
        for sale in self.browse(cr, uid, ids, context=context):
            for line in sale.order_line:
                line.write({'invoiced': 'invoiced'})
        self.write(cr, uid, ids, {'state':'invoice_except'}, context=context)
        return res

    def action_cancel(self, cr, uid, ids, context=None):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids, context=context)]
        rv = self.pool.get('sale.order').action_cancel(cr, uid, order_ids, context=context)
        wf_service = netsvc.LocalService("workflow")
        for sale in self.browse(cr, uid, ids, context=context):
            for pick in sale.picking_ids:
                wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_cancel', cr)
            for invoice in sale.invoice_ids:
                wf_service.trg_validate(uid, 'account.invoice', invoice.id, 'invoice_cancel', cr)
                sale.write({'state':'cancel'})
        return rv

    def action_wait(self, cr, uid, ids, *args):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        res = self.pool.get('sale.order').action_wait(cr, uid, order_ids, *args)
        for order in self.browse(cr, uid, ids):
            state = ('progress', 'manual')[int(order.order_policy == 'manual' and not order.invoice_ids)]
            order.write({'state': state})
        return res

    def test_state(self, cr, uid, ids, mode, *args):
        write_done_ids = []
        write_cancel_ids = []
        res = self.pool.get('sale.order').test_state(cr, uid, ids, mode, *args)
        if write_done_ids:
            self.pool.get('sale.order.line').write(cr, uid, write_done_ids, {'state': 'done'})
        if write_cancel_ids:
            self.pool.get('sale.order.line').write(cr, uid, write_cancel_ids, {'state': 'cancel'})
        return res

    def procurement_lines_get(self, cr, uid, ids, *args):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order').procurement_lines_get(cr, uid, order_ids, *args)

    def action_ship_create(self, cr, uid, ids, context=None):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order').action_ship_create(cr, uid, order_ids, context=None)

    def action_ship_end(self, cr, uid, ids, context=None):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        res = self.pool.get('sale.order').action_ship_end(cr, uid, order_ids, context=context)
        for order in self.browse(cr, uid, ids, context=context):
            order.write ({'shipped':True})
        return res

#    def _log_event(self, cr, uid, ids, factor=0.7, name='Open Order'):
#        return self.pool.get('sale.order')._log_event(cr, uid, ids, factor=0.7, name='Open Order')

    def has_stockable_products(self, cr, uid, ids, *args):
        order_ids = [folio.order_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order').has_stockable_products(cr, uid, order_ids, *args)

#    def action_cancel_draft(self, cr, uid, ids, *args):
#        d = self.pool.get('sale.order').action_cancel(cr, uid, ids, *args)
#        self.write(cr, uid, ids, {'state':'draft', 'invoice_ids':[], 'shipped':0})
#        line.write({'invoiced':False, 'state':'draft', 'invoice_lines':[(6, 0, [])]})
#        return d

    def action_cancel_draft(self, cr, uid, ids, *args):
        if not len(ids):
            return False
        cr.execute('select id from sale_order_line where order_id IN %s and state=%s', (tuple(ids), 'cancel'))
        line_ids = map(lambda x: x[0], cr.fetchall())
        self.write(cr, uid, ids, {'state': 'draft', 'invoice_ids': [], 'shipped': 0})
        self.pool.get('sale.order.line').write(cr, uid, line_ids, {'invoiced': False, 'state': 'draft', 'invoice_lines': [(6, 0, [])]})
        wf_service = netsvc.LocalService("workflow")
        for inv_id in ids:
            # Deleting the existing instance of workflow for SO
            wf_service.trg_delete(uid, 'sale.order', inv_id, cr)
            wf_service.trg_create(uid, 'sale.order', inv_id, cr)
        for (id, name) in self.name_get(cr, uid, ids):
            message = _("The sales order '%s' has been set in draft state.") % (name,)
            self.log(cr, uid, id, message)
        return True

hotel_folio()


class hotel_folio_line(osv.Model):

    def copy(self, cr, uid, id, default=None, context=None):
        return self.pool.get('sale.order.line').copy(cr, uid, id, default=None, context=context)

#    def _amount_line_net(self, cr, uid, ids, field_name, arg, context):
#        return  self.pool.get('sale.order.line')._amount_line_net(cr, uid, ids, field_name, arg, context)

    def _amount_line(self, cr, uid, ids, field_name, arg, context):
        return self.pool.get('sale.order.line')._amount_line(cr, uid, ids, field_name, arg, context)

    def _number_packages(self, cr, uid, ids, field_name, arg, context):
        return self.pool.get('sale.order.line')._number_packages(cr, uid, ids, field_name, arg, context)

#    def _get_1st_packaging(self, cr, uid, context=None):
#        return  self.pool.get('sale.order.line')._get_1st_packaging(cr, uid, context=context)
    
    def _get_checkin_date(self, cr, uid, context=None):
        if 'checkin_date' in context:
            return context['checkin_date']
        return time.strftime('%Y-%m-%d %H:%M:%S')

    def _get_checkout_date(self, cr, uid, context=None):
        if 'checkin_date' in context:
            return context['checkout_date']
        return time.strftime('%Y-%m-%d %H:%M:%S')

    _name = 'hotel.folio.line'
    _description = 'hotel folio1 room line'
    _inherits = {'sale.order.line':'order_line_id'}
    _columns = {
        'order_line_id': fields.many2one('sale.order.line', 'Order Line', required=True, ondelete='cascade'),
        'folio_id': fields.many2one('hotel.folio', 'Folio', ondelete='cascade'),
        'checkin_date': fields.datetime('Check In', required=True),
        'checkout_date': fields.datetime('Check Out', required=True),
    }
    _defaults = {
        'checkin_date':_get_checkin_date,
        'checkout_date':_get_checkout_date,
    }

    def create(self, cr, uid, vals, context=None, check=True):
        if 'folio_id' in vals:
            folio = self.pool.get("hotel.folio").browse(cr, uid, vals['folio_id'], context=context)
            vals.update({'order_id':folio.order_id.id})
        return super(osv.Model, self).create(cr, uid, vals, context)

    def unlink(self, cr, uid, ids, context=None):
        sale_line_obj = self.pool.get('sale.order.line')
        for line in self.browse(cr, uid, ids, context=context):
            if line.order_line_id:
                sale_line_obj.unlink(cr, uid, [line.order_line_id.id], context=context)
        return super(hotel_folio_line, self).unlink(cr, uid, ids, context=None)

    def uos_change(self, cr, uid, ids, product_uos, product_uos_qty=0, product_id=None):
        line_ids = [folio.order_line_id.id for folio in self.browse(cr, uid, ids)]
        return  self.pool.get('sale.order.line').uos_change(cr, uid, line_ids, product_uos, product_uos_qty=0, product_id=None)

    def product_id_change(self, cr, uid, ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=False,
            lang=False, update_tax=True, date_order=False):
#        room_ids = self.pool.get("hotel.room").browse(self, cr, uid, ids)
        line_ids = [folio.order_line_id.id for folio in self.browse(cr, uid, ids)]
#        for room in room_ids:
#            for room_rent in room:
#                room_rent = room_rent.price
        return self.pool.get('sale.order.line').product_id_change(cr, uid, line_ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=partner_id,
            lang=False, update_tax=True, date_order=False)

    def product_uom_change(self, cursor, user, ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=False,
            lang=False, update_tax=True, date_order=False):
        return self.product_id_change(cursor, user, ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=partner_id,
            lang=False, update_tax=True, date_order=False)

    def on_change_checkout(self, cr, uid, ids, checkin_date=None, checkout_date=None, context=None):
        if not checkin_date:
            checkin_date = time.strftime('%Y-%m-%d %H:%M:%S')
        if not checkout_date:
            checkout_date = time.strftime('%Y-%m-%d %H:%M:%S')
        qty = 1
        if checkout_date < checkin_date:
            raise osv.except_osv(_('Error !'), _('Checkout must be greater or equal checkin date'))
        if checkin_date:
            diffDate = datetime.datetime(*time.strptime(checkout_date, '%Y-%m-%d %H:%M:%S')[:5]) - datetime.datetime(*time.strptime(checkin_date, '%Y-%m-%d %H:%M:%S')[:5])
            qty = diffDate.days
            if qty == 0:
                qty = 1
        return {'value':{'product_uom_qty':qty}}

    def button_confirm(self, cr, uid, ids, context=None):
        line_ids = [folio.order_line_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order.line').button_confirm(cr, uid, line_ids, context=context)

    def button_done(self, cr, uid, ids, context=None):
        line_ids = [folio.order_line_id.id for folio in self.browse(cr, uid, ids)]
        res = self.pool.get('sale.order.line').button_done(cr, uid, line_ids, context=context)
        wf_service = netsvc.LocalService("workflow")
        res = self.write(cr, uid, ids, {'state':'done'})
        for line in self.browse(cr, uid, ids, context):
            wf_service.trg_write(uid, 'sale.order', line.order_line_id.order_id.id, cr)
        return res

    def copy_data(self, cr, uid, id, default=None, context=None):
        line_id = self.browse(cr, uid, id).order_line_id.id
        return self.pool.get('sale.order.line').copy_data(cr, uid, line_id, default=None, context=context)

hotel_folio_line()


class hotel_service_line(osv.Model):

    def copy(self, cr, uid, id, default=None, context=None):
        line_id = self.browse(cr, uid, id).service_line_id.id
        return self.pool.get('sale.order.line').copy(cr, uid, line_id, default=None, context=context)

#    def _amount_line_net(self, cr, uid, ids, field_name, arg, context):
#        return  self.pool.get('sale.order.line')._amount_line_net(cr, uid, ids, field_name, arg, context)

    def _amount_line(self, cr, uid, ids, field_name, arg, context):
        line_ids = [folio.service_line_id.id for folio in self.browse(cr, uid, ids)]
        return  self.pool.get('sale.order.line')._amount_line(cr, uid, line_ids, field_name, arg, context)

    def _number_packages(self, cr, uid, ids, field_name, arg, context):
        line_ids = [folio.service_line_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order.line')._number_packages(cr, uid, line_ids, field_name, arg, context)

#    def _get_1st_packaging(self, cr, uid, context=None):
#        return  self.pool.get('sale.order.line')._get_1st_packaging(cr, uid, context=context)

    _name = 'hotel.service.line'
    _description = 'hotel Service line'
    _inherits = {'sale.order.line':'service_line_id'}
    _columns = {
        'service_line_id': fields.many2one('sale.order.line', 'Service Line', required=True, ondelete='cascade'),
        'folio_id': fields.many2one('hotel.folio', 'Folio', ondelete='cascade'),
    }

    def create(self, cr, uid, vals, context=None, check=True):
        if 'folio_id' in vals:
            folio = self.pool.get("hotel.folio").browse(cr, uid, vals['folio_id'], context=context)
            vals.update({'order_id':folio.order_id.id})
        return super(osv.Model, self).create(cr, uid, vals, context=context)

    def unlink(self, cr, uid, ids, context=None):
        sale_line_obj = self.pool.get('sale.order.line')
        for line in self.browse(cr, uid, ids, context=context):
            if line.service_line_id:
                sale_line_obj.unlink(cr, uid, [line.service_line_id.id], context=context)
        return super(hotel_service_line, self).unlink(cr, uid, ids, context=None)

    def product_id_change(self, cr, uid, ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=False,
            lang=False, update_tax=True, date_order=False):
        line_ids = [folio.service_line_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order.line').product_id_change(cr, uid, line_ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=partner_id,
            lang=False, update_tax=True, date_order=False)

    def product_uom_change(self, cursor, user, ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=False,
            lang=False, update_tax=True, date_order=False):
        return self.product_id_change(cursor, user, ids, pricelist, product, qty=0,
            uom=False, qty_uos=0, uos=False, name='', partner_id=partner_id,
            lang=False, update_tax=True, date_order=False)

    def on_change_checkout(self, cr, uid, ids, checkin_date=None, checkout_date=None, context=None):
        if not checkin_date:
            checkin_date = time.strftime('%Y-%m-%d %H:%M:%S')
        if not checkout_date:
            checkout_date = time.strftime('%Y-%m-%d %H:%M:%S')
        qty = 1
        if checkout_date < checkin_date:
            raise osv.except_osv(_('Error !'), _('Checkout must be greater or equal checkin date'))
        if checkin_date:
            diffDate = datetime.datetime(*time.strptime(checkout_date, '%Y-%m-%d %H:%M:%S')[:5]) - datetime.datetime(*time.strptime(checkin_date, '%Y-%m-%d %H:%M:%S')[:5])
            qty = diffDate.days
        return {'value':{'product_uom_qty':qty}}

    def button_confirm(self, cr, uid, ids, context=None):
        line_ids = [folio.service_line_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order.line').button_confirm(cr, uid, line_ids, context=context)

    def button_done(self, cr, uid, ids, context=None):
        line_ids = [folio.service_line_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order.line').button_done(cr, uid, line_ids, context=context)

    def uos_change(self, cr, uid, ids, product_uos, product_uos_qty=0, product_id=None):
        line_ids = [folio.service_line_id.id for folio in self.browse(cr, uid, ids)]
        return self.pool.get('sale.order.line').uos_change(cr, uid, line_ids, product_uos, product_uos_qty=0, product_id=None)

    def copy_data(self, cr, uid, id, default=None, context=None):
        line_id = self.browse(cr, uid, id).service_line_id.id
        return self.pool.get('sale.order.line').copy_data(cr, uid, line_id, default=default, context=context)

hotel_service_line()


class hotel_service_type(osv.Model):
    _name = "hotel.service.type"
    _inherits = {'product.category':'ser_id'}
    _description = "Service Type"
    _columns = {
        'ser_id':fields.many2one('product.category', 'category', required=True, select=True, ondelete='cascade'),
    }
    _defaults = {
        'isservicetype': 1,
    }

hotel_service_type()


class hotel_services(osv.Model):
    _name = 'hotel.services'
    _description = 'Hotel Services and its charges'
    _inherits = {'product.product':'service_id'}
    _columns = {
        'service_id': fields.many2one('product.product', 'Service_id', required=True, ondelete='cascade'),
    }
    _defaults = {
        'isservice': 1,
    }

hotel_services()


class res_company(osv.Model):
    _inherit = 'res.company'
    _columns = {
        'additional_hours': fields.integer('Additional Hours', help="Provide the min hours value for check in, checkout days, whatever the hours will be provided here based on that extra days will be calculated."),
    }

res_company()

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

 

---------------------------------------------------------------------------------------------------------------------------------

Above  mentioned  my code ,When I click on Room menu It shows this error

ProgrammingError: invalid reference to FROM-clause entry for table "product_product" LINE 5: ...("hotel_room__product_id"."active" = 'True') AND ("product_p... ^ HINT: Perhaps you meant to reference the table alias "hotel_room__product_id".

0
Avatar
Vazgeç
René Schuster

Is it possible that the double underscore in hotel_room__product_id is a typo?

Ivan

I see a lot of columns defined in the _defaults but not in _column. Perhaps you can amend that first. Samples are isamenitype, isroom, rental, etc.

Avatar
easy
En İyi Yanıt

Dear all,

it a SQL error compare table with alias table Level 3 joints

To resolve it i apply the fix issue from emiprotechnologies (on github)

[Fix] to manage multi level of _inherits structure. 

inside openerp/models.py and test_inherits.py

work well for me.

Regards all

0
Avatar
Vazgeç
Enjoying the discussion? Don't just read, join in!

Create an account today to enjoy exclusive features and engage with our awesome community!

Üye Ol
Topluluk
  • Eğitim Araçları
  • Dokümantasyon
  • Forum
Açık Kaynak
  • İndirin
  • Github
  • Runbot
  • Çeviriler
Hizmetler
  • Odoo.sh Hosting
  • Destek
  • Sürüm Yükseltme
  • Özel Geliştirmeler
  • Eğitim
  • Muhasebeci Bulun
  • Partner Bulun
  • Partner Olun
Hakkında
  • Şirketimiz
  • Pazarlama Gereçleri
  • İletişim
  • Kariyer
  • Etkinlikler
  • Podcast
  • Blog
  • Müşteriler
  • Hukuki • Gizlilik
  • Güvenlik
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español Svenska ภาษาไทย Türkçe українська Tiếng Việt

Odoo, müşteri ilişkileri yönetimi, eTicaret, muhasebe, envanter, satış noktası, proje yönetimi gibi şirketinizin tüm ihtiyaçlarını karşılayan bir açık kaynak işletme uygulamaları paketidir.

Odoo’nun eşsiz değer önermesi, aynı anda hem kullanımının çok kolay olup hem de tamamen entegre olmasıdır.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now