110 lines
4.2 KiB
Python
110 lines
4.2 KiB
Python
from odoo import models, fields, api, _
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SaleOrderOnline(models.Model):
|
|
_inherit = 'sale.order'
|
|
|
|
pos_order_id = fields.Many2one(
|
|
'pos.order', string='POS Order',
|
|
help='The POS order created from this website sale order'
|
|
)
|
|
|
|
# order_source is now canonical field from dine360_order_channels (pos.order)
|
|
# We add it to sale.order for tracking which channel the web sale originated from
|
|
order_source = fields.Selection([
|
|
('online', 'Online'),
|
|
('phone', 'Phone'),
|
|
('whatsapp', 'WhatsApp'),
|
|
('social_media', 'Social Media'),
|
|
('in_person', 'In-Person (Walk-in/Dine-in)'),
|
|
('kiosk', 'Store Self-Order (Kiosk)'),
|
|
('party_order', 'Party Order'),
|
|
('platform_integration', 'Platform Integration (3rd Party)'),
|
|
], string='Order Source', default='online', tracking=True)
|
|
|
|
fulfilment_type = fields.Selection([
|
|
('pickup', 'Pickup'),
|
|
('delivery', 'Delivery'),
|
|
('dine_in', 'Dine-In'),
|
|
('walk_in', 'Walk-In'),
|
|
], string='Fulfillment Type', default='pickup', tracking=True)
|
|
|
|
payment_option = fields.Selection([
|
|
('in_store', 'In Store'),
|
|
('terminal_in_store', 'Payment Terminal (In Store)'),
|
|
('terminal_customer', 'Payment Terminal (Customer Place)'),
|
|
('online_gateway', 'Online Payment Gateway'),
|
|
('cash', 'Cash'),
|
|
('interac', 'Interac'),
|
|
], string='Payment Option', tracking=True)
|
|
|
|
telephone_number = fields.Char('Telephone Number')
|
|
|
|
reservation_source = fields.Selection([
|
|
('online', 'Online'),
|
|
('phone', 'Phone'),
|
|
('staff', 'Staff'),
|
|
], string='Reservation Source', tracking=True)
|
|
|
|
reservation_status = fields.Selection([
|
|
('draft', 'Request Received'),
|
|
('confirmed', 'Confirmed'),
|
|
('arrived', 'Arrived'),
|
|
('seated', 'Seated'),
|
|
('cancelled', 'Cancelled'),
|
|
], string='Reservation Status', default='draft', tracking=True)
|
|
|
|
def _create_pos_order_for_kds(self, sale_order):
|
|
"""
|
|
Override from dine360_kds to also mark the POS order as an online order.
|
|
This method is called by dine360_kds.website_sale_integration when a
|
|
website sale order is confirmed.
|
|
"""
|
|
# Let the parent create the POS order
|
|
super(SaleOrderOnline, self)._create_pos_order_for_kds(sale_order)
|
|
|
|
# Now find the POS order that was just created and mark it
|
|
# We look for the most recent POS order linked to this sale order's partner
|
|
# with the note containing the sale order name
|
|
PosOrder = self.env['pos.order']
|
|
pos_order = PosOrder.search([
|
|
('note', 'like', sale_order.name),
|
|
], order='id desc', limit=1)
|
|
|
|
if pos_order:
|
|
pos_order.write({
|
|
'is_online_order': True,
|
|
'online_order_status': 'pending',
|
|
'sale_order_id': sale_order.id,
|
|
'online_order_date': fields.Datetime.now(),
|
|
'order_source': sale_order.order_source or 'online',
|
|
'fulfilment_type': sale_order.fulfilment_type or 'pickup',
|
|
})
|
|
|
|
# Link back to sale order
|
|
sale_order.write({'pos_order_id': pos_order.id})
|
|
|
|
# Set all lines to a "hold" state - they will go to KDS only when cashier confirms
|
|
for line in pos_order.lines:
|
|
if line.product_id.is_kitchen_item:
|
|
line.write({'preparation_status': 'waiting'})
|
|
|
|
# Send bus notification to POS
|
|
if pos_order.config_id:
|
|
channel = "online_orders_%s" % pos_order.config_id.id
|
|
self.env['bus.bus']._sendone(channel, 'new_online_order', {
|
|
'order_id': pos_order.id,
|
|
'order_name': pos_order.pos_reference or pos_order.name,
|
|
'customer_name': sale_order.partner_id.name or 'Guest',
|
|
'amount_total': pos_order.amount_total,
|
|
'items_count': len(pos_order.lines),
|
|
})
|
|
|
|
_logger.info(
|
|
"Marked POS Order %s as online order from Sale Order %s",
|
|
pos_order.name, sale_order.name
|
|
)
|