[IMP] lunch: view improvement of previous orders.
Purpose: 1/ In the lunch app, previous orders list: the products are not displayed. It is written X Records but you don't see the products name. Therefore the information is useless. 2/ It is dangerous to be able to delete a previous order that has been received (it changes the lunch account amount) What is done: In Previous Orders list : - The view should be based on the sales orders lines. In that case, each line = 1 product. - add a note column (between product and status) - add a user column (between status and total) - Rename Total into Price - If order.line status = ordered or received, it shouldn't be possible to delete it. An ir.rule has been added to achieve this. - An additional group access right check is made in the actions 'confirm' 'cancel' and 'order' because they can be called in batch under the Action button.
This commit is contained in:
committed by
Yannick Tivisse
parent
6db140d5d6
commit
54245deebd
@@ -156,32 +156,41 @@ class LunchOrderLine(models.Model):
|
||||
"""
|
||||
The order_line is ordered to the vendor but isn't received yet
|
||||
"""
|
||||
self.state = 'ordered'
|
||||
if self.user_has_groups("lunch.group_lunch_manager"):
|
||||
self.state = 'ordered'
|
||||
else:
|
||||
raise AccessError(_("Only your lunch manager processes the orders."))
|
||||
|
||||
@api.one
|
||||
def confirm(self):
|
||||
"""
|
||||
confirm one or more order line, update order status and create new cashmove
|
||||
"""
|
||||
if self.state != 'confirmed':
|
||||
values = {
|
||||
'user_id': self.user_id.id,
|
||||
'amount': -self.price,
|
||||
'description': self.product_id.name,
|
||||
'order_id': self.id,
|
||||
'state': 'order',
|
||||
'date': self.date,
|
||||
}
|
||||
if self.user_has_groups("lunch.group_lunch_manager"):
|
||||
if self.state != 'confirmed':
|
||||
values = {
|
||||
'user_id': self.user_id.id,
|
||||
'amount': -self.price,
|
||||
'description': self.product_id.name,
|
||||
'order_id': self.id,
|
||||
'state': 'order',
|
||||
'date': self.date,
|
||||
}
|
||||
self.env['lunch.cashmove'].create(values)
|
||||
self.state = 'confirmed'
|
||||
else:
|
||||
raise AccessError(_("Only your lunch manager sets the orders as received."))
|
||||
|
||||
@api.one
|
||||
def cancel(self):
|
||||
"""
|
||||
cancel one or more order.line, update order status and unlink existing cashmoves
|
||||
"""
|
||||
self.state = 'cancelled'
|
||||
self.cashmove.unlink()
|
||||
if self.user_has_groups("lunch.group_lunch_manager"):
|
||||
self.state = 'cancelled'
|
||||
self.cashmove.unlink()
|
||||
else:
|
||||
raise AccessError(_("Only your lunch manager cancels the orders."))
|
||||
|
||||
|
||||
class LunchProduct(models.Model):
|
||||
|
||||
@@ -32,4 +32,14 @@
|
||||
<field name="groups" eval="[(4, ref('group_lunch_manager'))]"/>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
</record>
|
||||
<record id="lunch_order_line_rule_delete" model="ir.rule">
|
||||
<field name="name">lunch.order.line: Only new and cancelled order lines deleted.</field>
|
||||
<field name="model_id" ref="lunch.model_lunch_order_line"/>
|
||||
<field name="domain_force">[('state', 'in', ('new', 'cancelled'))]</field>
|
||||
<field name="perm_read" eval="0"/>
|
||||
<field name="perm_write" eval="0"/>
|
||||
<field name="perm_create" eval="0"/>
|
||||
<field name="perm_unlink" eval="1" />
|
||||
<field name="groups" eval="[(4,ref('lunch.group_lunch_user'))]"/>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
<field name="model">lunch.order.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search">
|
||||
<filter name='is_mine' string="My Orders" domain="[('user_id','=',uid)]"/>
|
||||
<separator/>
|
||||
<field name="name" filter_domain="['|', ('name', 'ilike', self), ('note', 'ilike', self)]"/>
|
||||
<filter name="not_confirmed" string="Not Received" domain="[('state','!=',('confirmed'))]"/>
|
||||
<filter name="confirmed" string="Received" domain="[('state','=','confirmed')]"/>
|
||||
@@ -20,6 +22,7 @@
|
||||
<filter name="today" string="Today" domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"/>
|
||||
<field name="user_id"/>
|
||||
<group expand="0" string="Group By">
|
||||
<filter name="group_by_order_id" string="By Order" context="{'group_by':'order_id'}"/>
|
||||
<filter name="group_by_supplier" string="By Vendor" context="{'group_by':'supplier'}"/>
|
||||
<filter name="group_by_date" string="Order Month" context="{'group_by':'date'}" help="Vendor Orders by Month"/>
|
||||
</group>
|
||||
@@ -57,26 +60,6 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!--View search for order-->
|
||||
<record id="lunch_order_view_search" model="ir.ui.view">
|
||||
<field name='name'>lunch.order.search</field>
|
||||
<field name='model'>lunch.order</field>
|
||||
<field name='arch' type='xml'>
|
||||
<search string="lunch orders">
|
||||
<field name="user_id"/>
|
||||
<field name="date"/>
|
||||
<field name="order_line_ids"/>
|
||||
<filter name='is_mine' string="My Orders" domain="[('user_id','=',uid)]"/>
|
||||
<separator/>
|
||||
<filter name="new" string="New" domain="[('state','=','new')]"/>
|
||||
<filter name="received" string="Received" domain="[('state','=','confirmed')]"/>
|
||||
<filter name="cancelled" string="Cancelled" domain="[('state','=','cancelled')]"/>
|
||||
<filter name='by_users' string="Users" context="{'group_by':'user_id'}"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="lunch_alert_view_search" model="ir.ui.view">
|
||||
<field name="name">lunch.alert.search</field>
|
||||
<field name="model">lunch.alert</field>
|
||||
@@ -129,24 +112,19 @@
|
||||
</record>
|
||||
<menuitem name="New Order" parent="menu_lunch_title" id="lunch_order_menu_form" action="lunch_order_action_form" sequence="1"/>
|
||||
|
||||
<record id="lunch_order_action_tree" model="ir.actions.act_window">
|
||||
<record id="lunch_order_line_action" model="ir.actions.act_window">
|
||||
<field name="name">Your Orders</field>
|
||||
<field name="res_model">lunch.order</field>
|
||||
<field name="res_model">lunch.order.line</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="search_view_id" ref="lunch_order_view_search"/>
|
||||
<field name="context">{"search_default_is_mine":1, "search_default_received":1}</field>
|
||||
<field name="search_view_id" ref="lunch_order_line_view_search"/>
|
||||
<field name="context">{"search_default_is_mine":1}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a lunch order.
|
||||
</p>
|
||||
<p>
|
||||
A lunch order is defined by its user, date and order lines.
|
||||
Each order line corresponds to a product, an additional note and a price.
|
||||
Before selecting your order lines, don't forget to read the warnings displayed in the reddish area.
|
||||
There is no previous order recorded. Click on "My Lunch" and then create a new lunch order.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
<menuitem name="Previous Orders" parent="menu_lunch_title" id="lunch_order_menu_tree" action="lunch_order_action_tree" sequence="2"/>
|
||||
<menuitem name="Previous Orders" parent="menu_lunch_title" id="lunch_order_menu_tree" action="lunch_order_line_action" sequence="2"/>
|
||||
|
||||
<record id="lunch_cashmove_view_tree_2" model="ir.ui.view">
|
||||
<field name="name">lunch.cashmove.tree</field>
|
||||
@@ -334,15 +312,15 @@
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Order lines Tree" create="false" edit="false">
|
||||
<field name='date'/>
|
||||
<field name='user_id'/>
|
||||
<field name='supplier' invisible='1'/>
|
||||
<field name='product_id'/>
|
||||
<field name='note'/>
|
||||
<field name='state'/>
|
||||
<field name='price' sum="Total"/>
|
||||
<button name="order" string="Order" type="object" icon="terp-call-start" attrs="{'invisible': ['|',('state','=','confirmed'),('state','=','ordered')]}"/>
|
||||
<button name="confirm" string="Receive" type="object" icon="gtk-apply" attrs="{'invisible': [('state','!=','ordered')]}"/>
|
||||
<button name="cancel" string="Cancel" type="object" icon="gtk-cancel" attrs="{'invisible': [('state','=','cancelled')]}"/>
|
||||
<field name='user_id'/>
|
||||
<field name='price' sum="Total" string="Price"/>
|
||||
<button name="order" string="Order" type="object" icon="terp-call-start" attrs="{'invisible': ['|',('state','=','confirmed'),('state','=','ordered')]}" groups="lunch.group_lunch_manager"/>
|
||||
<button name="confirm" string="Receive" type="object" icon="gtk-apply" attrs="{'invisible': [('state','!=','ordered')]}" groups="lunch.group_lunch_manager"/>
|
||||
<button name="cancel" string="Cancel" type="object" icon="gtk-cancel" attrs="{'invisible': [('state','=','cancelled')]}" groups="lunch.group_lunch_manager"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
Reference in New Issue
Block a user