-
+
project.task.tree
@@ -502,6 +511,21 @@
A task represents a work that has to be done. Each user works in his own list of tasks where he can record his task work in hours. He can work and close the task itself or delegate it to another user. If you delegate a task to another user, you get a new task in pending state, which will be reopened when you have to review the work achieved. If you install the project_timesheet module, task work can be invoiced based on the project configuration. With the project_mrp module, sales orders can create tasks automatically when they are confirmed.
+
+
+
+ tree
+
+
+
+
+
+
+ form
+
+
+
+
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 302000950a1..74a78a9808a 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -226,6 +226,7 @@ class project_issue(crm.crm_case, osv.osv):
multi='compute_day', type="float", store=True),
'inactivity_days': fields.function(_compute_day, string='Days since last action', \
multi='compute_day', type="integer", help="Difference in days between last action and current date"),
+ 'color': fields.integer('Color Index'),
'message_ids': fields.one2many('mail.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
'date_action_last': fields.datetime('Last Action', readonly=1),
'date_action_next': fields.datetime('Next Action', readonly=1),
@@ -258,7 +259,22 @@ class project_issue(crm.crm_case, osv.osv):
'priority': crm.AVAILABLE_PRIORITIES[2][0],
'project_id':_get_project,
'categ_id' : lambda *a: False,
- }
+ }
+
+ def set_priority(self, cr, uid, ids, priority):
+ """Set lead priority
+ """
+ return self.write(cr, uid, ids, {'priority' : priority})
+
+ def set_high_priority(self, cr, uid, ids, *args):
+ """Set lead priority to high
+ """
+ return self.set_priority(cr, uid, ids, '1')
+
+ def set_normal_priority(self, cr, uid, ids, *args):
+ """Set lead priority to normal
+ """
+ return self.set_priority(cr, uid, ids, '3')
def convert_issue_task(self, cr, uid, ids, context=None):
case_obj = self.pool.get('project.issue')
diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml
index d404ed7f03f..b3be3d2c663 100644
--- a/addons/project_issue/project_issue_menu.xml
+++ b/addons/project_issue/project_issue_menu.xml
@@ -8,7 +8,7 @@
Issuesproject.issueform
- tree,calendar
+ tree,calendar,kanban{"search_default_user_id": uid, "search_default_draft": 1, "search_default_project_id":project_id}
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 544606acb5d..916c67b15d4 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -260,6 +260,83 @@
+
+
+
+
+ Project Issue Kanban
+ project.issue
+ kanban
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# ------------------------------------------------------
# Feature Requests
# ------------------------------------------------------
diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py
index 696c4d708fe..29b4aa29318 100644
--- a/addons/purchase/stock.py
+++ b/addons/purchase/stock.py
@@ -124,68 +124,15 @@ class stock_picking(osv.osv):
purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_id': invoice_id,})
return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
-stock_picking()
-
class stock_partial_picking(osv.osv_memory):
_inherit = 'stock.partial.picking'
- def default_get(self, cr, uid, fields, context=None):
- """ To get default values for the object.
- @param self: The object pointer.
- @param cr: A database cursor
- @param uid: ID of the user currently logged in
- @param fields: List of fields for which we want default values
- @param context: A standard dictionary
- @return: A dictionary which of fields with values.
- """
- if context is None:
- context = {}
- pick_obj = self.pool.get('stock.picking')
- res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
- for pick in pick_obj.browse(cr, uid, context.get('active_ids', []), context=context):
- has_product_cost = (pick.type == 'in' and pick.purchase_id)
- for m in pick.move_lines:
- if m.state in ('done','cancel') :
- continue
- if has_product_cost and m.product_id.cost_method == 'average' and m.purchase_line_id:
- # We use the original PO unit purchase price as the basis for the cost, expressed
- # in the currency of the PO (i.e the PO's pricelist currency)
- list_index = 0
- for item in res['product_moves_in']:
- if item['move_id'] == m.id:
- res['product_moves_in'][list_index]['cost'] = m.purchase_line_id.price_unit
- res['product_moves_in'][list_index]['currency'] = m.picking_id.purchase_id.pricelist_id.currency_id.id
- list_index += 1
- return res
-stock_partial_picking()
+ # Overridden to inject the purchase price as true 'cost price' when processing
+ # incoming pickings.
+ def _product_cost_for_average_update(self, cr, uid, move):
+ if move.picking_id.purchase_id:
+ return {'cost': move.purchase_line_id.price_unit,
+ 'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id}
+ return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move)
-class stock_partial_move(osv.osv_memory):
- _inherit = "stock.partial.move"
- def default_get(self, cr, uid, fields, context=None):
- """ To get default values for the object.
- @param self: The object pointer.
- @param cr: A database cursor
- @param uid: ID of the user currently logged in
- @param fields: List of fields for which we want default values
- @param context: A standard dictionary
- @return: A dictionary which of fields with values.
- """
- if context is None:
- context = {}
- res = super(stock_partial_move, self).default_get(cr, uid, fields, context=context)
- move_obj = self.pool.get('stock.move')
- for m in move_obj.browse(cr, uid, context.get('active_ids', []), context=context):
- if m.picking_id.type == 'in' and m.product_id.cost_method == 'average' \
- and m.purchase_line_id and m.picking_id.purchase_id:
- # We use the original PO unit purchase price as the basis for the cost, expressed
- # in the currency of the PO (i.e the PO's pricelist currency)
- list_index = 0
- for item in res['product_moves_in']:
- if item['move_id'] == m.id:
- res['product_moves_in'][list_index]['cost'] = m.purchase_line_id.price_unit
- res['product_moves_in'][list_index]['currency'] = m.picking_id.purchase_id.pricelist_id.currency_id.id
- list_index += 1
- return res
-stock_partial_move()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/purchase/test/purchase_from_picking.yml b/addons/purchase/test/purchase_from_picking.yml
index 9425ad94812..8d63aa3e02c 100644
--- a/addons/purchase/test/purchase_from_picking.yml
+++ b/addons/purchase/test/purchase_from_picking.yml
@@ -137,7 +137,7 @@
pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2"))
pick_ids = [x.id for x in pur_id1.picking_ids]
id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.expenses_journal')},
- {'active_ids': pick_ids})
+ {'active_ids': pick_ids, 'active_model': 'stock.picking'})
self.create_invoice(cr, uid, [id], {"active_ids": pick_ids, "active_id": pick_ids[0]})
-
I check that an invoice_ids field of Delivery&Invoices gets bind with the value.
diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml
index 41f7534c8e2..4622577ac3d 100644
--- a/addons/sale/sale_data.xml
+++ b/addons/sale/sale_data.xml
@@ -13,11 +13,15 @@
Resource: sale.shop
-->
-
-
-
-
+
+
+
+
+
+
diff --git a/addons/sale/test/data_test.yml b/addons/sale/test/data_test.yml
index 7064a549335..0be8474754c 100644
--- a/addons/sale/test/data_test.yml
+++ b/addons/sale/test/data_test.yml
@@ -122,7 +122,6 @@
default_credit_account_id: account_account_purchases0
default_debit_account_id: account_account_purchases0
name: Purchase Journal - (test)
- sequence_id: account.sequence_purchase_journal
type: purchase
view_id: account.account_journal_view
-
@@ -134,7 +133,6 @@
default_credit_account_id: account_account_sales0
default_debit_account_id: account_account_sales0
name: Sale Journal
- sequence_id: account.sequence_sale_journal
type: sale
view_id: account.account_journal_view
-
@@ -146,7 +144,6 @@
default_credit_account_id: account_account_cash0
default_debit_account_id: account_account_cash0
name: Bank Journal
- sequence_id: account.sequence_journal
type: cash
view_id: account.account_journal_bank_view
-
diff --git a/addons/sale/test/invoice_on_ordered_qty.yml b/addons/sale/test/invoice_on_ordered_qty.yml
index 785b2d8835e..313aa3a0d63 100644
--- a/addons/sale/test/invoice_on_ordered_qty.yml
+++ b/addons/sale/test/invoice_on_ordered_qty.yml
@@ -31,39 +31,17 @@
-
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so9}
-
- I verify that the picking has been generated for the sale order
+ I verify that the picking has been generated for the sale order and I process it
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so9"))
assert so.picking_ids,"Picking has not been generated for sale_order_so9"
--
- Then I confirm the picking
--
- !record {model: stock.partial.picking, id: stock_partial_picking_0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
--
- Then I done the picking
--
- !python {model: stock.picking }: |
- import time
- sale_order_obj = self.pool.get('sale.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so9"))
- picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
- if picking_id:
- pick=self.browse(cr,uid,picking_id[0])
- pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': '100',
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ picking, = so.picking_ids
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [picking.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I click on Create Invoice button to create the invoice.
-
diff --git a/addons/sale/test/invoice_on_shipped_qty.yml b/addons/sale/test/invoice_on_shipped_qty.yml
index bf2795e0f5b..c6ac86471be 100644
--- a/addons/sale/test/invoice_on_shipped_qty.yml
+++ b/addons/sale/test/invoice_on_shipped_qty.yml
@@ -30,41 +30,21 @@
-
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so6}
-
- I verify that the picking has been generated for the sale order
+ I verify that the picking has been generated for the sale order and I process it
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so6"))
assert so.picking_ids,"Picking has not been generated for sale_order_so6"
--
- Then I click on the "Product Sent" button of Outgoing Shipments
--
- !record {model: stock.partial.picking, id: stock_partial_picking_0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
--
- I change the quantity on the picking to 199, and confirm partially 100 PCE.
--
- !python {model: stock.picking }: |
- import time
- sale_order_obj = self.pool.get('sale.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so6"))
- picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
- if picking_id:
- pick=self.browse(cr,uid,picking_id[0])
- self.pool.get('stock.move').write(cr, uid, [pick.move_lines[0].id], {'product_qty': 199, 'product_uos_qty': 199})
- pick=self.browse(cr,uid,picking_id[0])
- pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': '100',
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ picking, = so.picking_ids
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [picking.id]})
+ # I change the qty to 100 for a partial delivery
+ partial = stock_partial_picking.browse(cr,uid,partial_id)
+ line_id = partial.move_ids[0].id
+ partial.write({'move_ids': [(1,line_id,{'quantity':100})]})
+ partial.do_partial()
-
Then I click on 'Create Invoices' button
-
@@ -72,9 +52,9 @@
import time
sale_obj = self.pool.get('sale.order')
sale_id = sale_obj.browse(cr, uid, ref("sale_order_so6"))
- ids = [x.id for x in sale_id.picking_ids]
+ ids = [x.id for x in sale_id.picking_ids if x.state == 'done']
wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')},
- {'active_ids': ids})
+ {'active_ids': ids, 'active_model': 'stock.picking'})
self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
-
I verify whether the invoice has been generated for SO
@@ -98,7 +78,7 @@
inv_brw = self.browse(cr,uid,inv_id)[0]
for inv_lines in inv_brw.invoice_line:
qty1=inv_lines.quantity
- assert (qty1 == qty), "Quantities are not the same"
+ assert (qty1 == qty), "Quantities are not the same: invoiced: %s, shipped: %s" % (qty1,qty)
-
I open the Invoice for the SO.
-
diff --git a/addons/sale/test/manual_order_policy.yml b/addons/sale/test/manual_order_policy.yml
index c1535402f9b..af515b2d4e4 100644
--- a/addons/sale/test/manual_order_policy.yml
+++ b/addons/sale/test/manual_order_policy.yml
@@ -136,15 +136,11 @@
I verify that a procurement state is "running"
-
!python {model: procurement.order}: |
- from tools.translate import _
- modules = self.pool.get('ir.module.module')
- mod_pur = modules.search(cr, uid, [('name','=','purchase')])
- mod_brw = modules.browse(cr,uid,mod_pur)[0]
- if (mod_brw.state == 'installed'):
- sale_order_obj = self.pool.get('sale.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
- proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','=','running')])
- assert(proc_ids),"Procurement is not in the running state!"
+ sale_order_obj = self.pool.get('sale.order')
+ so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
+ proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','in',['running','ready'])])
+ # should be running is 'purchase' is installed, else 'ready'
+ assert(proc_ids),"Procurement is not in running/ready state!"
-
I verify that a purchase order has been generated
-
@@ -192,7 +188,7 @@
for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
-
- I verify that a picking related to purchase order has been generated.
+ I verify that a picking related to purchase order has been generated and I process it
-
!python {model: sale.order}: |
modules = self.pool.get('ir.module.module')
@@ -204,29 +200,12 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated"
--
- Then I click on the "Products Received" button of Incoming Shipments
--
- !record {model: stock.partial.picking, id: stock_partial_picking_0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
--
- I click on the "Validate" button
--
- !python {model: stock.picking}: |
- modules = self.pool.get('ir.module.module')
- sale_order_obj = self.pool.get('sale.order')
- pur_obj = self.pool.get('purchase.order')
- mod_pur = modules.search(cr, uid, [('name','=','purchase')])
- mod_brw = modules.browse(cr,uid,mod_pur)[0]
- if (mod_brw.state == 'installed'):
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
- pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
- po = pur_obj.browse(cr, uid, pur_id)[0]
- pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
- import netsvc
- wf_service = netsvc.LocalService("workflow")
- for pick in pick_ser_id:
- wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
+ picking, = po.picking_ids
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [picking.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I verify that picking for purchase order has been done.
-
@@ -244,7 +223,7 @@
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
assert(ids),"Picking is not in the done state!"
-
- Then I done the picking
+ Then I process the picking
-
!python {model: stock.picking }: |
import time
@@ -254,18 +233,11 @@
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [pick.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I verify that picking for sale order is in done state.
-
@@ -275,38 +247,6 @@
picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
pick = self.browse(cr,uid,picking_id[0])
assert (pick.state) =='done', "Picking for SO is not in done state."
--
- Then I done the delivery order
--
- !python {model: stock.picking }: |
- import time
- sale_order_obj = self.pool.get('sale.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
- picking_id = self.search(cr, uid, [('origin','=',so.name)])
- if picking_id:
- pick=self.browse(cr,uid,picking_id[0])
- pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
--
- I verify that delivery state is done
--
- !python {model: stock.picking }: |
- sale_order_obj = self.pool.get('sale.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
- picking_id = self.search(cr, uid, [('origin','=',so.name)])
- pick = self.browse(cr,uid,picking_id[0])
- assert (pick.state) =='done', "Picking for SO is not in done state."
-
I verify that a "Picked" has been set to true
-
diff --git a/addons/sale/test/picking_order_policy.yml b/addons/sale/test/picking_order_policy.yml
index 4381c78f010..1dcbf980da4 100644
--- a/addons/sale/test/picking_order_policy.yml
+++ b/addons/sale/test/picking_order_policy.yml
@@ -46,18 +46,11 @@
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [pick.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
Then I click on 'Create Invoices' button
-
@@ -67,7 +60,7 @@
sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7"))
ids = [x.id for x in sale_id.picking_ids]
wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')},
- {'active_ids': ids})
+ {'active_ids': ids, 'active_model': 'stock.picking'})
self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
-
I check that an invoice has been created.
@@ -197,7 +190,7 @@
for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
-
- I verify that a picking related to purchase order has been generated.
+ I verify that a picking related to purchase order has been generated and I process it
-
!python {model: sale.order}: |
modules = self.pool.get('ir.module.module')
@@ -209,29 +202,12 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated"
--
- Then I click on the "Products Received" button of Incoming Shipments
--
- !record {model: stock.partial.picking, id: stock_partial_picking_0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
--
- I click on the "Validate" button
--
- !python {model: stock.picking}: |
- modules = self.pool.get('ir.module.module')
- mod_pur = modules.search(cr, uid, [('name','=','purchase')])
- mod_brw = modules.browse(cr,uid,mod_pur)[0]
- if (mod_brw.state == 'installed'):
- sale_order_obj = self.pool.get('sale.order')
- pur_obj = self.pool.get('purchase.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
- pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
- po = pur_obj.browse(cr, uid, pur_id)[0]
- pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
- import netsvc
- wf_service = netsvc.LocalService("workflow")
- for pick in pick_ser_id:
- wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
+ picking, = po.picking_ids
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [picking.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I verify that picking for purchase order has been done.
-
@@ -249,36 +225,20 @@
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
assert ids, _('Picking is not in the done state!')
-
- I verify that delivery order has been generated for sale order
+ I verify that delivery order has been generated for sale order, and process it
-
!python {model: stock.picking }: |
sale_order_obj = self.pool.get('sale.order')
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
picking_id = self.search(cr, uid, [('origin','=',so.name)])
assert (picking_id),"Delivery order has not been generated"
--
- I verify that delivery has been done
--
- !python {model: stock.picking }: |
- import time
- sale_order_obj = self.pool.get('sale.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
- picking_id = self.search(cr, uid, [('origin','=',so.name)])
- if picking_id:
- pick=self.browse(cr,uid,picking_id[0])
- pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ pick=self.browse(cr,uid,picking_id[0])
+ pick.force_assign(cr, uid)
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [pick.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I verify that delivery state is done
-
@@ -290,7 +250,7 @@
pick = self.browse(cr,uid,picking_id[0])
assert (pick.state) =='done', "Picking for SO is not in done state."
-
- I verify that a "Picked" has been set to true
+ I verify that the sale order is marked as delivered
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so7"))
diff --git a/addons/sale/test/postpaid_order_policy.yml b/addons/sale/test/postpaid_order_policy.yml
index 330c6d17308..a0d5a8e1928 100644
--- a/addons/sale/test/postpaid_order_policy.yml
+++ b/addons/sale/test/postpaid_order_policy.yml
@@ -45,18 +45,11 @@
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [pick.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I verify that picking order is in done state.
-
@@ -76,7 +69,7 @@
picking_id = self.search(cr, uid, [('origin','=',so.name)])
assert (picking_id),"Delivery order has not been generated"
-
- I click on the Products Sent button and then on the Validate button
+ I process the delivery order
-
!python {model: stock.picking }: |
import time
@@ -86,20 +79,13 @@
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [pick.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
- I verify that delivery state is done
+ I verify that delivery order is marked done
-
!python {model: stock.picking }: |
sale_order_obj = self.pool.get('sale.order')
@@ -187,7 +173,7 @@
for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
-
- I verify that a picking related to purchase order has been generated.
+ I verify that a picking related to purchase order has been generated and I process it
-
!python {model: sale.order}: |
modules = self.pool.get('ir.module.module')
@@ -199,31 +185,14 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated"
+ picking, = po.picking_ids
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [picking.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
- Then I click on the "Products Received" button of Incoming Shipments
--
- !record {model: stock.partial.picking, id: stock_partial_picking_0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
--
- I click on the "Validate" button
--
- !python {model: stock.picking}: |
- modules = self.pool.get('ir.module.module')
- mod_pur = modules.search(cr, uid, [('name','=','purchase')])
- mod_brw = modules.browse(cr,uid,mod_pur)[0]
- if (mod_brw.state == 'installed'):
- sale_order_obj = self.pool.get('sale.order')
- pur_obj = self.pool.get('purchase.order')
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so8"))
- pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
- po = pur_obj.browse(cr, uid, pur_id)[0]
- pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
- import netsvc
- wf_service = netsvc.LocalService("workflow")
- for pick in pick_ser_id:
- wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
--
- I verify that picking for purchase order has been done.
+ I verify that picking for purchase order has been marked done.
-
!python {model: sale.order}: |
from tools.translate import _
@@ -239,7 +208,7 @@
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
assert ids, _('Picking is not in the done state!')
-
- I verify that a "Picked" has been set to true
+ I verify that the sale order is marked as delivered
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so8"))
diff --git a/addons/sale/test/prepaid_order_policy.yml b/addons/sale/test/prepaid_order_policy.yml
index 4bf132e5bee..d6f3da64a2c 100644
--- a/addons/sale/test/prepaid_order_policy.yml
+++ b/addons/sale/test/prepaid_order_policy.yml
@@ -101,18 +101,11 @@
if picking_id:
pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid)
- partial_datas = {
- 'partner_id':pick.address_id.partner_id.id,
- 'address_id': pick.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d'),
- }
- move = pick.move_lines[0]
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id.id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- }
- self.do_partial(cr, uid, [pick.id],partial_datas)
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [pick.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
-
I verify that picking order is in done state.
-
@@ -201,7 +194,7 @@
for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
-
- I verify that a picking related to purchase order has been generated.
+ I verify that a picking related to purchase order has been generated and I process it
-
!python {model: sale.order}: |
modules = self.pool.get('ir.module.module')
@@ -213,51 +206,21 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated"
--
- Then I click on the "Products Received" button of Incoming Shipments
--
- !record {model: stock.partial.picking, id: stock_partial_picking_0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
--
- I click on the "Validate" button
--
- !python {model: stock.picking}: |
- modules = self.pool.get('ir.module.module')
- sale_order_obj = self.pool.get('sale.order')
- pur_obj = self.pool.get('purchase.order')
- mod_pur = modules.search(cr, uid, [('name','=','purchase')])
- mod_brw = modules.browse(cr,uid,mod_pur)[0]
- if (mod_brw.state == 'installed'):
- so = sale_order_obj.browse(cr, uid, ref("sale_order_so1"))
- pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
- po = pur_obj.browse(cr, uid, pur_id)[0]
- pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
- import netsvc
- wf_service = netsvc.LocalService("workflow")
- for pick in pick_ser_id:
- wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
--
- I verify that picking for purchase order has been done.
--
- !python {model: sale.order}: |
- from tools.translate import _
- modules = self.pool.get('ir.module.module')
- mod_pur = modules.search(cr, uid, [('name','=','purchase')])
- mod_brw = modules.browse(cr,uid,mod_pur)[0]
- if(mod_brw.state == 'installed'):
- pur_obj = self.pool.get('purchase.order')
- so = self.browse(cr, uid, ref("sale_order_so1"))
- pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
- po = pur_obj.browse(cr, uid, pur_id)[0]
+ picking, = po.picking_ids
+ stock_partial_picking = self.pool.get('stock.partial.picking')
+ partial_id = stock_partial_picking.create(cr, uid, {},
+ context={'active_model': 'stock.picking',
+ 'active_ids': [picking.id]})
+ stock_partial_picking.do_partial(cr, uid, [partial_id])
picking_obj = self.pool.get('stock.picking')
- ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
- assert ids, _('Picking is not in the done state!')
+ ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id),('state', '=', 'done')])
+ assert ids, 'Picking should be marked done!'
-
- I verify that a "Picked" has been set to true
+ I verify that the sale order is marked as delivered
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so1"))
- assert (so.shipped == True), "Picking is not done."
+ assert (so.shipped == True), "Sale order is not marked as delivered"
-
I verify that a sale order is in done state
-
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py
index 4b1e4511021..4d9e0058e94 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.py
+++ b/addons/sale/wizard/sale_make_invoice_advance.py
@@ -27,8 +27,8 @@ class sale_advance_payment_inv(osv.osv_memory):
_columns = {
'product_id': fields.many2one('product.product', 'Advance Product', required=True,
help="Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field."),
- 'amount': fields.float('Advance Amount', size=(16, 2), required=True, help="The amount to be invoiced in advance."),
- 'qtty': fields.float('Quantity', size=(16, 2), required=True),
+ 'amount': fields.float('Advance Amount', digits=(16, 2), required=True, help="The amount to be invoiced in advance."),
+ 'qtty': fields.float('Quantity', digits=(16, 2), required=True),
}
_defaults = {
'qtty': 1.0
@@ -173,4 +173,4 @@ class sale_open_invoice(osv.osv_memory):
sale_open_invoice()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/share/res_users.py b/addons/share/res_users.py
index 81683066220..07031ab3845 100644
--- a/addons/share/res_users.py
+++ b/addons/share/res_users.py
@@ -24,7 +24,7 @@ class res_groups(osv.osv):
_name = "res.groups"
_inherit = 'res.groups'
_columns = {
- 'share': fields.boolean('Share Group', groups='share.group_share', readonly=True,
+ 'share': fields.boolean('Share Group', readonly=True,
help="Group created to set access rights for sharing data with some users.")
}
res_groups()
@@ -33,7 +33,7 @@ class res_users(osv.osv):
_name = 'res.users'
_inherit = 'res.users'
_columns = {
- 'share': fields.boolean('Share User', groups='share.group_share', readonly=True,
+ 'share': fields.boolean('Share User', readonly=True,
help="External user with limited access, created only for the purpose of sharing data.")
}
res_users()
diff --git a/addons/stock/i18n/zh_TW.po b/addons/stock/i18n/zh_TW.po
index b59cc94b1b2..93cab1256ae 100644
--- a/addons/stock/i18n/zh_TW.po
+++ b/addons/stock/i18n/zh_TW.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
-"PO-Revision-Date: 2011-01-28 03:06+0000\n"
+"PO-Revision-Date: 2011-09-27 10:25+0000\n"
"Last-Translator: Walter Cheuk \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 04:57+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2011-09-28 05:19+0000\n"
+"X-Generator: Launchpad (build 14049)\n"
#. module: stock
#: field:product.product,track_outgoing:0
@@ -163,7 +163,7 @@ msgstr ""
#: view:report.stock.move:0
#: field:stock.change.standard.price,stock_journal:0
msgid "Stock journal"
-msgstr ""
+msgstr "庫存日誌"
#. module: stock
#: view:report.stock.move:0
@@ -475,7 +475,7 @@ msgstr "調動統計"
#. module: stock
#: view:stock.production.lot:0
msgid "Product Lots Filter"
-msgstr ""
+msgstr "生產批次篩選"
#. module: stock
#: report:lot.stock.overview:0
@@ -636,7 +636,7 @@ msgstr ""
#. module: stock
#: constraint:stock.move:0
msgid "You try to assign a lot which is not from the same product"
-msgstr ""
+msgstr "指定了不同產品的批次"
#. module: stock
#: view:res.partner:0
@@ -1152,7 +1152,7 @@ msgstr ""
#: code:addons/stock/stock.py:1319
#, python-format
msgid "is in draft state."
-msgstr "尚在草案階段"
+msgstr "尚在草案階段。"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_tracking_form
@@ -1402,6 +1402,12 @@ msgid ""
"* Done: has been processed, can't be modified or cancelled anymore\n"
"* Cancelled: has been cancelled, can't be confirmed anymore"
msgstr ""
+"* 草案(Draft): 未確認,不會安排處理直至確認\n"
+"* 確認(Confirmed): 仍等候產品有貨供應\n"
+"* 供貨(Available): 已預留產品,只等候確認\n"
+"* 等待(Waiting): 自動供貨前要再等候下一步 (如於「接單生產(Make-To-Order)」流程)\n"
+"* 完成(Done): 已處理,無法再修改或取消\n"
+"* 取消(Cancelled): 已取消,無法再確認"
#. module: stock
#: help:stock.location,company_id:0
@@ -1440,6 +1446,11 @@ msgid ""
" When the picking is done the state is 'Done'. \n"
"The state is 'Waiting' if the move is waiting for another one."
msgstr ""
+"建立調動時先處於「草案(Draft)」狀態。\n"
+" 然後,如安排者找不到貨,設為「無貨(Not Available)」狀態。\n"
+" 當已預留貨物,變成「供貨(Available)」。\n"
+" 完成提貨後狀態為「完成(Done)」。 \n"
+"如調動正等候其他工作完成,狀態為「等待(Waiting)」。"
#. module: stock
#: selection:report.stock.inventory,location_type:0
@@ -1486,7 +1497,7 @@ msgstr "貨幣"
#. module: stock
#: field:product.product,track_production:0
msgid "Track Manufacturing Lots"
-msgstr ""
+msgstr "追蹤生產批次"
#. module: stock
#: code:addons/stock/wizard/stock_inventory_merge.py:44
@@ -1537,7 +1548,7 @@ msgstr "貨架 2"
#. module: stock
#: field:stock.report.tracklots,tracking_id:0
msgid "Tracking lot"
-msgstr ""
+msgstr "追蹤批次"
#. module: stock
#: view:stock.picking:0
@@ -1558,7 +1569,7 @@ msgstr "本地化"
#. module: stock
#: model:ir.model,name:stock.model_stock_report_tracklots
msgid "Stock report by tracking lots"
-msgstr ""
+msgstr "按追蹤批次庫存報告"
#. module: stock
#: code:addons/stock/product.py:370
@@ -2119,7 +2130,7 @@ msgstr ""
#: code:addons/stock/stock.py:2210
#, python-format
msgid "You can only delete draft moves."
-msgstr "不能刪除調動草案"
+msgstr "只能刪除調動草案。"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:97
@@ -2542,7 +2553,7 @@ msgstr "數量(量度單位)"
#, python-format
msgid ""
"You are moving %.2f %s products but only %.2f %s available in this lot."
-msgstr ""
+msgstr "您正移動%.2f件 %s 產品,但此批次只有%.2f件 %s。"
#. module: stock
#: view:stock.move:0
@@ -3032,7 +3043,7 @@ msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Lot Inventory"
-msgstr ""
+msgstr "批次存貨"
#. module: stock
#: view:stock.move:0
@@ -3501,6 +3512,11 @@ msgid ""
" When the picking it done the state is 'Done'. \n"
"The state is 'Waiting' if the move is waiting for another one."
msgstr ""
+"建立調動時先處於「草案(Draft)」狀態。\n"
+" 然後設為「確認(Confirmed)」狀態。\n"
+" 如庫存有貨,變成「供貨(Available)」。\n"
+" 完成提貨後狀態為「完成(Done)」。 \n"
+"如調動正等候其他工作完成,狀態為「等待(Waiting)」。"
#. module: stock
#: view:board.board:0
@@ -3720,7 +3736,7 @@ msgstr ""
#. module: stock
#: constraint:stock.move:0
msgid "You must assign a production lot for this product"
-msgstr "須為此產品分配生產批次"
+msgstr "須為此產品指定生產批次"
#. module: stock
#: view:stock.move:0
@@ -3817,7 +3833,7 @@ msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_report_prodlots
msgid "Stock report by production lots"
-msgstr "生產批次回報之庫存"
+msgstr "按生產批次庫存報告"
#. module: stock
#: view:stock.location:0
@@ -3878,7 +3894,7 @@ msgstr "輸出"
#. module: stock
#: selection:stock.move.split.lines,action:0
msgid "Keep in one lot"
-msgstr ""
+msgstr "保持為同一批次"
#. module: stock
#: view:product.product:0
diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml
index 80d7ed6efa0..a0059ce60d3 100644
--- a/addons/stock/product_view.xml
+++ b/addons/stock/product_view.xml
@@ -120,6 +120,67 @@
+
+
+ Product Kanban
+ product.product
+ kanban
+
+
+
+
+
+