Add online order status management and backend views for online orders

This commit is contained in:
Alaguraj0361 2026-06-11 17:32:36 +05:30
parent 6256ebd13d
commit c08a25d536
5 changed files with 94 additions and 7 deletions

View File

@ -21,12 +21,6 @@
'views/backend_online_orders.xml', 'views/backend_online_orders.xml',
], ],
'assets': { 'assets': {
'point_of_sale._assets_pos': [
'dine360_online_orders/static/src/css/online_orders.css',
'dine360_online_orders/static/src/js/online_orders_screen.js',
'dine360_online_orders/static/src/js/online_orders_navbar.js',
'dine360_online_orders/static/src/xml/online_orders_screen.xml',
],
'web.assets_frontend': [ 'web.assets_frontend': [
'dine360_online_orders/static/src/css/service_mode.css', 'dine360_online_orders/static/src/css/service_mode.css',
'dine360_online_orders/static/src/js/service_mode.js', 'dine360_online_orders/static/src/js/service_mode.js',

View File

@ -13,7 +13,7 @@ class PosOrder(models.Model):
help='Indicates this order came from the website shop' help='Indicates this order came from the website shop'
) )
online_order_status = fields.Selection([ online_order_status = fields.Selection([
('pending', 'Pending'), ('pending', 'Pending Kitchen'),
('confirmed', 'Confirmed'), ('confirmed', 'Confirmed'),
('rejected', 'Rejected'), ('rejected', 'Rejected'),
], string='Online Order Status', default='pending') ], string='Online Order Status', default='pending')

View File

@ -39,6 +39,60 @@ class SaleOrderOnline(models.Model):
return False return False
return res return res
online_order_status = fields.Selection([
('pending', 'Pending Kitchen'),
('confirmed', 'Confirmed'),
('rejected', 'Rejected'),
], string='Online Order Status', compute='_compute_online_order_status', store=True)
is_online_order_accepted_manually = fields.Boolean(string='Manually Accepted', default=False)
@api.depends('pos_order_id.online_order_status', 'state', 'order_source', 'is_online_order_accepted_manually')
def _compute_online_order_status(self):
for order in self:
if order.pos_order_id:
order.online_order_status = order.pos_order_id.online_order_status
elif order.state == 'cancel':
order.online_order_status = 'rejected'
elif order.order_source == 'online' and order.state in ['draft', 'sent', 'sale']:
if order.is_online_order_accepted_manually:
order.online_order_status = 'confirmed'
else:
order.online_order_status = 'pending'
else:
order.online_order_status = False
def action_accept_online_order(self):
for order in self:
if order.state in ['draft', 'sent']:
order.action_confirm()
if not order.pos_order_id and order.state == 'sale':
try:
if hasattr(order, '_create_pos_order_for_kds'):
order._create_pos_order_for_kds(order)
except Exception as e:
_logger.error("Failed to create POS order during accept: %s", str(e))
if order.pos_order_id:
order.pos_order_id.action_confirm_online_order()
else:
order.is_online_order_accepted_manually = True
order._compute_online_order_status()
return {'type': 'ir.actions.client', 'tag': 'reload'}
def action_reject_online_order(self):
for order in self:
if order.state in ['draft', 'sent', 'sale']:
order._action_cancel()
if order.pos_order_id:
order.pos_order_id.action_reject_online_order()
order._compute_online_order_status()
return {'type': 'ir.actions.client', 'tag': 'reload'}
def _check_cart_is_ready_to_be_paid(self): def _check_cart_is_ready_to_be_paid(self):
try: try:
return super(SaleOrderOnline, self)._check_cart_is_ready_to_be_paid() return super(SaleOrderOnline, self)._check_cart_is_ready_to_be_paid()

View File

@ -2,11 +2,47 @@
<odoo> <odoo>
<data> <data>
<!-- Tree View specifically for Online Orders -->
<record id="view_backend_online_order_tree" model="ir.ui.view">
<field name="name">sale.order.online.tree</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<tree string="Online Orders" decoration-info="online_order_status == 'pending'" decoration-success="online_order_status == 'confirmed'" decoration-muted="online_order_status == 'rejected'" create="false">
<field name="name" string="Order Number"/>
<field name="date_order" string="Order Date"/>
<field name="partner_id" string="Customer"/>
<field name="amount_total" string="Total"/>
<field name="online_order_status" string="Status" widget="badge" decoration-info="online_order_status == 'pending'" decoration-success="online_order_status == 'confirmed'" decoration-danger="online_order_status == 'rejected'"/>
<button name="action_accept_online_order" string="Accept" type="object" class="btn-success" invisible="online_order_status != 'pending'"/>
<button name="action_reject_online_order" string="Reject" type="object" class="btn-danger" invisible="online_order_status != 'pending'"/>
<field name="state" column_invisible="1"/>
</tree>
</field>
</record>
<!-- Form View override for Online Orders buttons -->
<record id="view_order_form_online_orders" model="ir.ui.view">
<field name="name">sale.order.form.online</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<field name="order_source" invisible="1"/>
<button name="action_accept_online_order" string="Accept Online Order" type="object" class="btn-success" invisible="order_source != 'online' or online_order_status != 'pending'"/>
<button name="action_reject_online_order" string="Reject Online Order" type="object" class="btn-danger" invisible="order_source != 'online' or online_order_status != 'pending'"/>
</xpath>
<xpath expr="//field[@name='payment_term_id']" position="after">
<field name="online_order_status" invisible="order_source != 'online'" readonly="1" widget="badge" decoration-info="online_order_status == 'pending'" decoration-success="online_order_status == 'confirmed'" decoration-danger="online_order_status == 'rejected'"/>
</xpath>
</field>
</record>
<!-- Action to open Online Orders (Sale Orders from website) --> <!-- Action to open Online Orders (Sale Orders from website) -->
<record id="action_backend_online_orders" model="ir.actions.act_window"> <record id="action_backend_online_orders" model="ir.actions.act_window">
<field name="name">Online Orders</field> <field name="name">Online Orders</field>
<field name="res_model">sale.order</field> <field name="res_model">sale.order</field>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field> <field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field name="view_id" ref="view_backend_online_order_tree"/>
<field name="domain">[('order_source', '=', 'online')]</field> <field name="domain">[('order_source', '=', 'online')]</field>
<field name="context">{'default_order_source': 'online'}</field> <field name="context">{'default_order_source': 'online'}</field>
<field name="help" type="html"> <field name="help" type="html">

3
check_so.py Normal file
View File

@ -0,0 +1,3 @@
so = env['sale.order'].search([('name','=','S00001')])
print("STATE:", so.state)
print("POS ORDER:", so.pos_order_id)