[MERGE] merge mtr branch for sale related modules improvements

[FIX] fix and improve some problems in the merge

bzr revid: mra@mra-laptop-20100624094518-w50t2ulxsaya046f
This commit is contained in:
Mustufa Rangwala 2010-06-24 15:15:18 +05:30
commit eb8cb905fd
14 changed files with 81 additions and 45 deletions

View File

@ -149,7 +149,7 @@ class delivery_grid_line(osv.osv):
'name': fields.char('Name', size=32, required=True), 'name': fields.char('Name', size=32, required=True),
'grid_id': fields.many2one('delivery.grid', 'Grid',required=True), 'grid_id': fields.many2one('delivery.grid', 'Grid',required=True),
'type': fields.selection([('weight','Weight'),('volume','Volume'),('wv','Weight * Volume'), ('price','Price')], 'Variable', required=True), 'type': fields.selection([('weight','Weight'),('volume','Volume'),('wv','Weight * Volume'), ('price','Price')], 'Variable', required=True),
'operator': fields.selection([('=','='),('<=','<='),('>=','>=')], 'Operator', required=True), 'operator': fields.selection([('==','='),('<=','<='),('>=','>=')], 'Operator', required=True),
'max_value': fields.float('Maximum Value', required=True), 'max_value': fields.float('Maximum Value', required=True),
'price_type': fields.selection([('fixed','Fixed'),('variable','Variable')], 'Price Type', required=True), 'price_type': fields.selection([('fixed','Fixed'),('variable','Variable')], 'Price Type', required=True),
'variable_factor': fields.selection([('weight','Weight'),('volume','Volume'),('wv','Weight * Volume'), ('price','Price')], 'Variable Factor', required=True), 'variable_factor': fields.selection([('weight','Weight'),('volume','Volume'),('wv','Weight * Volume'), ('price','Price')], 'Variable Factor', required=True),

View File

@ -430,7 +430,6 @@ class sale_order(osv.osv):
for preline in preinv.invoice_line: for preline in preinv.invoice_line:
inv_line_id = self.pool.get('account.invoice.line').copy(cr, uid, preline.id, {'invoice_id': False, 'price_unit': -preline.price_unit}) inv_line_id = self.pool.get('account.invoice.line').copy(cr, uid, preline.id, {'invoice_id': False, 'price_unit': -preline.price_unit})
lines.append(inv_line_id) lines.append(inv_line_id)
inv = { inv = {
'name': order.client_order_ref or order.name, 'name': order.client_order_ref or order.name,
'origin': order.name, 'origin': order.name,
@ -463,7 +462,7 @@ class sale_order(osv.osv):
invoices = {} invoices = {}
invoice_ids = [] invoice_ids = []
picking_obj = self.pool.get('stock.picking') picking_obj = self.pool.get('stock.picking')
invoice = self.pool.get('account.invoice')
if context is None: if context is None:
context = {} context = {}
# If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the # If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the
@ -478,7 +477,6 @@ class sale_order(osv.osv):
created_lines = self.pool.get('sale.order.line').invoice_line_create(cr, uid, lines) created_lines = self.pool.get('sale.order.line').invoice_line_create(cr, uid, lines)
if created_lines: if created_lines:
invoices.setdefault(o.partner_id.id, []).append((o, created_lines)) invoices.setdefault(o.partner_id.id, []).append((o, created_lines))
if not invoices: if not invoices:
for o in self.browse(cr, uid, ids): for o in self.browse(cr, uid, ids):
for i in o.invoice_ids: for i in o.invoice_ids:
@ -487,11 +485,14 @@ class sale_order(osv.osv):
for val in invoices.values(): for val in invoices.values():
if grouped: if grouped:
res = self._make_invoice(cr, uid, val[0][0], reduce(lambda x,y: x + y, [l for o,l in val], []), context=context) res = self._make_invoice(cr, uid, val[0][0], reduce(lambda x,y: x + y, [l for o,l in val], []), context=context)
invoice_ref = ''
for o, l in val: for o, l in val:
invoice_ref += o.name + '|'
self.write(cr, uid, [o.id], {'state': 'progress'}) self.write(cr, uid, [o.id], {'state': 'progress'})
if o.order_policy == 'picking': if o.order_policy == 'picking':
picking_obj.write(cr, uid, map(lambda x: x.id, o.picking_ids), {'invoice_state': 'invoiced'}) picking_obj.write(cr, uid, map(lambda x: x.id, o.picking_ids), {'invoice_state': 'invoiced'})
cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%s,%s)', (o.id, res)) cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%s,%s)', (o.id, res))
invoice.write(cr, uid, [res], {'origin': invoice_ref, 'name': invoice_ref})
else: else:
for order, il in val: for order, il in val:
res = self._make_invoice(cr, uid, order, il, context=context) res = self._make_invoice(cr, uid, order, il, context=context)

