- Send follow-ups
+ Send Follow-Upsir.actions.act_windowaccount.followup.print.allform
diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py
index 80d7a5419e7..22b7fc5f6f2 100644
--- a/addons/account_payment/account_payment.py
+++ b/addons/account_payment/account_payment.py
@@ -87,9 +87,9 @@ class payment_order(osv.osv):
return res
_columns = {
- 'date_scheduled': fields.date('Scheduled date if fixed', states={'done':[('readonly', True)]}, help='Select a date if you have chosen Preferred Date to be fixed.'),
+ 'date_scheduled': fields.date('Scheduled Date', states={'done':[('readonly', True)]}, help='Select a date if you have chosen Preferred Date to be fixed.'),
'reference': fields.char('Reference', size=128, required=1, states={'done': [('readonly', True)]}),
- 'mode': fields.many2one('payment.mode', 'Payment mode', select=True, required=1, states={'done': [('readonly', True)]}, help='Select the Payment Mode to be applied.'),
+ 'mode': fields.many2one('payment.mode', 'Payment Mode', select=True, required=1, states={'done': [('readonly', True)]}, help='Select the Payment Mode to be applied.'),
'state': fields.selection([
('draft', 'Draft'),
('cancel', 'Cancelled'),
@@ -98,14 +98,14 @@ class payment_order(osv.osv):
help='When an order is placed the state is \'Draft\'.\n Once the bank is confirmed the state is set to \'Confirmed\'.\n Then the order is paid the state is \'Done\'.'),
'line_ids': fields.one2many('payment.line', 'order_id', 'Payment lines', states={'done': [('readonly', True)]}),
'total': fields.function(_total, string="Total", type='float'),
- 'user_id': fields.many2one('res.users', 'User', required=True, states={'done': [('readonly', True)]}),
+ 'user_id': fields.many2one('res.users', 'Responsible', required=True, states={'done': [('readonly', True)]}),
'date_prefered': fields.selection([
('now', 'Directly'),
('due', 'Due date'),
('fixed', 'Fixed date')
- ], "Preferred date", change_default=True, required=True, states={'done': [('readonly', True)]}, help="Choose an option for the Payment Order:'Fixed' stands for a date specified by you.'Directly' stands for the direct execution.'Due date' stands for the scheduled date of execution."),
- 'date_created': fields.date('Creation date', readonly=True),
- 'date_done': fields.date('Execution date', readonly=True),
+ ], "Preferred Date", change_default=True, required=True, states={'done': [('readonly', True)]}, help="Choose an option for the Payment Order:'Fixed' stands for a date specified by you.'Directly' stands for the direct execution.'Due date' stands for the scheduled date of execution."),
+ 'date_created': fields.date('Creation Date', readonly=True),
+ 'date_done': fields.date('Execution Date', readonly=True),
'company_id': fields.related('mode', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
}
diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml
index cf91dcc80a2..1577d1b86bd 100644
--- a/addons/account_payment/account_payment_view.xml
+++ b/addons/account_payment/account_payment_view.xml
@@ -112,16 +112,25 @@
-
-
-
-
-
-
-
-
-
+
+
All Feeds
diff --git a/addons/marketing/marketing_view.xml b/addons/marketing/marketing_view.xml
index a697d586cd4..b4c8a295241 100644
--- a/addons/marketing/marketing_view.xml
+++ b/addons/marketing/marketing_view.xml
@@ -2,14 +2,11 @@
-
+
+ sequence="120"/>
diff --git a/addons/marketing_campaign/res_partner_view.xml b/addons/marketing_campaign/res_partner_view.xml
index ebbefeeb1f4..ee619f041e8 100644
--- a/addons/marketing_campaign/res_partner_view.xml
+++ b/addons/marketing_campaign/res_partner_view.xml
@@ -2,27 +2,21 @@
-
-
- res.partner.crm.history.inherit1
- res.partner
- form
-
-
-
- False
-
-
-
+
res.partner.workitem.info.inheritres.partnerform
-
-
-
+
+ False
+
+
+
+
+
+
diff --git a/addons/membership/membership.py b/addons/membership/membership.py
index dc4eadbada9..06b84ec80c5 100644
--- a/addons/membership/membership.py
+++ b/addons/membership/membership.py
@@ -315,11 +315,11 @@ class Partner(osv.osv):
return self._membership_state(*args, **kwargs)
_columns = {
- 'associate_member': fields.many2one('res.partner', 'Associate member',help="A member with whom you want to associate your membership.It will consider the membership state of the associated member."),
+ 'associate_member': fields.many2one('res.partner', 'Associate Member',help="A member with whom you want to associate your membership.It will consider the membership state of the associated member."),
'member_lines': fields.one2many('membership.membership_line', 'partner', 'Membership'),
- 'free_member': fields.boolean('Free member', help = "Select if you want to give membership free of cost."),
+ 'free_member': fields.boolean('Free Member', help = "Select if you want to give membership free of cost."),
'membership_amount': fields.float(
- 'Membership amount', digits=(16, 2),
+ 'Membership Amount', digits=(16, 2),
help = 'The price negotiated by the partner'),
'membership_state': fields.function(
__get_membership_state,
@@ -338,7 +338,7 @@ class Partner(osv.osv):
-Paid Member: A member who has paid the membership amount."""),
'membership_start': fields.function(
_membership_date, multi = 'membeship_start',
- string = 'Start membership date', type = 'date',
+ string = 'Start Membership Date', type = 'date',
store = {
'account.invoice': (_get_invoice_partner, ['state'], 10),
'membership.membership_line': (_get_partner_id, ['state'], 10, ),
@@ -346,7 +346,7 @@ class Partner(osv.osv):
}, help="Date from which membership becomes active."),
'membership_stop': fields.function(
_membership_date,
- string = 'Stop membership date', type='date', multi='membership_stop',
+ string = 'Stop Membership Date', type='date', multi='membership_stop',
store = {
'account.invoice': (_get_invoice_partner, ['state'], 10),
'membership.membership_line': (_get_partner_id, ['state'], 10),
@@ -354,7 +354,7 @@ class Partner(osv.osv):
}, help="Date until which membership remains active."),
'membership_cancel': fields.function(
_membership_date,
- string = 'Cancel membership date', type='date', multi='membership_cancel',
+ string = 'Cancel Membership Date', type='date', multi='membership_cancel',
store = {
'account.invoice': (_get_invoice_partner, ['state'], 11),
'membership.membership_line': (_get_partner_id, ['state'], 10),
diff --git a/addons/membership/membership_data.xml b/addons/membership/membership_data.xml
index 60c21fc6cf6..14fbb00f9a2 100644
--- a/addons/membership/membership_data.xml
+++ b/addons/membership/membership_data.xml
@@ -5,10 +5,10 @@
-
- Member Price
- member_price
-
+
+ Member Price
+ member_price
+
@@ -71,7 +69,7 @@
- -
+ -
@@ -282,7 +280,7 @@
-
+
product.normal.formform
diff --git a/addons/mrp/__openerp__.py b/addons/mrp/__openerp__.py
index 924a2910859..5f723f1b9df 100644
--- a/addons/mrp/__openerp__.py
+++ b/addons/mrp/__openerp__.py
@@ -93,9 +93,9 @@ Dashboard provided by this module:
#TODO: This yml tests are needed to be completely reviewed again because the product wood panel is removed in product demo as it does not suit for new demo context of computer and consultant company
# so the ymls are too complex to change at this stage
'test': [
-# 'test/order_demo.yml',
-# 'test/order_process.yml',
-# 'test/cancel_order.yml',
+ 'test/order_demo.yml',
+ 'test/order_process.yml',
+ 'test/cancel_order.yml',
],
'installable': True,
'application': True,
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index c4a4d8df895..56ac47095a1 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -206,7 +206,7 @@ class mrp_bom(osv.osv):
'product_id': fields.many2one('product.product', 'Product', required=True),
'product_uos_qty': fields.float('Product UOS Qty'),
'product_uos': fields.many2one('product.uom', 'Product UOS', help="Product UOS (Unit of Sale) is the unit of measurement for the invoicing and promotion of stock."),
- 'product_qty': fields.float('Product Qty', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
+ 'product_qty': fields.float('Product Quantity', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),
'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),
'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% within the production process."),
@@ -456,7 +456,7 @@ class mrp_production(osv.osv):
'product_id': fields.many2one('product.product', 'Product', required=True, readonly=True, states={'draft':[('readonly',False)]}),
'product_qty': fields.float('Product Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True, states={'draft':[('readonly',False)]}, readonly=True),
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, states={'draft':[('readonly',False)]}, readonly=True),
- 'product_uos_qty': fields.float('Product UoS Qty', states={'draft':[('readonly',False)]}, readonly=True),
+ 'product_uos_qty': fields.float('Product UoS Quantity', states={'draft':[('readonly',False)]}, readonly=True),
'product_uos': fields.many2one('product.uom', 'Product UoS', states={'draft':[('readonly',False)]}, readonly=True),
'location_src_id': fields.many2one('stock.location', 'Raw Materials Location', required=True,
@@ -474,7 +474,7 @@ class mrp_production(osv.osv):
'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', readonly=True, states={'draft':[('readonly',False)]}, help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."),
'picking_id': fields.many2one('stock.picking', 'Picking List', readonly=True, ondelete="restrict",
help="This is the Internal Picking List that brings the finished product to the production plan"),
- 'move_prod_id': fields.many2one('stock.move', 'Move product', readonly=True),
+ 'move_prod_id': fields.many2one('stock.move', 'Product Move', readonly=True),
'move_lines': fields.many2many('stock.move', 'mrp_production_move_ids', 'production_id', 'move_id', 'Products to Consume', domain=[('state','not in', ('done', 'cancel'))], states={'done':[('readonly',True)]}),
'move_lines2': fields.many2many('stock.move', 'mrp_production_move_ids', 'production_id', 'move_id', 'Consumed Products', domain=[('state','in', ('done', 'cancel'))]),
'move_created_ids': fields.one2many('stock.move', 'production_id', 'Products to Produce', domain=[('state','not in', ('done', 'cancel'))], states={'done':[('readonly',True)]}),
@@ -1108,7 +1108,7 @@ class mrp_production_product_line(osv.osv):
'product_id': fields.many2one('product.product', 'Product', required=True),
'product_qty': fields.float('Product Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
- 'product_uos_qty': fields.float('Product UOS Qty'),
+ 'product_uos_qty': fields.float('Product UOS Quantity'),
'product_uos': fields.many2one('product.uom', 'Product UOS'),
'production_id': fields.many2one('mrp.production', 'Production Order', select=True),
}
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 86b0fcee0d5..2d3e90c341a 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -2,17 +2,21 @@
-
+
+
-
+
+ sequence="5"/>
- Work Centers
+ Work Centerir.actions.act_windowmrp.workcenterform
@@ -1024,7 +1053,7 @@
-
+
diff --git a/addons/mrp/test/cancel_order.yml b/addons/mrp/test/cancel_order.yml
index d10b8c1780b..d371edb9382 100644
--- a/addons/mrp/test/cancel_order.yml
+++ b/addons/mrp/test/cancel_order.yml
@@ -1,25 +1,27 @@
-
- I first confirm order for shirt.
+ I first confirm order for PC Assemble + 2GB RAM.
-
- !workflow {model: mrp.production, action: button_confirm, ref: mrp_production_shirt}
+ !workflow {model: mrp.production, action: button_confirm, ref: mrp_production_test1}
-
In order to cancel the production order, I first cancel its picking.
-
!function {model: stock.picking, name: action_cancel}:
- model: mrp.production
- eval: "[obj(ref('mrp_production_shirt')).picking_id.id]"
+ eval: "[obj(ref('mrp_production_test1')).picking_id.id]"
-
Now I cancel the production order.
-
- !workflow {model: mrp.production, action: button_cancel, ref: mrp_production_shirt}
+ !python {model: mrp.production}: |
+ order = self.browse(cr, uid, ref("mrp_production_test1"), context=context)
+ order.action_cancel(context=context)
-
Now I check that the production order is cancelled.
-
- !assert {model: mrp.production, id: mrp_production_shirt}:
+ !assert {model: mrp.production, id: mrp_production_test1}:
- state == 'cancel'
-
I remove cancelled production order.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shirt"), context=context)
+ order = self.browse(cr, uid, ref("mrp_production_test1"), context=context)
self.unlink(cr, uid, [order.id])
diff --git a/addons/mrp/test/order_demo.yml b/addons/mrp/test/order_demo.yml
index 9d9acf7ee5b..552f1b59f8a 100644
--- a/addons/mrp/test/order_demo.yml
+++ b/addons/mrp/test/order_demo.yml
@@ -1,27 +1,12 @@
-
- In order to test process of production order, I create Bill of material of Shelf 100cm.
+ I create Production Order of PC Assemble + 2GB RAM to produce 5.0 Unit.
-
- !record {model: mrp.bom, id: mrp_bom_defaultbomforshelfofcm0}:
- product_id: product.product_product_29
--
- !record {model: mrp.bom, id: mrp_bom_assemblysection1}:
- routing_id: mrp.mrp_routing_0
--
- !record {model: mrp.bom, id: mrp_bom_rearpanelarm1}:
- routing_id: mrp.mrp_routing_0
--
- I create Production Order of Shelf 100cm to produce 5.0 Dozen Unit.
--
- !record {model: mrp.production, id: mrp_production_shelf100cm}:
+ !record {model: mrp.production, id: mrp_production_test1}:
+ product_id: product.product_product_4
+ product_qty: 5.0
location_src_id: stock.stock_location_stock
location_dest_id: stock.stock_location_output
- product_id: product.product_product_29
- bom_id: mrp_bom_defaultbomforshelfofcm0
+ bom_id: mrp_bom_24
routing_id: mrp.mrp_routing_1
- product_uom: product.product_uom_dozen
- product_qty: 5.0
--
- !record {model: mrp.workcenter, id: mrp_workcenter_0}:
- product_id: product.product_assembly
-
-
+
+
\ No newline at end of file
diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml
index 80eeca02516..6a70643e972 100644
--- a/addons/mrp/test/order_process.yml
+++ b/addons/mrp/test/order_process.yml
@@ -2,54 +2,14 @@
I compute the production order.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"), context=context)
+ order = self.browse(cr, uid, ref("mrp_production_test1"), context=context)
order.action_compute(context=context)
-
I check production lines after compute.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"), context=context)
+ order = self.browse(cr, uid, ref("mrp_production_test1"), context=context)
assert len(order.product_lines) == 5, "Production lines are not generated proper."
- factor = 12.0*5.0
- sidepanel = False
- woodlintelm = False
- woodmm0 = False
- woodmm10 = False
- metalcleats = False
- for line in order.product_lines:
- if line.product_id.id == ref('product.product_product_41'): #SIDEPAN 2 Unit
- assert not sidepanel, "Production line is already generated for SIDEPAN."
- assert line.product_qty == (2.0*factor), "Qty is not correspond."
- assert line.product_uom.id == ref('product.product_uom_unit'), "UOM is not correspond"
- sidepanel = True
- elif line.product_id.id == ref('product.product_product_45'): #LIN40 4*0.25 Meter
- assert not woodlintelm, "Production line is already generated for LIN40."
- assert line.product_qty == (4*0.25*factor), "Qty is not correspond."
- assert line.product_uom.id == ref('product.product_uom_meter'), "UOM is not correspond"
- woodlintelm = True
- elif line.product_id.id == ref('product.product_product_32'): #WOOD002 0.25 m
- assert not woodmm0, "Production line is already generated for WOOD002."
- assert line.product_qty == (0.25*factor), "Qty is not correspond."
- assert line.product_uom.id == ref('product.product_uom_meter'), "UOM is not correspond"
- woodmm0 = True
- elif line.product_id.id == ref('product.product_product_46'): #METC000 4*3 Unit
- assert not metalcleats, "Production line is already generated for METC000."
- assert line.product_qty == (4*3*factor), "Qty is not correspond."
- assert line.product_uom.id == ref('product.product_uom_unit'), "UOM is not correspond"
- metalcleats = True
- elif line.product_id.id == ref('product.product_product_34'): #WOOD010 0.083*3 m
- assert not woodmm10, "Production line is already generated for WOOD010."
- assert line.product_qty == (0.083*3*factor), "Qty is not correspond."
- assert line.product_uom.id == ref('product.product_uom_meter'), "UOM is not correspond"
- woodmm10 = True
- else:
- raise AssertionError('unknown order line: %s' % line)
- assert sidepanel, "Production line is not generated for SIDEPAN."
- assert woodlintelm, "Production line is not generated for LIN40."
- assert woodmm0, "Production line is not generated for WOOD002."
- assert metalcleats, "Production line is not generated for METC000."
- assert woodmm10, "Production line is not generated for WOOD010."
-
-
Now I check workcenter lines.
-
@@ -57,40 +17,17 @@
from tools import float_compare
def assert_equals(value1, value2, msg, float_compare=float_compare):
assert float_compare(value1, value2, precision_digits=2) == 0, msg
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"), context=context)
+ order = self.browse(cr, uid, ref("mrp_production_test1"), context=context)
assert len(order.workcenter_lines), "Workcenter lines are not generated proper."
- for line in order.workcenter_lines:
- wc = line.workcenter_id
- hours = ((wc.time_start or 0.0)+(wc.time_stop or 0.0)+line.cycle*(wc.time_cycle or 0.0)) * (wc.time_efficiency or 1.0)
- factor = 5*12
- d, m = divmod(factor, wc.capacity_per_cycle)
- cycle = (d + (m and 1.0 or 0.0))
- if line.name == "Short time assembly - Assembly Section":
- assert_equals(line.cycle, (4*cycle), "Computed cycles mismatch: %s" % (line.name))
- assert_equals(line.hour, (2*cycle*4 + hours), "Computed hours mismatch: %s"% (line.name))
- elif line.name == "Short time assembly - Rear Panel SHE100":
- assert_equals(line.cycle, (1*cycle), "Computed cycles mismatch: %s" % (line.name))
- assert_equals(line.hour, (2*cycle + hours), "Computed hours mismatch: %s"% (line.name))
- elif line.name == "long time assembly - Shelf of 100cm":
- assert_equals(line.cycle, (2*cycle), "Computed cycles mismatch: %s" % (line.name))
- assert_equals(line.hour, (5*cycle + hours), "Computed hours mismatch: %s"% (line.name))
- elif line.name == "Testing - Shelf of 100cm":
- assert_equals(line.cycle, (1*cycle), "Computed cycles mismatch: %s" % (line.name))
- assert_equals(line.hour, (1*cycle + hours), "Computed hours mismatch: %s"% (line.name))
- elif line.name == "Packing - Shelf of 100cm":
- assert_equals(line.cycle, (1*cycle), "Computed cycles mismatch: %s" % (line.name))
- assert_equals(line.hour, (0.5*cycle + hours), "Computed hours mismatch: %s"% (line.name))
- else:
- raise AssertionError('unknown workcenter line: %s' % line)
-
I confirm the Production Order.
-
- !workflow {model: mrp.production, action: button_confirm, ref: mrp_production_shelf100cm}
+ !workflow {model: mrp.production, action: button_confirm, ref: mrp_production_test1}
-
I check details of Produce Move of Production Order to trace Final Product.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.state == 'confirmed', "Production order should be confirmed."
assert order.move_created_ids, "Trace Record is not created for Final Product."
move = order.move_created_ids[0]
@@ -121,13 +58,12 @@
assert move_line.product_uos.id == order_line.product_uos.id, "UOS is not correspond in 'To consume line'."
assert move_line.location_id.id == routing_loc or order.location_src_id.id, "Source location is not correspond in 'To consume line'."
assert move_line.location_dest_id.id == source_location_id, "Destination Location is not correspond in 'To consume line'."
-
-
I check details of an Internal Shipment after confirmed production order to bring components in Raw Materials Location.
-
!python {model: mrp.production}: |
procurement = self.pool.get('procurement.order')
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.picking_id, 'Internal Shipment should be created!'
routing_loc = None
@@ -167,12 +103,11 @@
assert shipment_procurement.product_uos.id == order_line.product_uos.id, "UOS is not correspond in procurement."
assert shipment_procurement.location_id.id == order.location_src_id.id, "Location is not correspond in procurement."
assert shipment_procurement.procure_method == order_line.product_id.procure_method, "Procure method is not correspond in procurement."
-
-
- I change production qty with 3 Dozen Shelf 100cm.
+ I change production qty with 3 PC Assemble + 2GB RAM.
-
!python {model: change.production.qty}: |
- context.update({'active_id': ref('mrp_production_shelf100cm')})
+ context.update({'active_id': ref('mrp_production_test1')})
-
!record {model: change.production.qty, id: mrp_production_qty}:
product_qty: 3.0
@@ -183,7 +118,7 @@
I check qty after changed in production order.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.product_qty == 3, "Qty is not changed in order."
move = order.move_created_ids[0]
assert move.product_qty == order.product_qty, "Qty is not changed in move line."
@@ -196,23 +131,23 @@
The production order is Waiting Goods, I forcefully done internal shipment.
-
!python {model: mrp.production}: |
- self.force_production(cr, uid, [ref("mrp_production_shelf100cm")])
+ self.force_production(cr, uid, [ref("mrp_production_test1")])
-
I check that production order in ready state after forcefully done internal shipment.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.state == 'ready', 'Production order should be in Ready State.'
assert order.picking_id.state == 'done', 'Internal shipment should be done.'
-
Now I start production.
-
- !workflow {model: mrp.production, action: button_produce, ref: mrp_production_shelf100cm}
+ !workflow {model: mrp.production, action: button_produce, ref: mrp_production_test1}
-
I check that production order in production state after start production.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.state == 'in_production', 'Production order should be in production State.'
-
I consume raw materials and put one material in scrap location due to waste it.
@@ -220,16 +155,16 @@
!python {model: mrp.production}: |
scrap_location_ids = self.pool.get('stock.location').search(cr, uid, [('scrap_location','=',True)])
scrap_location_id = scrap_location_ids[0]
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
for move in order.move_lines:
move.action_consume(move.product_qty)
- if move.product_id.id == ref("product.product_product_46"):
+ if move.product_id.id == ref("product.product_product_6"):
move.action_scrap(5.0, scrap_location_id)
-
I produce product.
-
!python {model: mrp.product.produce}: |
- context.update({'active_id': ref('mrp_production_shelf100cm')})
+ context.update({'active_id': ref('mrp_production_test1')})
-
!record {model: mrp.product.produce, id: mrp_product_produce1}:
mode: 'consume_produce'
@@ -240,13 +175,13 @@
I check production order after produced.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.state == 'done', "Production order should be closed."
-
I check Total Costs at End of Production.
-
!python {model: mrp.production}: |
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
account_analytic_line = self.pool.get('account.analytic.line')
def rounding(f, r):
import math
@@ -275,28 +210,25 @@
assert line.journal_id.id == wc.costs_journal_id.id, "Account Journal is not correspond."
assert line.product_id.id == wc.product_id.id, "Product is not correspond."
assert line.product_uom_id.id == wc.product_id.uom_id.id, "UOM is not correspond."
-
-
I print a "BOM Structure".
-
!python {model: mrp.production}: |
import netsvc, tools, os
- order = self.browse(cr, uid, ref("mrp_production_shelf100cm"))
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
(data, format) = netsvc.LocalService('report.bom.structure').create(cr, uid, [order.bom_id.id], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp-bom_structure_report.'+format), 'wb+').write(data)
-
-
I print "Production Order".
-
!python {model: mrp.production}: |
import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.mrp.production.order').create(cr, uid, [ref("mrp_production_shelf100cm")], {}, {})
+ (data, format) = netsvc.LocalService('report.mrp.production.order').create(cr, uid, [ref("mrp_production_test1")], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp-production_order_report.'+format), 'wb+').write(data)
-
-
- I print "Work Center Load Report".
+ I print "Work Center Load Report".
-
!python {model: mrp.workcenter}: |
ctx = context.copy()
@@ -304,4 +236,4 @@
data_dict = {'time_unit': 'day', 'measure_unit': 'hours'}
from tools import test_reports
test_reports.try_report_action(cr, uid, 'action_mrp_workcenter_load_wizard',wiz_data=data_dict, context=ctx, our_module='mrp')
-
+
diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml
index 0a16626ecd9..2dccc92a51e 100644
--- a/addons/mrp_operations/mrp_operations_view.xml
+++ b/addons/mrp_operations/mrp_operations_view.xml
@@ -8,18 +8,17 @@
form
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -80,7 +79,7 @@
-
+
@@ -351,7 +350,7 @@
mrp.productionform
-
+
diff --git a/addons/plugin_outlook/plugin_outlook.xml b/addons/plugin_outlook/plugin_outlook.xml
index 0340a7c502f..04e5dca32de 100644
--- a/addons/plugin_outlook/plugin_outlook.xml
+++ b/addons/plugin_outlook/plugin_outlook.xml
@@ -11,10 +11,7 @@
+
+
- Point of Sale
-
-
+ Point of Sale
+
+
+ 150
-
-
-
pos.config.form.viewpos.config
@@ -842,12 +846,12 @@
-
+ domain="[('config_id', '=', active_id)]" />
Point of Sales
@@ -864,8 +868,8 @@
id="menu_pos_config_pos"
groups="group_pos_manager"/>
- pos.session
form
-
-
@@ -650,9 +645,9 @@
-
-
-
+
+
@@ -675,7 +670,7 @@
-
+
account.analytic.account.form.inheritaccount.analytic.account
@@ -687,7 +682,7 @@
-
+
@@ -827,5 +822,6 @@
+
diff --git a/addons/project/res_partner_view.xml b/addons/project/res_partner_view.xml
index 3b019e51af6..09170c43434 100644
--- a/addons/project/res_partner_view.xml
+++ b/addons/project/res_partner_view.xml
@@ -3,35 +3,29 @@
-
- res.partner.crm.history.inherit1
- res.partner
- form
-
-
-
- False
-
-
- res.partner.task.info.inheritres.partnerform
-
-
-
-
-
-
-
-
-
-
-
-
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml
index 4d3d288b981..7208885748c 100644
--- a/addons/project_timesheet/project_timesheet_view.xml
+++ b/addons/project_timesheet/project_timesheet_view.xml
@@ -70,7 +70,7 @@
-
+
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index f768f293434..547902b4635 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -167,7 +167,7 @@ class purchase_order(osv.osv):
help="Put an address if you want to deliver directly from the supplier to the customer. " \
"Otherwise, keep empty to deliver to your own company."
),
- 'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}),
+ 'warehouse_id': fields.many2one('stock.warehouse', 'Destination Warehouse', states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}),
'location_id': fields.many2one('stock.location', 'Destination', required=True, domain=[('usage','<>','view')]),
'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, help="The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities."),
'state': fields.selection(STATE_SELECTION, 'Status', readonly=True, help="The state of the purchase order or the quotation request. A quotation is a purchase order in a 'Draft' state. Then the order has to be confirmed by the user, the state switch to 'Confirmed'. Then the supplier must confirm the order to change the state to 'Approved'. When the purchase order is paid and received, the state becomes 'Done'. If a cancel action occurs in the invoice or in the reception of goods, the state becomes in exception.", select=True),
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 100c60e3f53..ebc7df729b5 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -1,11 +1,13 @@
-
-
+
+
diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py
index b7116e08445..b5b708119cc 100644
--- a/addons/purchase/stock.py
+++ b/addons/purchase/stock.py
@@ -40,6 +40,7 @@ class stock_picking(osv.osv):
'purchase_id': fields.many2one('purchase.order', 'Purchase Order',
ondelete='set null', select=True),
}
+
_defaults = {
'purchase_id': False,
}
@@ -133,5 +134,6 @@ class stock_picking_in(osv.osv):
_columns = {
'purchase_id': fields.many2one('purchase.order', 'Purchase Order',
ondelete='set null', select=True),
+ 'warehouse_id': fields.related('purchase_id', 'warehouse_id', type='many2one', relation='stock.warehouse', string='Destination Warehouse'),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/stock_view.xml b/addons/purchase/stock_view.xml
index f9d6239e0a5..27318adc0f5 100644
--- a/addons/purchase/stock_view.xml
+++ b/addons/purchase/stock_view.xml
@@ -7,11 +7,11 @@
form
-
-
+
+
-
+
Picking liststock.picking
@@ -30,12 +30,15 @@
form
-
+
+
+
+
-
+
stock.picking.in.search
@@ -86,7 +89,7 @@
{'search_default_purchase_id': active_id,'default_type': 'in'}
-
+
Purchase Picking Inheritedpurchase.order
@@ -102,7 +105,7 @@
-
+
Based on Incoming Shipmentsstock.picking
diff --git a/addons/sale/res_partner_view.xml b/addons/sale/res_partner_view.xml
index bb5695eac39..11ac318b7a7 100644
--- a/addons/sale/res_partner_view.xml
+++ b/addons/sale/res_partner_view.xml
@@ -1,7 +1,24 @@
-
+
+ Quotations and Sales
+ sale.order
+ form
+ tree,form,graph
+ {'search_default_partner_id': active_id}
+
+
+ This customer has no quotation or sale order.
+ Click here to create a new quotation.
+ <p>
+ The "Quotation" is the first step of the Sales flow. Manage your sales from quotation to invoice.
+ <p>
+ You will be able to sell products (manage deliveries) as well as services (create projects).
+
+
+
+
res.partner.kanban.saleorder.inheritres.partner
@@ -18,6 +35,22 @@
+
+
+ res.partner.view.buttons
+ res.partner
+ form
+
+
+
+
+
+
+
+
+
diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml
index 645fb2d871b..93d1dfda6d8 100644
--- a/addons/sale/sale_data.xml
+++ b/addons/sale/sale_data.xml
@@ -27,4 +27,28 @@
+
+
+
+ Module sale installed!
+ comment
+ text
+ res.users
+
+ Welcome to OpenERP
+
+ You can click on the top menu Sales to manage your
+ customers, your quotations and sales orders.
+
+ If you need to manage your sales pipeline (leads,
+ opportunities, phonecalls), you can install the CRM module
+ from the Settings top menu.
+
+
+
+
+
+
+
+
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index e7420edb910..03a2f35cbbe 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -1,6 +1,13 @@
+
-
+
+
+
+
@@ -146,10 +153,10 @@
-
+
-
-
+
+
@@ -171,10 +178,9 @@
-
+
-
@@ -197,7 +203,7 @@
@@ -263,6 +269,8 @@
+
+
@@ -297,7 +305,7 @@
-
+
@@ -569,14 +577,6 @@
-
-
form
-
+
@@ -19,8 +19,8 @@
form
-
-
+
+
diff --git a/addons/sale/wizard/sale_make_invoice.py b/addons/sale/wizard/sale_make_invoice.py
index 5265afb9bff..b4b3772a91a 100644
--- a/addons/sale/wizard/sale_make_invoice.py
+++ b/addons/sale/wizard/sale_make_invoice.py
@@ -68,4 +68,4 @@ class sale_make_invoice(osv.osv_memory):
sale_make_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/sale_margin/sale_margin_view.xml b/addons/sale_margin/sale_margin_view.xml
index 4696eec6eb2..30c2a0dea14 100644
--- a/addons/sale_margin/sale_margin_view.xml
+++ b/addons/sale_margin/sale_margin_view.xml
@@ -8,8 +8,13 @@
sale.order
-
-
+
+
+
+
-
+
+
@@ -200,7 +206,7 @@
stock.inventoryform
-
+ Periodical Inventories are used to count the number of products available per location. You can use it once a year when you do the general inventory or whenever you need it, to correct the current stock level of a product.
@@ -271,9 +277,9 @@
child_ids
-
-
-
+
+
+
@@ -287,7 +293,7 @@
-
+
@@ -331,18 +337,25 @@
form
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
-
-
@@ -376,7 +389,7 @@
tree
-
+
@@ -397,7 +410,7 @@
-
+
@@ -415,7 +428,7 @@
stock.production.lotform
-
+ {}This is the list of all the production lots (serial numbers) you recorded. When you select a lot, you can get the upstream or downstream traceability of the products contained in lot. By default, the list is filtred on the serial numbers that are available in your warehouse but you can uncheck the 'Available' button to get all the lots you produced, received or delivered to customers.
@@ -433,8 +446,8 @@
move_history_ids
-
-
+
+
@@ -457,8 +470,8 @@
move_history_ids2
-
-
+
+
@@ -558,11 +571,11 @@
+ string="Internal" domain="[('usage', '=', 'internal')]" help="Internal Locations"/>
+ string="Customer" domain="[('usage', '=', 'customer')]" help="Customer Locations"/>
+ string="Supplier" domain="[('usage', '=', 'supplier')]" help="Supplier Locations"/>
@@ -726,7 +739,7 @@
-
+
@@ -734,7 +747,7 @@