[IMP]Lunch

bzr revid: api@openerp.com-20121026125808-qkwdewnqhiutw5av
This commit is contained in:
Arnaud Pineux 2012-10-26 14:58:08 +02:00
parent f670069ad9
commit 2cd1b9845c
12 changed files with 135 additions and 119 deletions

View File

@ -20,5 +20,5 @@
############################################################################## ##############################################################################
import lunch import lunch
import partner import report
import report import wizard

View File

@ -32,8 +32,7 @@ The base module to manage lunch.
keep track for the Lunch Order, Cash Moves and Product. Apply Different keep track for the Lunch Order, Cash Moves and Product. Apply Different
Category for the product. Category for the product.
""", """,
#TODO: remove `view´ folder. what's the use of partner_view.xml? what about lunch_validation_view.xml and lunch_cancel_view.xml? Couldn't that be merged in a single file? 'data': ['security/groups.xml','lunch_view.xml','wizard/lunch_validation_view.xml','wizard/lunch_cancel_view.xml','lunch_report.xml',
'data': ['security/groups.xml','view/lunch_view.xml','view/partner_view.xml','view/lunch_validation_view.xml','view/lunch_cancel_view.xml','lunch_report.xml',
'report/report_lunch_order_view.xml', 'report/report_lunch_order_view.xml',
'security/ir.model.access.csv',], 'security/ir.model.access.csv',],
'css':['static/src/css/lunch_style.css'], 'css':['static/src/css/lunch_style.css'],

View File