View File

@ -65,7 +65,6 @@
- -
!record {model: account.account, id: account_account_receivable0}: !record {model: account.account, id: account_account_receivable0}:
code: AR code: AR
company_id: base.main_company
currency_mode: current currency_mode: current
name: Receivable name: Receivable
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0
@ -79,7 +78,6 @@
- -
!record {model: account.account, id: account_account_cash0}: !record {model: account.account, id: account_account_cash0}:
code: C code: C
company_id: base.main_company
currency_mode: current currency_mode: current
name: Cash name: Cash
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0
@ -142,7 +140,6 @@
- -
!record {model: account.journal, id: account_journal_bankjournal0}: !record {model: account.journal, id: account_journal_bankjournal0}:
code: BNK code: BNK
company_id: base.main_company
default_credit_account_id: account_account_cash0 default_credit_account_id: account_account_cash0
default_debit_account_id: account_account_cash0 default_debit_account_id: account_account_cash0
name: Bank Journal name: Bank Journal

View File

@ -78,7 +78,6 @@
- -
!record {model: account.account, id: account_account_cash0}: !record {model: account.account, id: account_account_cash0}:
code: C code: C
company_id: base.main_company
currency_mode: current currency_mode: current
name: Cash name: Cash
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0

View File

@ -65,7 +65,6 @@
- -
!record {model: account.account, id: account_account_receivable0}: !record {model: account.account, id: account_account_receivable0}:
code: AR code: AR
company_id: base.main_company
currency_mode: current currency_mode: current
name: Receivable name: Receivable
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0
@ -79,7 +78,6 @@
- -
!record {model: account.account, id: account_account_cash0}: !record {model: account.account, id: account_account_cash0}:
code: C code: C
company_id: base.main_company
currency_mode: current currency_mode: current
name: Cash name: Cash
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0
@ -142,7 +140,6 @@
- -
!record {model: account.journal, id: account_journal_bankjournal0}: !record {model: account.journal, id: account_journal_bankjournal0}:
code: BNK code: BNK
company_id: base.main_company
default_credit_account_id: account_account_cash0 default_credit_account_id: account_account_cash0
default_debit_account_id: account_account_cash0 default_debit_account_id: account_account_cash0
name: Bank Journal name: Bank Journal

View File

@ -65,7 +65,6 @@
- -
!record {model: account.account, id: account_account_receivable0}: !record {model: account.account, id: account_account_receivable0}:
code: AR code: AR
company_id: base.main_company
currency_mode: current currency_mode: current
name: Receivable name: Receivable
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0
@ -79,7 +78,6 @@
- -
!record {model: account.account, id: account_account_cash0}: !record {model: account.account, id: account_account_cash0}:
code: C code: C
company_id: base.main_company
currency_mode: current currency_mode: current
name: Cash name: Cash
parent_id: account_account_minimalchart0 parent_id: account_account_minimalchart0
@ -142,7 +140,6 @@
- -
!record {model: account.journal, id: account_journal_bankjournal0}: !record {model: account.journal, id: account_journal_bankjournal0}:
code: BNK code: BNK
company_id: base.main_company
default_credit_account_id: account_account_cash0 default_credit_account_id: account_account_cash0
default_debit_account_id: account_account_cash0 default_debit_account_id: account_account_cash0
name: Bank Journal name: Bank Journal

View File

@ -26,7 +26,7 @@ class sale_make_invoice(osv.osv_memory):
_name = "sale.make.invoice" _name = "sale.make.invoice"
_description = "Sale Make Invoice" _description = "Sale Make Invoice"
_columns = { _columns = {
'grouped': fields.boolean('Group the invoices'), 'grouped': fields.boolean('Group the invoices', help='Check the box to group the invoices for the same customers'),
'invoice_date':fields.date('Invoice Date'), 'invoice_date':fields.date('Invoice Date'),
} }
_default = { _default = {
@ -50,11 +50,11 @@ class sale_make_invoice(osv.osv_memory):
for o in order_obj.browse(cr, uid, context.get(('active_ids'),[]), context): for o in order_obj.browse(cr, uid, context.get(('active_ids'),[]), context):
for i in o.invoice_ids: for i in o.invoice_ids:
newinv.append(i.id) newinv.append(i.id)
mod_obj =self.pool.get('ir.model.data') mod_obj =self.pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'account', 'view_account_invoice_filter') result = mod_obj._get_id(cr, uid, 'account', 'view_account_invoice_filter')
id = mod_obj.read(cr, uid, result, ['res_id']) id = mod_obj.read(cr, uid, result, ['res_id'])
return { return {
'domain': "[('id','in', ["+','.join(map(str,newinv))+"])]", 'domain': "[('id','in', ["+','.join(map(str,newinv))+"])]",
'name': 'Invoices', 'name': 'Invoices',
@ -64,7 +64,7 @@ class sale_make_invoice(osv.osv_memory):
'view_id': False, 'view_id': False,
'context': "{'type':'out_refund'}", 'context': "{'type':'out_refund'}",
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'search_view_id': id['id'] 'search_view_id': id['res_id']
} }
sale_make_invoice() sale_make_invoice()

View File

@ -6,14 +6,15 @@
<field name="model">sale.make.invoice</field> <field name="model">sale.make.invoice</field>
<field name="type">form</field> <field name="type">form</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Create invoices"> <form string="Create invoices">
<separator colspan="4" string="Do you really want to create the invoices ?" /> <separator colspan="4" string="Do you really want to create the invoices ?" />
<field name="grouped" /> <field name="grouped"/>
<newline/>
<field name="invoice_date"/> <field name="invoice_date"/>
<separator string="" colspan="6" /> <separator string="" colspan="6"/>
<button special="cancel" string="Cancel" icon="gtk-cancel"/> <button special="cancel" string="Cancel" icon="gtk-cancel"/>
<button name="make_invoices" string="Create Invoices" type="object" icon="gtk-ok"/> <button name="make_invoices" string="Create Invoices" type="object" icon="gtk-ok"/>
</form> </form>
</field> </field>
</record> </record>

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################## ##############################################################################
# #
# OpenERP, Open Source Management Solution # OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
# #
@ -15,7 +15,7 @@
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################## ##############################################################################
@ -29,7 +29,7 @@
'depends': ['sale', 'delivery'], 'depends': ['sale', 'delivery'],
'init_xml': [], 'init_xml': [],
'update_xml': [ 'update_xml': [
'delivery_report.xml' 'sale_delivery_report.xml'
], ],
'demo_xml': [], 'demo_xml': [],
'installable': True, 'installable': True,

View File

@ -127,6 +127,7 @@ class picking_journal(osv.osv):
'state': fields.selection([ 'state': fields.selection([
('draft','Draft'), ('draft','Draft'),
('open','Open'), ('open','Open'),
('cancel','Cancel'),
('done','Done'), ('done','Done'),
], 'Creation date', required=True, readonly=True), ], 'Creation date', required=True, readonly=True),
'note': fields.text('Note'), 'note': fields.text('Note'),
@ -138,6 +139,7 @@ class picking_journal(osv.osv):
'state': lambda self,cr,uid,context: 'draft', 'state': lambda self,cr,uid,context: 'draft',
} }
def button_picking_cancel(self, cr, uid, ids, context={}): def button_picking_cancel(self, cr, uid, ids, context={}):
self.write(cr, uid, ids, {'state':'cancel'})
for id in ids: for id in ids:
pick_ids = self.pool.get('stock.picking').search(cr, uid, [('journal_id','=',id)]) pick_ids = self.pool.get('stock.picking').search(cr, uid, [('journal_id','=',id)])
for pickid in pick_ids: for pickid in pick_ids:
@ -177,7 +179,7 @@ res_partner()
class picking(osv.osv): class picking(osv.osv):
_inherit="stock.picking" _inherit="stock.picking"
_columns = { _columns = {
'journal_id': fields.many2one('sale_journal.picking.journal', 'Journal'), 'journal_id': fields.many2one('sale_journal.picking.journal', 'Journal', domain=[('state','!=', 'done')]),
'sale_journal_id': fields.many2one('sale_journal.sale.journal', 'Sale Journal'), 'sale_journal_id': fields.many2one('sale_journal.sale.journal', 'Sale Journal'),
'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', readonly=True) 'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', readonly=True)
} }
@ -186,7 +188,7 @@ picking()
class sale(osv.osv): class sale(osv.osv):
_inherit="sale.order" _inherit="sale.order"
_columns = { _columns = {
'journal_id': fields.many2one('sale_journal.sale.journal', 'Journal'), 'journal_id': fields.many2one('sale_journal.sale.journal', 'Journal', domain=[('state','!=', 'done')]),
'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type') 'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type')
} }
def action_ship_create(self, cr, uid, ids, *args): def action_ship_create(self, cr, uid, ids, *args):