@ -37,12 +37,20 @@ class lunch_order(osv.Model):
result={} result={}
for order in self.browse(cr, uid, ids, context=context): for order in self.browse(cr, uid, ids, context=context):
value = 0.0 value = 0.0
for product in order.products: #TODO: use meaningful variable names `for order_line in ...´ for product in order.order_line_ids: #TODO: use meaningful variable names `for order_line in ...´
if product.state != 'cancelled': if product.state != 'cancelled':
value += product.product.price value += product.product.price
result[order.id]=value result[order.id]=value
return result return result
def _compute_total(self, cr, uid, ids, name, context=None):
""" compute total"""
result= {}
value = 0.0
for order_line in self.browse(cr, uid, ids, context=context):
value+=order_line.price
result[order_line.order_id.id]=value
return result
def add_preference(self, cr, uid, ids, pref_id, context=None): def add_preference(self, cr, uid, ids, pref_id, context=None):
""" create a new order line based on the preference selected (pref_id)""" """ create a new order line based on the preference selected (pref_id)"""
@ -62,12 +70,7 @@ class lunch_order(osv.Model):
'supplier': prod_ref.browse(cr,uid,pref["product"].id,context=context)['supplier'].id 'supplier': prod_ref.browse(cr,uid,pref["product"].id,context=context)['supplier'].id
} }
new_id = orderline_ref.create(cr,uid,new_order_line) new_id = orderline_ref.create(cr,uid,new_order_line)
order.products.append(new_id) order.order_line_ids.append(new_id)
#TODO: total is a computed field, so the write is useless, no?
# ---> If I remove it, the total for order are not good (I try many times)
# use store = {...}
total = self._price_get(cr,uid,ids," "," ",context=context)
self.write(cr,uid,ids,{},context)
return True return True
def _alerts_get(self, cr, uid, ids, name, arg, context=None): def _alerts_get(self, cr, uid, ids, name, arg, context=None):
@ -127,7 +130,7 @@ class lunch_order(osv.Model):
def _default_alerts_get(self,cr,uid,arg,context=None): def _default_alerts_get(self,cr,uid,arg,context=None):
""" get the alerts to display on the order form """ """ get the alerts to display on the order form """
alert_ref = self.pool.get('lunch.alert') alert_ref = self.pool.get('lunch.alert')
alert_ids = alert_ref.search(cr,uid,[('active','=',True)],context=context) #TODO: active=True is automatically added by orm, so this param can be removed alert_ids = alert_ref.search(cr,uid,[('lunch_active','=',True)],context=context)
alert_msg="" alert_msg=""
for alert in alert_ref.browse(cr,uid,alert_ids,context=context): for alert in alert_ref.browse(cr,uid,alert_ids,context=context):
if self.can_display_alert(alert): if self.can_display_alert(alert):
@ -155,12 +158,12 @@ class lunch_order(osv.Model):
alert_msg+='\n' alert_msg+='\n'
return alert_msg return alert_msg
def onchange_price(self,cr,uid,ids,products,context=None): def onchange_price(self,cr,uid,ids,order_line_ids,context=None):
""" Onchange methode that refresh the total price of order""" """ Onchange methode that refresh the total price of order"""
res = {'value':{'total':0.0}} res = {'value':{'total':0.0}}
if products: if order_line_ids:
tot = 0.0 tot = 0.0
for prod in products: for prod in order_line_ids:
orderline = {} orderline = {}
#TODO: that's weird. should truy to find another way to compute total on order lines when record is not saved... #TODO: that's weird. should truy to find another way to compute total on order lines when record is not saved...
# or at least put some comments # or at least put some comments
@ -179,8 +182,8 @@ class lunch_order(osv.Model):
prod_ref = self.pool.get('lunch.product') prod_ref = self.pool.get('lunch.product')
new_id = super(lunch_order, self).create(cr, uid, values, context=context) new_id = super(lunch_order, self).create(cr, uid, values, context=context)
#When we create a new order we also create new preference #When we create a new order we also create new preference
if len(values['products'])>0 and values['user_id']==uid: if len(values['order_line_ids'])>0 and values['user_id']==uid:
for prods in values['products']: for prods in values['order_line_ids']:
already_exists = False #alreadyexist is used to check if a preferece already exists. already_exists = False #alreadyexist is used to check if a preferece already exists.
for pref in pref_ref.browse(cr,uid,pref_ids,context=context): for pref in pref_ref.browse(cr,uid,pref_ids,context=context):
if pref['product'].id == prods[2]['product']: if pref['product'].id == prods[2]['product']:
@ -264,8 +267,10 @@ class lunch_order(osv.Model):
_columns = { _columns = {
'user_id' : fields.many2one('res.users','User Name',required=True,readonly=True, states={'new':[('readonly', False)]}), 'user_id' : fields.many2one('res.users','User Name',required=True,readonly=True, states={'new':[('readonly', False)]}),
'date': fields.date('Date', required=True,readonly=True, states={'new':[('readonly', False)]}), 'date': fields.date('Date', required=True,readonly=True, states={'new':[('readonly', False)]}),
'products' : fields.one2many('lunch.order.line','order_id','Products',ondelete="cascade",readonly=True,states={'new':[('readonly', False)]}), #TODO: a good naming convention is to finish your field names with `_ids´ for *2many fields. BTW, the field name should reflect more it's nature: `order_line_ids´ for example 'order_line_ids' : fields.one2many('lunch.order.line','order_id','Products',ondelete="cascade",readonly=True,states={'new':[('readonly', False)]}), #TODO: a good naming convention is to finish your field names with `_ids´ for *2many fields. BTW, the field name should reflect more it's nature: `order_line_ids´ for example
'total' : fields.function(_price_get, string="Total",store=True), 'total' : fields.function(_price_get, string="Total",store={
'lunch.order.line': (_compute_total, ['price'], 20),
}),
'state': fields.selection([('new', 'New'),('confirmed','Confirmed'), ('cancelled','Cancelled'), ('partially','Partially Confirmed')],'Status', readonly=True, select=True), #TODO: parcially? #TODO: the labels are confusing. confirmed=='received' or 'delivered'... 'state': fields.selection([('new', 'New'),('confirmed','Confirmed'), ('cancelled','Cancelled'), ('partially','Partially Confirmed')],'Status', readonly=True, select=True), #TODO: parcially? #TODO: the labels are confusing. confirmed=='received' or 'delivered'...
'alerts': fields.function(_alerts_get, string="Alerts", type='text'), 'alerts': fields.function(_alerts_get, string="Alerts", type='text'),
'preferences': fields.many2many("lunch.preference",'lunch_preference_rel','preferences','order_id','Preferences'), 'preferences': fields.many2many("lunch.preference",'lunch_preference_rel','preferences','order_id','Preferences'),
@ -313,7 +318,7 @@ class lunch_order_line(osv.Model):
self.write(cr,uid,[order_line.id],{'cashmove':[('0',new_id)], 'state':'confirmed'},context) self.write(cr,uid,[order_line.id],{'cashmove':[('0',new_id)], 'state':'confirmed'},context)
for order_line in self.browse(cr,uid,ids,context=context): for order_line in self.browse(cr,uid,ids,context=context):
isconfirmed = True isconfirmed = True
for product in order_line.order_id.products: for product in order_line.order_id.order_line_ids:
if product.state == 'new': if product.state == 'new':
isconfirmed = False isconfirmed = False
if product.state == 'cancelled': if product.state == 'cancelled':
@ -334,7 +339,7 @@ class lunch_order_line(osv.Model):
for order_line in self.browse(cr,uid,ids,context=context): for order_line in self.browse(cr,uid,ids,context=context):
hasconfirmed = False hasconfirmed = False
hasnew = False hasnew = False
for product in order_line.order_id.products: for product in order_line.order_id.order_line_ids:
if product.state=='confirmed': if product.state=='confirmed':
hasconfirmed= True hasconfirmed= True
if product.state=='new': if product.state=='new':
@ -427,7 +432,7 @@ class lunch_alert(osv.Model):
_description = 'lunch alert' _description = 'lunch alert'
_columns = { _columns = {
'message' : fields.text('Message',size=256, required=True), 'message' : fields.text('Message',size=256, required=True),
'active' : fields.boolean('Active'), 'lunch_active' : fields.boolean('Active'),
'day' : fields.selection([('specific','Specific day'), ('week','Every Week'), ('days','Every Day')], 'Recurrency'), 'day' : fields.selection([('specific','Specific day'), ('week','Every Week'), ('days','Every Day')], 'Recurrency'),
'specific' : fields.date('Day'), 'specific' : fields.date('Day'),
'monday' : fields.boolean('Monday'), 'monday' : fields.boolean('Monday'),
@ -441,61 +446,8 @@ class lunch_alert(osv.Model):
'active_to': fields.float('And',required=True), 'active_to': fields.float('And',required=True),
} }
class lunch_cancel(osv.Model): class res_partner (osv.Model):
""" lunch cancel """ _inherit = 'res.partner'
_name = 'lunch.cancel' _columns = {
_description = 'cancel lunch order' 'supplier_lunch': fields.boolean('Lunch Supplier'),
}
def cancel(self,cr,uid,ids,context=None):
#confirm one or more order.line, update order status and create new cashmove
cashmove_ref = self.pool.get('lunch.cashmove')
order_lines_ref = self.pool.get('lunch.order.line')
orders_ref = self.pool.get('lunch.order')
order_ids = context.get('active_ids', [])
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
order_lines_ref.write(cr,uid,[order.id],{'state':'cancelled'},context)
for cash in order.cashmove:
cashmove_ref.unlink(cr,uid,cash.id,context)
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
hasconfirmed = False
hasnew = False
for product in order.order_id.products:
if product.state=='confirmed':
hasconfirmed= True
if product.state=='new':
hasnew= True
if hasnew == False:
if hasconfirmed == False:
orders_ref.write(cr,uid,[order.order_id.id],{'state':'cancelled'},context)
return {}
orders_ref.write(cr,uid,[order.order_id.id],{'state':'partially'},context)
return {}
class lunch_validation(osv.Model):
""" lunch validation """
_name = 'lunch.validation'
_description = 'lunch validation for order'
def confirm(self,cr,uid,ids,context=None):
#confirm one or more order.line, update order status and create new cashmove
cashmove_ref = self.pool.get('lunch.cashmove')
order_lines_ref = self.pool.get('lunch.order.line')
orders_ref = self.pool.get('lunch.order')
order_ids = context.get('active_ids', [])
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
if order.state!='confirmed':
new_id = cashmove_ref.create(cr,uid,{'user_id': order.user_id.id, 'amount':0 - order.price,'description':order.product.name, 'order_id':order.id, 'state':'order', 'date':order.date})
order_lines_ref.write(cr,uid,[order.id],{'cashmove':[('0',new_id)], 'state':'confirmed'},context)
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
isconfirmed = True
for product in order.order_id.products:
if product.state == 'new':
isconfirmed = False
if product.state == 'cancelled':
isconfirmed = False
orders_ref.write(cr,uid,[order.order_id.id],{'state':'partially'},context)
if isconfirmed == True:
orders_ref.write(cr,uid,[order.order_id.id],{'state':'confirmed'},context)
return {}

View File

@ -110,28 +110,25 @@
<record model="lunch.order" id="order_1"> <record model="lunch.order" id="order_1">
<field name="user_id" ref="base.user_root"/> <field name="user_id" ref="base.user_root"/>
<field name="date" eval="time.strftime('2012-10-23')"/> <field name="date" eval="time.strftime('2012-10-23')"/>
<field name="products" eval="[]"/> <field name="order_line_ids" eval="[]"/>
<field name="state">new</field> <field name="state">new</field>
<field name='company_id'>1</field> <field name='company_id'>1</field>
<field name='total'>7.70</field>
</record> </record>
<record model="lunch.order" id="order_2"> <record model="lunch.order" id="order_2">
<field name="user_id" ref="base.user_root"/> <field name="user_id" ref="base.user_root"/>
<field name="date" eval="time.strftime('2012-10-22')"/> <field name="date" eval="time.strftime('2012-10-22')"/>
<field name="products" eval="[]"/> <field name="order_line_ids" eval="[]"/>
<field name="state">confirmed</field> <field name="state">confirmed</field>
<field name='company_id'>1</field> <field name='company_id'>1</field>
<field name='total'>7.40</field>
</record> </record>
<record model="lunch.order" id="order_3"> <record model="lunch.order" id="order_3">
<field name="user_id" ref="base.user_root"/> <field name="user_id" ref="base.user_root"/>
<field name="date" eval="time.strftime('2012-10-24')"/> <field name="date" eval="time.strftime('2012-10-24')"/>
<field name="products" eval="[]"/> <field name="order_line_ids" eval="[]"/>
<field name="state">cancelled</field> <field name="state">cancelled</field>
<field name='company_id'>1</field> <field name='company_id'>1</field>
<field name='total'>2.50</field>
</record> </record>
<record model="lunch.order.line" id="order_line_1"> <record model="lunch.order.line" id="order_line_1">
@ -142,7 +139,6 @@
<field name="supplier" ref="partner_pizza_inn"/> <field name="supplier" ref="partner_pizza_inn"/>
<field name="note">+Emmental</field> <field name="note">+Emmental</field>
<field name="order_id" ref="order_1"/> <field name="order_id" ref="order_1"/>
<field name="price">7.70</field>
</record> </record>
<record model="lunch.order.line" id="order_line_2"> <record model="lunch.order.line" id="order_line_2">
@ -153,7 +149,6 @@
<field name="supplier" ref="partner_pizza_inn"/> <field name="supplier" ref="partner_pizza_inn"/>
<field name="note">+Champignons</field> <field name="note">+Champignons</field>
<field name="order_id" ref="order_2"/> <field name="order_id" ref="order_2"/>
<field name="price">7.40</field>
</record> </record>
<record model="lunch.order.line" id="order_line_3"> <record model="lunch.order.line" id="order_line_3">
@ -164,7 +159,6 @@
<field name="supplier" ref="partner_coin_gourmand"/> <field name="supplier" ref="partner_coin_gourmand"/>
<field name="note">+Salade +Tomates +Comcombres</field> <field name="note">+Salade +Tomates +Comcombres</field>
<field name="order_id" ref="order_3"/> <field name="order_id" ref="order_3"/>
<field name="price">2.50</field>
</record> </record>
<record model="lunch.preference" id="preference_1"> <record model="lunch.preference" id="preference_1">
@ -217,7 +211,7 @@
<record model="lunch.alert" id="alert_1"> <record model="lunch.alert" id="alert_1">
<field name="message">Lunch must be ordered before 10h30 am</field> <field name="message">Lunch must be ordered before 10h30 am</field>
<field name="day">days</field> <field name="day">days</field>
<field name="active">t</field> <field name="lunch_active">t</field>
<field name="active_from">0</field> <field name="active_from">0</field>
<field name="active_to">0</field> <field name="active_to">0</field>
</record> </record>

View File

@ -275,7 +275,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Orders Tree"> <tree string="Orders Tree">
<field name="date"/> <field name="date"/>
<field name="products"/> <field name="order_line_ids"/>
<field name="state" /> <field name="state" />
<field name="total" sum="Total"/> <field name="total" sum="Total"/>
<field name="preferences" invisible="1"/> <field name="preferences" invisible="1"/>
@ -308,7 +308,7 @@
<div name="preferences"> <div name="preferences">
</div> </div>
<separator string='Your order'/> <separator string='Your order'/>
<field name='products' colspan='4' nolabel='1' on_change='onchange_price(products)'> <field name='order_line_ids' colspan='4' nolabel='1' on_change='onchange_price(order_line_ids)'>
<tree string='List' editable='bottom'> <tree string='List' editable='bottom'>
<field name='product' colspan='2' on_change='onchange_price(product)'/> <field name='product' colspan='2' on_change='onchange_price(product)'/>
<field name='note' /> <field name='note' />
@ -419,7 +419,7 @@
<field name="day"/> <field name="day"/>
<field name='active_from' widget='float_time'/> <field name='active_from' widget='float_time'/>
<field name='active_to' widget='float_time'/> <field name='active_to' widget='float_time'/>
<field name="active"/> <field name="lunch_active"/>
</tree> </tree>
</field> </field>
</record> </record>
@ -460,7 +460,7 @@
</group> </group>
<separator string="Alert Informations" colspan="4"/> <separator string="Alert Informations" colspan="4"/>
<group col="2" colspan="2"> <group col="2" colspan="2">
<field name='active'/> <field name='lunch_active'/>
<field name='message' placeholder="Write the message you want to display during the defined period..."/> <field name='message' placeholder="Write the message you want to display during the defined period..."/>
</group> </group>
<group col="2" colspan="2"> <group col="2" colspan="2">
@ -469,5 +469,17 @@
</form> </form>
</field> </field>
</record> </record>
<record model='ir.ui.view' id='partner_instructor_form_view'>
<field name='name'>partner.supplier.name.form</field>
<field name='model'>res.partner</field>
<field name='type'>form</field>
<field name='inherit_id' ref='base.view_partner_form' />
<field name='arch' type='xml'>
<field name='title' position='after'>
<field name='supplier_lunch'/>
</field>
</field>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -1,7 +0,0 @@
from osv import osv, fields
class res_partner (osv.Model):
_inherit = 'res.partner'
_columns = {
'supplier_lunch': fields.boolean('Lunch Supplier'),
}

View File

@ -1,18 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<openerp>
<data>
<record model='ir.ui.view' id='partner_instructor_form_view'>
<field name='name'>partner.supplier.name.form</field>
<field name='model'>res.partner</field>
<field name='type'>form</field>
<field name='inherit_id' ref='base.view_partner_form' />
<field name='arch' type='xml'>
<field name='title' position='after'>
<field name='supplier_lunch'/>
</field>
</field>
</record>
</data>
</openerp>

View File

@ -0,0 +1,23 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2012 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import lunch_validation
import lunch_cancel

View File

@ -0,0 +1,32 @@
from osv import osv, fields
class lunch_cancel(osv.Model):
""" lunch cancel """
_name = 'lunch.cancel'
_description = 'cancel lunch order'
def cancel(self,cr,uid,ids,context=None):
#confirm one or more order.line, update order status and create new cashmove
cashmove_ref = self.pool.get('lunch.cashmove')
order_lines_ref = self.pool.get('lunch.order.line')
orders_ref = self.pool.get('lunch.order')
order_ids = context.get('active_ids', [])
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
order_lines_ref.write(cr,uid,[order.id],{'state':'cancelled'},context)
for cash in order.cashmove:
cashmove_ref.unlink(cr,uid,cash.id,context)
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
hasconfirmed = False
hasnew = False
for product in order.order_id.products:
if product.state=='confirmed':
hasconfirmed= True
if product.state=='new':
hasnew= True
if hasnew == False:
if hasconfirmed == False:
orders_ref.write(cr,uid,[order.order_id.id],{'state':'cancelled'},context)
return {}
orders_ref.write(cr,uid,[order.order_id.id],{'state':'partially'},context)
return {}

View File

@ -0,0 +1,29 @@
from osv import osv, fields
class lunch_validation(osv.Model):
""" lunch validation """
_name = 'lunch.validation'
_description = 'lunch validation for order'
def confirm(self,cr,uid,ids,context=None):
#confirm one or more order.line, update order status and create new cashmove
cashmove_ref = self.pool.get('lunch.cashmove')
order_lines_ref = self.pool.get('lunch.order.line')
orders_ref = self.pool.get('lunch.order')
order_ids = context.get('active_ids', [])
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
if order.state!='confirmed':
new_id = cashmove_ref.create(cr,uid,{'user_id': order.user_id.id, 'amount':0 - order.price,'description':order.product.name, 'order_id':order.id, 'state':'order', 'date':order.date})
order_lines_ref.write(cr,uid,[order.id],{'cashmove':[('0',new_id)], 'state':'confirmed'},context)
for order in order_lines_ref.browse(cr,uid,order_ids,context=context):
isconfirmed = True
for product in order.order_id.products:
if product.state == 'new':
isconfirmed = False
if product.state == 'cancelled':
isconfirmed = False
orders_ref.write(cr,uid,[order.order_id.id],{'state':'partially'},context)
if isconfirmed == True:
orders_ref.write(cr,uid,[order.order_id.id],{'state':'confirmed'},context)
return {}