View File

@ -113,13 +113,16 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Sales by Journal"> <search string="Sales by Journal">
<group col="8" colspan="4"> <group col="8" colspan="4">
<filter icon="terp-personal" string="My Sale Journals" domain="[('user_id','=',uid)]" help="My Sale Journals"/> <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Sale Journals which are in draft state"/>
<filter icon="terp-camera_test" string="Open" domain="[('state','=','open')]" help="Open Sale Journals"/> <filter icon="gtk-open" string="Open" domain="[('state','=','open')]" help="Open Sale Journals"/>
<separator orientation="vertical"/> <filter icon="gtk-cancel" string="Cancel" domain="[('state','=','cancel')]" help="Sale Journals which are cancelled"/>
<field name="name" select="1"/> <filter icon="terp-check" string="Confirm" domain="[('state','=','confirm')]" help="Confirmed Sale Journals"/>
<field name="code" select="1"/> <filter icon="terp-camera_test" string="Close" domain="[('state','=','done')]" help="Sale Journals which are closed"/>
<field name="user_id" select="1"/> <separator orientation="vertical"/>
<field name="date" select="1"/> <field name="name"/>
<field name="code"/>
<field name="user_id"/>
<field name="date"/>
</group> </group>
</search> </search>
</field> </field>
@ -131,6 +134,7 @@
<field name="res_model">sale_journal.sale.journal</field> <field name="res_model">sale_journal.sale.journal</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="context">{'search_default_user_id':uid}</field>
<field name="search_view_id" ref="view_sale_journal_search"/> <field name="search_view_id" ref="view_sale_journal_search"/>
</record> </record>
@ -386,7 +390,7 @@
<group col="6" colspan="2"> <group col="6" colspan="2">
<button name="button_open" string="Open Journal" states="draft" type="object" icon="gtk-open"/> <button name="button_open" string="Open Journal" states="draft" type="object" icon="gtk-open"/>
<button name="button_close" string="Close Journal" states="open" type="object" icon="gtk-close"/> <button name="button_close" string="Close Journal" states="open" type="object" icon="gtk-close"/>
<button name="button_draft" string="Set to Draft" states="close,open" type="object" icon="gtk-convert"/> <button name="button_draft" string="Set to Draft" states="close,open,cancel" type="object" icon="gtk-convert"/>
<button string="Cancel Picking" name="button_picking_cancel" states="draft,open" type="object" icon="gtk-cancel"/> <button string="Cancel Picking" name="button_picking_cancel" states="draft,open" type="object" icon="gtk-cancel"/>
</group> </group>
</form> </form>
@ -417,13 +421,15 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Picking Journals"> <search string="Picking Journals">
<group col="8" colspan="4"> <group col="8" colspan="4">
<filter icon="terp-personal" string="My Picking Journals" domain="[('user_id','=',uid)]" help="My Picking Journals"/> <filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Picking Journals which are in draft state"/>
<filter icon="terp-camera_test" string="Open" domain="[('state','=','open')]" help="Open Picking Journals"/> <filter icon="gtk-open" string="Open" domain="[('state','=','open')]" help="Open Picking Journals"/>
<filter icon="gtk-cancel" string="Cancel" domain="[('state','=','cancel')]" help="Picking Journals which are cancelled"/>
<filter icon="terp-camera_test" string="Close" domain="[('state','=','done')]" help="Picking Journals which are closed"/>
<separator orientation="vertical"/> <separator orientation="vertical"/>
<field name="name" select="1"/> <field name="name"/>
<field name="code" select="1"/> <field name="code"/>
<field name="user_id" select="1"/> <field name="user_id"/>
<field name="date" select="1"/> <field name="date"/>
</group> </group>
</search> </search>
</field> </field>
@ -436,6 +442,7 @@
<field name="res_model">sale_journal.picking.journal</field> <field name="res_model">sale_journal.picking.journal</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="context">{'search_default_user_id':uid}</field>
<field name="search_view_id" ref="view_picking_journal_search"/> <field name="search_view_id" ref="view_picking_journal_search"/>
</record> </record>

View File

@ -26,6 +26,16 @@ class sale_order_line(osv.osv):
_name = "sale.order.line" _name = "sale.order.line"
_inherit = "sale.order.line" _inherit = "sale.order.line"
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, packaging=False, fiscal_position=False, flag=False):
res = super(sale_order_line, self).product_id_change(cr, uid, ids, pricelist, product, qty=qty,
uom=uom, qty_uos=qty_uos, uos=uos, name=name, partner_id=partner_id,
lang=lang, update_tax=update_tax, date_order=date_order, packaging=packaging, fiscal_position=fiscal_position, flag=flag)
purchase_price = self.pool.get('product.product').browse(cr, uid, product).standard_price
res['value'].update({'purchase_price':purchase_price})
return res
def _product_margin(self, cr, uid, ids, field_name, arg, context=None): def _product_margin(self, cr, uid, ids, field_name, arg, context=None):
res = {} res = {}
for line in self.browse(cr, uid, ids): for line in self.browse(cr, uid, ids):
@ -38,7 +48,7 @@ class sale_order_line(osv.osv):
return res return res
_columns = { _columns = {
'margin': fields.function(_product_margin, method=True, string='Margin', store=True), 'margin': fields.function(_product_margin, method=True, string='Margin', store={}),
'purchase_price': fields.float('Cost Price', digits=(16,2)) 'purchase_price': fields.float('Cost Price', digits=(16,2))
} }

View File

@ -13,6 +13,31 @@
</field> </field>
</field> </field>
</record> </record>
<record model="ir.ui.view" id="sale_margin_sale_order_line">
<field name="name">sale.order.line.margin.view.form</field>
<field name="type">form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<xpath expr="/form/notebook/page/field[@name='order_line']/form/notebook/page/field[@name='price_unit']" position="after">
<field name="purchase_price"/>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="sale_margin_sale_order_line_form">
<field name="name">sale.order.line.tree.margin.view.form</field>
<field name="type">form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<xpath expr="/form/notebook/page/field[@name='order_line']/tree/field[@name='price_unit']" position="after">
<field name="purchase_price"/>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="sale_margin_sale_order_tree"> <record model="ir.ui.view" id="sale_margin_sale_order_tree">
<field name="name">sale.order.margin.view.tree</field> <field name="name">sale.order.margin.view.tree</field>
<field name="type">tree</field> <field name="type">tree</field>
@ -24,7 +49,7 @@
</field> </field>
</field> </field>
</record> </record>
<record model="ir.ui.view" id="sale_margin_sale_order_line_tree"> <record model="ir.ui.view" id="sale_margin_sale_order_line_tree">
<field name="name">sale.order.margin.line.view.tree</field> <field name="name">sale.order.margin.line.view.tree</field>
<field name="type">tree</field> <field name="type">tree</field>
@ -42,7 +67,7 @@
<field name="name">picking.margin.view.form</field> <field name="name">picking.margin.view.form</field>
<field name="type">form</field> <field name="type">form</field>
<field name="model">stock.picking</field> <field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_out_form" /> <field name="inherit_id" ref="stock.view_picking_in_form" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<notebook colspan="4"> <notebook colspan="4">
<page string="Supplier Invoices"> <page string="Supplier Invoices">