[account*, mrp*, sale*, stock*,...] Convert remaining .yml files to new API
Only purchase still has old api yml files, but they will be converted in the module migration
This commit is contained in:
@@ -1,75 +1,74 @@
|
||||
-
|
||||
Create demo bank statement
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'bank')])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1)
|
||||
import time
|
||||
if journal_id:
|
||||
journal_id = journal_id[0]
|
||||
if journal:
|
||||
vals = {
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal.id,
|
||||
'date': time.strftime('%Y')+'-01-01',
|
||||
'name': "BNK/2014/001",
|
||||
'balance_end_real': '8998.2',
|
||||
'company_id': ref('base.main_company'),
|
||||
'balance_start': 5103.0
|
||||
}
|
||||
self._update(cr, uid, 'account.bank.statement', 'account', vals, 'demo_bank_statement_1')
|
||||
self._update('account.bank.statement', 'account', vals, 'demo_bank_statement_1')
|
||||
vals = {
|
||||
'ref': '',
|
||||
'statement_id': ref('account.demo_bank_statement_1'),
|
||||
'sequence': 1,
|
||||
'company_id': ref('base.main_company'),
|
||||
'name': "SAJ/2014/002 and SAJ/2014/003",
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal.id,
|
||||
'amount': 1175.0,
|
||||
'date': time.strftime('%Y')+'-01-01',
|
||||
'partner_id': ref('base.res_partner_2'),
|
||||
}
|
||||
self._update(cr, uid, 'account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_1')
|
||||
self._update('account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_1')
|
||||
vals = {
|
||||
'ref': '',
|
||||
'statement_id': ref('account.demo_bank_statement_1'),
|
||||
'sequence': 2,
|
||||
'company_id': ref('base.main_company'),
|
||||
'name': "Bank fees",
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal.id,
|
||||
'amount': -32.58,
|
||||
'date': time.strftime('%Y')+'-01-01',
|
||||
}
|
||||
self._update(cr, uid, 'account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_2')
|
||||
self._update('account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_2')
|
||||
vals = {
|
||||
'ref': '',
|
||||
'statement_id': ref('account.demo_bank_statement_1'),
|
||||
'sequence': 3,
|
||||
'company_id': ref('base.main_company'),
|
||||
'name': "Prepayment",
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal.id,
|
||||
'amount': 650.0,
|
||||
'date': time.strftime('%Y')+'-01-01',
|
||||
'partner_id': ref('base.res_partner_12'),
|
||||
}
|
||||
self._update(cr, uid, 'account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_3')
|
||||
self._update('account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_3')
|
||||
vals = {
|
||||
'ref': '',
|
||||
'statement_id': ref('account.demo_bank_statement_1'),
|
||||
'sequence': 4,
|
||||
'company_id': ref('base.main_company'),
|
||||
'name': "First 2000 € of SAJ/2014/001",
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal.id,
|
||||
'amount': 2000.0,
|
||||
'date': time.strftime('%Y')+'-01-01',
|
||||
'partner_id': ref('base.res_partner_12'),
|
||||
}
|
||||
self._update(cr, uid, 'account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_4')
|
||||
self._update('account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_4')
|
||||
vals = {
|
||||
'ref': '',
|
||||
'statement_id': ref('account.demo_bank_statement_1'),
|
||||
'sequence': 5,
|
||||
'company_id': ref('base.main_company'),
|
||||
'name': "Last Year Interests",
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal.id,
|
||||
'amount': 102.78,
|
||||
'date': time.strftime('%Y')+'-01-01',
|
||||
}
|
||||
self._update(cr, uid, 'account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_5')
|
||||
self._update('account.bank.statement.line', 'account', vals, 'demo_bank_statement_line_5')
|
||||
@@ -78,19 +78,19 @@
|
||||
type: 'in_invoice'
|
||||
date_invoice: !eval time.strftime('%Y-%m')+'-01'
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
line_vals = {
|
||||
'invoice_id': ref('demo_invoice_january_wages'),
|
||||
'name': "CEO wages",
|
||||
'price_unit': 10000,
|
||||
}
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('tag_ids', 'in', [ref('account.demo_ceo_wages_account')])])
|
||||
if not account_id:
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_expenses'))])
|
||||
if account_id:
|
||||
line_vals['account_id'] = account_id[0]
|
||||
self._update(cr, uid, 'account.invoice.line', 'account', line_vals, 'ceo_wages_line')
|
||||
self.pool.get('account.invoice').signal_workflow(cr, uid, [ref('demo_invoice_january_wages')], 'invoice_open')
|
||||
account = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_ceo_wages_account')])], limit=1)
|
||||
if not account:
|
||||
account = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses'))], limit=1)
|
||||
if account:
|
||||
line_vals['account_id'] = account.id
|
||||
self._update('account.invoice.line', 'account', line_vals, 'ceo_wages_line')
|
||||
self.env['account.invoice'].browse(ref('demo_invoice_january_wages')).signal_workflow('invoice_open')
|
||||
-
|
||||
!record {model: account.invoice, id: demo_invoice_equipment_purchase}:
|
||||
company_id: base.main_company
|
||||
@@ -98,61 +98,63 @@
|
||||
type: 'in_invoice'
|
||||
date_invoice: !eval time.strftime('%Y-%m')+'-15'
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
line_vals = {
|
||||
'invoice_id': ref('demo_invoice_equipment_purchase'),
|
||||
'name': "Coffee Machine with huge 'employee\'s performances boosting perk'",
|
||||
'price_unit': 4999.99,
|
||||
}
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('tag_ids', 'in', [ref('account.demo_coffee_machine_account')])])
|
||||
account_id = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_coffee_machine_account')])], limit=1).id
|
||||
if not account_id:
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_expenses'))])
|
||||
account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses'))], limit=1).id
|
||||
if account_id:
|
||||
line_vals['account_id'] = account_id[0]
|
||||
tax_id = self.pool.get('account.tax').search(cr, uid, [('type_tax_use', '=', 'purchase'), ('amount', '>', 0)])
|
||||
line_vals['account_id'] = account_id
|
||||
tax_id = self.env['account.tax'].search([('type_tax_use', '=', 'purchase'), ('amount', '>', 0)], limit=1).id
|
||||
if tax_id:
|
||||
line_vals['invoice_line_tax_ids'] = [(6, 0, [tax_id[0]])]
|
||||
self._update(cr, uid, 'account.invoice.line', 'account', line_vals, 'coffee_machine_line')
|
||||
self.pool.get('account.invoice').browse(cr, uid, ref('demo_invoice_equipment_purchase'))._onchange_invoice_line_ids()
|
||||
self.pool.get('account.invoice').signal_workflow(cr, uid, [ref('demo_invoice_equipment_purchase')], 'invoice_open')
|
||||
line_vals['invoice_line_tax_ids'] = [(6, 0, [tax_id])]
|
||||
self._update('account.invoice.line', 'account', line_vals, 'coffee_machine_line')
|
||||
self.env['account.invoice'].browse(ref('demo_invoice_equipment_purchase'))._onchange_invoice_line_ids()
|
||||
self.env['account.invoice'].browse(ref('demo_invoice_equipment_purchase')).signal_workflow('invoice_open')
|
||||
-
|
||||
!python {model: account.bank.statement.line} : |
|
||||
account_ids = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_revenue')), ('tag_ids', 'in', [ref('account.account_tag_financing')])])
|
||||
line = self.browse(cr, uid, ref('account.demo_bank_statement_line_5'))
|
||||
if not line.journal_entry_ids and account_ids:
|
||||
line.write({'account_id': account_ids[0]})
|
||||
!python {model: account.bank.statement.line, id: False} : |
|
||||
account = self.env['account.account'].search([
|
||||
('user_type_id', '=', ref('account.data_account_type_revenue')),
|
||||
('tag_ids', 'in', [ref('account.account_tag_financing')])], limit=1)
|
||||
line = self.env.ref('account.demo_bank_statement_line_5')
|
||||
if not line.journal_entry_ids and account:
|
||||
line.write({'account_id': account.id})
|
||||
line.fast_counterpart_creation()
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
vals = {
|
||||
'company_id': ref('base.main_company'),
|
||||
'journal_id': self.pool.get('account.journal').search(cr, uid, [('type', '=', 'general')])[0],
|
||||
'journal_id': self.env['account.journal'].search([('type', '=', 'general')], limit=1).id,
|
||||
'date': datetime.now().replace(day=1,month=1) - relativedelta(days=1),
|
||||
'ref': 'Company Creation',
|
||||
}
|
||||
self._update(cr, uid, 'account.move', 'account', vals, 'demo_opening_move')
|
||||
self._update('account.move', 'account', vals, 'demo_opening_move')
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
bank_journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'bank')])[0]
|
||||
if bank_journal_id:
|
||||
bank_account_id = self.pool.get('account.journal').browse(cr, uid, bank_journal_id).default_debit_account_id.id
|
||||
fixed_asset_account_ids = self.pool.get('account.account').search(cr, uid, [('user_type_id', 'in', (ref('account.data_account_type_fixed_assets'),ref('account.data_account_type_current_assets')))])
|
||||
equity_account_ids = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_equity')), ('tag_ids', 'in', [ref('account.demo_capital_account')])])
|
||||
if bank_account_id and fixed_asset_account_ids and equity_account_ids:
|
||||
self._update(cr, uid, 'account.move.line', 'account', {
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
bank_journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1)
|
||||
if bank_journal:
|
||||
bank_account_id = bank_journal.default_debit_account_id.id
|
||||
fixed_asset_account_id = self.env['account.account'].search([('user_type_id', 'in', (ref('account.data_account_type_fixed_assets'),ref('account.data_account_type_current_assets')))], limit=1).id
|
||||
equity_account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_equity')), ('tag_ids', 'in', [ref('account.demo_capital_account')])], limit=1).id
|
||||
if bank_account_id and fixed_asset_account_id and equity_account_id:
|
||||
self.with_context({'check_move_validity': False})._update('account.move.line', 'account', {
|
||||
'move_id': ref('account.demo_opening_move'),
|
||||
'name': 'Opening Entry',
|
||||
'debit': 5103,
|
||||
'account_id': bank_account_id}, 'opening_line_1', context={'check_move_validity': False})
|
||||
self._update(cr, uid, 'account.move.line', 'account', {
|
||||
'account_id': bank_account_id}, 'opening_line_1')
|
||||
self.with_context({'check_move_validity': False})._update('account.move.line', 'account', {
|
||||
'move_id': ref('account.demo_opening_move'),
|
||||
'name': 'Opening Entry',
|
||||
'debit': 13447,
|
||||
'account_id': fixed_asset_account_ids[0]}, 'opening_line_2', context={'check_move_validity': False})
|
||||
self._update(cr, uid, 'account.move.line', 'account', {
|
||||
'account_id': fixed_asset_account_id[0]}, 'opening_line_2')
|
||||
self.with_context({'check_move_validity': False})._update('account.move.line', 'account', {
|
||||
'move_id': ref('account.demo_opening_move'),
|
||||
'name': 'Opening Entry',
|
||||
'credit': 18550,
|
||||
'account_id': equity_account_ids[0]}, 'opening_line_3', context={'check_move_validity': False})
|
||||
'account_id': equity_account_id[0]}, 'opening_line_3')
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_expenses')), ('tag_ids', '=', ref('account_tag_operating'))])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses')), ('tag_ids', '=', ref('account_tag_operating'))], limit=1).id
|
||||
vals = {
|
||||
'name': "Discount For Early Payment",
|
||||
'label': 'Discount',
|
||||
@@ -8,11 +8,11 @@
|
||||
'amount': -7,
|
||||
}
|
||||
if account_id:
|
||||
vals['account_id'] = account_id[0]
|
||||
self._update(cr, uid, 'account.operation.template', 'account', vals, 'statement_operation_template_1')
|
||||
vals['account_id'] = account_id
|
||||
self._update('account.operation.template', 'account', vals, 'statement_operation_template_1')
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_expenses')), ('tag_ids', '=', ref('account_tag_operating'))])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses')), ('tag_ids', '=', ref('account_tag_operating'))], limit=1).id
|
||||
vals = {
|
||||
'name': "Bank Fees",
|
||||
'label': 'Bank Fees',
|
||||
@@ -20,11 +20,11 @@
|
||||
'amount': 100.0,
|
||||
}
|
||||
if account_id:
|
||||
vals['account_id'] = account_id[0]
|
||||
self._update(cr, uid, 'account.operation.template', 'account', vals, 'statement_operation_template_2')
|
||||
vals['account_id'] = account_id
|
||||
self._update('account.operation.template', 'account', vals, 'statement_operation_template_2')
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_revenue')), ('tag_ids', '=', ref('account_tag_operating'))])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_revenue')), ('tag_ids', '=', ref('account_tag_operating'))], limit=1).id
|
||||
vals = {
|
||||
'name': "Profit / Loss",
|
||||
'label': 'Profit / Loss',
|
||||
@@ -32,6 +32,6 @@
|
||||
'amount': 100.0,
|
||||
}
|
||||
if account_id:
|
||||
vals['account_id'] = account_id[0]
|
||||
self._update(cr, uid, 'account.operation.template', 'account', vals, 'statement_operation_template_3')
|
||||
vals['account_id'] = account_id
|
||||
self._update('account.operation.template', 'account', vals, 'statement_operation_template_3')
|
||||
-
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
-
|
||||
I select the period and journal for the bank statement
|
||||
-
|
||||
!python {model: account.bank.statement}: |
|
||||
!python {model: account.bank.statement, id: False}: |
|
||||
import time
|
||||
journal = self._default_journal(cr, uid, {'lang': u'en_US', 'tz': False, 'active_model': 'ir.ui.menu',
|
||||
'journal_type': 'bank', 'date': time.strftime("%Y/%m/%d")})
|
||||
journal = self.with_context({'lang': u'en_US', 'tz': False, 'active_model': 'ir.ui.menu',
|
||||
'journal_type': 'bank', 'date': time.strftime("%Y/%m/%d")})._default_journal()
|
||||
assert journal, 'Journal has not been selected'
|
||||
-
|
||||
I create a bank statement with Opening and Closing balance 0.
|
||||
@@ -20,9 +20,9 @@
|
||||
date: !eval time.strftime('%Y-%m-%d')
|
||||
company_id: base.main_company
|
||||
-
|
||||
!python {model: account.bank.statement.line}: |
|
||||
!python {model: account.bank.statement.line, id: False}: |
|
||||
import time
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id.type', '=', 'liquidity'), ('currency_id', '=', False)])[0]
|
||||
account_id = self.env['account.account'].search([('user_type_id.type', '=', 'liquidity'), ('currency_id', '=', False)], limit=1).id
|
||||
vals = {
|
||||
'amount': 1000,
|
||||
'date': time.strftime('%Y-%m-%d'),
|
||||
@@ -30,18 +30,18 @@
|
||||
'name': 'EXT001',
|
||||
'statement_id': ref('account_bank_statement_0'),
|
||||
}
|
||||
self.create(cr, uid, vals)
|
||||
self.create(vals)
|
||||
-
|
||||
I process the bank statement line
|
||||
-
|
||||
!python {model: account.bank.statement}: |
|
||||
account_id = self.pool.get('account.account').create(cr, uid, {'name': 'toto', 'code': 'bidule', 'user_type_id': self.pool.get('ir.model.data').xmlid_to_res_id(cr, uid, 'account.data_account_type_fixed_assets')})
|
||||
statement = self.browse(cr, uid, [ref("account_bank_statement_0")])
|
||||
!python {model: account.bank.statement, id: False}: |
|
||||
account = self.env['account.account'].create({'name': 'toto', 'code': 'bidule', 'user_type_id': self.env.ref('account.data_account_type_fixed_assets').id})
|
||||
statement = self.browse([ref("account_bank_statement_0")])
|
||||
statement.line_ids[0].process_reconciliation(new_aml_dicts=[{
|
||||
'credit': 1000,
|
||||
'debit': 0,
|
||||
'name': 'toto',
|
||||
'account_id': account_id,
|
||||
'account_id': account.id,
|
||||
}])
|
||||
-
|
||||
I modify the bank statement and set the Closing Balance.
|
||||
@@ -51,8 +51,8 @@
|
||||
-
|
||||
I confirm the bank statement using Confirm button
|
||||
-
|
||||
!python {model: account.bank.statement}: |
|
||||
self.button_confirm_bank(cr, uid, [ref("account_bank_statement_0")])
|
||||
!python {model: account.bank.statement, id: False}: |
|
||||
self.browse(ref("account_bank_statement_0")).button_confirm_bank()
|
||||
-
|
||||
I check that bank statement state is now "Closed"
|
||||
-
|
||||
|
||||
@@ -44,9 +44,8 @@
|
||||
-
|
||||
I clicked on Close CashBox button to close the cashbox
|
||||
-
|
||||
!python {model: account.bank.statement}: |
|
||||
self.button_confirm_cash(cr, uid, [ref("account_bank_statement_1")], {"lang": "en_US", "tz": False, "active_model": "account.bank.statement", "active_ids": [ref("account_bank_statement_1")], "active_id": ref("account_bank_statement_1"), })
|
||||
|
||||
!python {model: account.bank.statement, id: False}: |
|
||||
self.browse(ref("account_bank_statement_1")).with_context({"lang": "en_US", "tz": False, "active_model": "account.bank.statement", "active_ids": [ref("account_bank_statement_1")], "active_id": ref("account_bank_statement_1"), }).button_confirm_cash()
|
||||
-
|
||||
I check that bank statement state is now "Closed"
|
||||
-
|
||||
|
||||
@@ -25,10 +25,10 @@
|
||||
-
|
||||
I clicked on Confirm Invoices Button
|
||||
-
|
||||
!python {model: account.invoice.confirm}: |
|
||||
self.invoice_confirm(cr, uid, [ref("account_invoice_confirm_0")], {"lang": 'en_US',
|
||||
!python {model: account.invoice.confirm, id: False}: |
|
||||
self.browse(ref("account_invoice_confirm_0")).with_context({"lang": 'en_US',
|
||||
"tz": False, "active_model": "account.invoice", "active_ids": [ref("account_invoice_state")],
|
||||
"type": "out_invoice", "active_id": ref("account_invoice_state"), })
|
||||
"type": "out_invoice", "active_id": ref("account_invoice_state"), }).invoice_confirm()
|
||||
-
|
||||
I check that customer invoice state is "Open"
|
||||
-
|
||||
@@ -42,17 +42,17 @@
|
||||
assert (len(moves) > 0), 'You should have multiple moves'
|
||||
moves[0].journal_id.write({'update_posted': True})
|
||||
-
|
||||
In order to check the "Cancel Selected Invoices" wizard in openerp I cancelled this open invoice using this wizard
|
||||
In order to check the "Cancel Selected Invoices" wizard in odoo I cancelled this open invoice using this wizard
|
||||
-
|
||||
!record {model: account.invoice.cancel, id: account_invoice_cancel_0}:
|
||||
{}
|
||||
-
|
||||
I clicked on Cancel Invoices Button
|
||||
-
|
||||
!python {model: account.invoice.cancel}: |
|
||||
self.invoice_cancel(cr, uid, [ref("account_invoice_cancel_0")], {"lang": 'en_US',
|
||||
!python {model: account.invoice.cancel, id: False}: |
|
||||
self.browse(ref("account_invoice_cancel_0")).with_context({"lang": 'en_US',
|
||||
"tz": False, "active_model": "account.invoice", "active_ids": [ref("account_invoice_state")],
|
||||
"type": "out_invoice", "active_id": ref("account_invoice_state"), })
|
||||
"type": "out_invoice", "active_id": ref("account_invoice_state"), }).invoice_cancel()
|
||||
-
|
||||
I check that customer invoice is in the cancel state
|
||||
-
|
||||
|
||||
@@ -12,60 +12,60 @@
|
||||
-
|
||||
In order to test the PDF reports defined on an invoice, we will print an Invoice Report
|
||||
-
|
||||
!python {model: account.invoice}: |
|
||||
!python {model: account.invoice, id: False}: |
|
||||
import os
|
||||
import openerp.report
|
||||
from openerp import tools
|
||||
data, format = openerp.report.render_report(cr, uid, [ref('account.account_invoice_customer0')], 'account.report_invoice', {}, {})
|
||||
import odoo.report
|
||||
from odoo import tools
|
||||
data, format = odoo.report.render_report(self.env.cr, self.env.uid, [ref('account.account_invoice_customer0')], 'account.report_invoice', {}, {})
|
||||
if tools.config['test_report_directory']:
|
||||
file(os.path.join(tools.config['test_report_directory'], 'account-invoice.'+format), 'wb+').write(data)
|
||||
-
|
||||
In order to test the PDF reports defined on a partner, we will print the Overdue Report
|
||||
-
|
||||
!python {model: res.partner}: |
|
||||
!python {model: res.partner, id: False}: |
|
||||
import os
|
||||
import openerp.report
|
||||
from openerp import tools
|
||||
data, format = openerp.report.render_report(cr, uid, [ref('base.res_partner_1'),ref('base.res_partner_2'),ref('base.res_partner_12')], 'account.report_overdue', {}, {})
|
||||
import odoo.report
|
||||
from odoo import tools
|
||||
data, format = odoo.report.render_report(self.env.cr, self.env.uid, [ref('base.res_partner_1'),ref('base.res_partner_2'),ref('base.res_partner_12')], 'account.report_overdue', {}, {})
|
||||
if tools.config['test_report_directory']:
|
||||
file(os.path.join(tools.config['test_report_directory'], 'account-report_overdue.'+format), 'wb+').write(data)
|
||||
-
|
||||
Print the Aged Partner Balance Report
|
||||
-
|
||||
!python {model: account.account}: |
|
||||
!python {model: account.account, id: False}: |
|
||||
ctx={}
|
||||
data_dict = {'chart_account_id':ref('account.chart0')}
|
||||
from openerp.tools import test_reports
|
||||
test_reports.try_report_action(cr, uid, 'action_account_aged_balance_view',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
from odoo.tools import test_reports
|
||||
test_reports.try_report_action(self.env.cr, self.env.uid, 'action_account_aged_balance_view',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
-
|
||||
Print the Account Balance Sheet in Normal mode
|
||||
-
|
||||
!python {model: account.account}: |
|
||||
!python {model: account.account, id: False}: |
|
||||
ctx={}
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'account_report_id': ref('account_financial_report_balancesheet0')}
|
||||
from openerp.tools import test_reports
|
||||
test_reports.try_report_action(cr, uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
from odoo.tools import test_reports
|
||||
test_reports.try_report_action(self.env.cr, self.env.uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
-
|
||||
Print the Account Balance Report in Normal mode through the wizard - From Account Chart
|
||||
-
|
||||
!python {model: account.account}: |
|
||||
!python {model: account.account, id: False}: |
|
||||
ctx={}
|
||||
data_dict = {'chart_account_id':ref('account.chart0')}
|
||||
from openerp.tools import test_reports
|
||||
test_reports.try_report_action(cr, uid, 'action_account_balance_menu',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
from odoo.tools import test_reports
|
||||
test_reports.try_report_action(self.env.cr, self.env.uid, 'action_account_balance_menu',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
-
|
||||
Print the General Ledger Report (in Landscape Mode)
|
||||
-
|
||||
!python {model: account.account}: |
|
||||
!python {model: account.account, id: False}: |
|
||||
ctx={}
|
||||
data_dict = {'chart_account_id':ref('account.chart0')}
|
||||
from openerp.tools import test_reports
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
from odoo.tools import test_reports
|
||||
test_reports.try_report_action(self.env.cr, self.env.uid, 'action_account_general_ledger_menu',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
-
|
||||
Print the Profit-Loss Report in Normal Mode
|
||||
-
|
||||
!python {model: account.account}: |
|
||||
!python {model: account.account, id: False}: |
|
||||
ctx={}
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'target_move': 'all', 'account_report_id': ref('account_financial_report_balancesheet0')}
|
||||
from openerp.tools import test_reports
|
||||
test_reports.try_report_action(cr, uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
from odoo.tools import test_reports
|
||||
test_reports.try_report_action(self.env.cr, self.env.uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account')
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
-
|
||||
Creating demo data that require looking for accounts
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
company = self.pool.get('res.users').browse(cr, uid, uid).company_id
|
||||
journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'general'), ('id', '!=', company.currency_exchange_journal_id.id)])
|
||||
expense_account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_expenses'))])
|
||||
xfa_account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_fixed_assets'))])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
company = self.env.user.company_id
|
||||
journal_id = self.env['account.journal'].search([('type', '=', 'general'), ('id', '!=', company.currency_exchange_journal_id.id)], limit=1).id
|
||||
expense_account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses'))], limit=1).id
|
||||
xfa_account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_fixed_assets'))], limit=1).id
|
||||
if not xfa_account_id:
|
||||
xfa_account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_current_assets'))])
|
||||
xfa_account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_current_assets'))], limit=1).id
|
||||
from datetime import datetime, timedelta
|
||||
import time
|
||||
if xfa_account_id and expense_account_id and journal_id:
|
||||
vals = {
|
||||
'journal_id': journal_id[0],
|
||||
'journal_id': journal_id,
|
||||
'name': 'Hardware - 3 Years',
|
||||
'method_number': 3,
|
||||
'account_asset_id': xfa_account_id[0],
|
||||
'account_depreciation_id': xfa_account_id[0],
|
||||
'account_depreciation_expense_id': expense_account_id[0],
|
||||
'account_asset_id': xfa_account_id,
|
||||
'account_depreciation_id': xfa_account_id,
|
||||
'account_depreciation_expense_id': expense_account_id,
|
||||
}
|
||||
self._update(cr, uid, 'account.asset.category', 'account_asset', vals, 'account_asset_category_fixedassets0')
|
||||
self._update('account.asset.category', 'account_asset', vals, 'account_asset_category_fixedassets0')
|
||||
vals = {
|
||||
'journal_id': journal_id[0],
|
||||
'journal_id': journal_id,
|
||||
'name': 'Cars - 5 Years',
|
||||
'method_number': 5,
|
||||
'account_asset_id': xfa_account_id[0],
|
||||
'account_depreciation_id': xfa_account_id[0],
|
||||
'account_depreciation_expense_id': expense_account_id[0],
|
||||
'account_asset_id': xfa_account_id,
|
||||
'account_depreciation_id': xfa_account_id,
|
||||
'account_depreciation_expense_id': expense_account_id,
|
||||
}
|
||||
self._update(cr, uid, 'account.asset.category', 'account_asset', vals, 'account_asset_category_fixedassets1')
|
||||
self._update('account.asset.category', 'account_asset', vals, 'account_asset_category_fixedassets1')
|
||||
vals = {
|
||||
'salvage_value': 2000.0,
|
||||
'state': 'open',
|
||||
@@ -38,7 +38,7 @@
|
||||
'value': 12000.0,
|
||||
'category_id': ref('account_asset_category_fixedassets0'),
|
||||
}
|
||||
self._update(cr, uid, 'account.asset.asset', 'account_asset', vals, 'account_asset_asset_vehicles0')
|
||||
self._update('account.asset.asset', 'account_asset', vals, 'account_asset_asset_vehicles0')
|
||||
vals = {
|
||||
'method_end': (datetime.now().replace(month=8, day=11) + timedelta(days=3*365)).strftime('%Y-%m-%d'),
|
||||
'salvage_value': 0.0,
|
||||
@@ -47,7 +47,7 @@
|
||||
'value': 2800.0,
|
||||
'category_id': ref('account_asset_category_fixedassets0'),
|
||||
}
|
||||
self._update(cr, uid, 'account.asset.asset', 'account_asset', vals, 'account_asset_asset_cab0')
|
||||
self._update('account.asset.asset', 'account_asset', vals, 'account_asset_asset_cab0')
|
||||
vals = {
|
||||
'prorata': 1,
|
||||
'salvage_value': 100000.0,
|
||||
@@ -59,4 +59,4 @@
|
||||
'value': 500000.0,
|
||||
'category_id': ref('account_asset_category_fixedassets0'),
|
||||
}
|
||||
self._update(cr, uid, 'account.asset.asset', 'account_asset', vals, 'account_asset_asset_office0')
|
||||
self._update('account.asset.asset', 'account_asset', vals, 'account_asset_asset_office0')
|
||||
|
||||
@@ -28,29 +28,6 @@
|
||||
-
|
||||
!assert {model: account.voucher, id: account_voucher_voucherforaxelor0}:
|
||||
- state == 'draft'
|
||||
# -
|
||||
# I compute the voucher to calculate the taxes by clicking Compute button
|
||||
# -
|
||||
# !workflow {model: account.voucher, action: proforma_voucher, ref: account_voucher_voucherforaxelor0}
|
||||
|
||||
# -
|
||||
# I create voucher by clicking on Create button
|
||||
# -
|
||||
# !workflow {model: account.voucher, action: proforma_voucher, ref: account_voucher_voucherforaxelor0}
|
||||
# -
|
||||
# I clicked on Validate Button
|
||||
# -
|
||||
# !assert {model: account.voucher, id: account_voucher_voucherforaxelor0}:
|
||||
# - state == 'posted'
|
||||
|
||||
# -
|
||||
# I check that Moves get created for this voucher
|
||||
# -
|
||||
# !python {model: account.voucher}: |
|
||||
# acc_id=self.browse(cr, uid, ref("account_voucher_voucherforaxelor0"))
|
||||
# assert(acc_id.move_id)
|
||||
|
||||
|
||||
-
|
||||
Now I create a Vendor Voucher
|
||||
-
|
||||
@@ -75,18 +52,3 @@
|
||||
-
|
||||
!assert {model: account.voucher, id: account_voucher_voucheraxelor0}:
|
||||
- state == 'draft'
|
||||
# -
|
||||
# I create voucher by clicking on Create button
|
||||
# -
|
||||
# !workflow {model: account.voucher, action: proforma_voucher, ref: account_voucher_voucheraxelor0}
|
||||
# -
|
||||
# I check that the voucher state is "posted"
|
||||
# -
|
||||
# !assert {model: account.voucher, id: account_voucher_voucheraxelor0}:
|
||||
# - state == 'posted'
|
||||
# -
|
||||
# I check that moves get created for this voucher
|
||||
# -
|
||||
# !python {model: account.voucher}: |
|
||||
# acc_id=self.browse(cr, uid, ref("account_voucher_voucheraxelor0"))
|
||||
# assert(acc_id.move_id)
|
||||
|
||||
@@ -23,59 +23,3 @@
|
||||
-
|
||||
!assert {model: account.voucher, id: account_voucher_seagate_0}:
|
||||
- state == 'draft'
|
||||
|
||||
# -
|
||||
# I click on post button to post the voucher
|
||||
# -
|
||||
# !workflow {model: account.voucher, action: proforma_voucher, ref: account_voucher_seagate_0}
|
||||
|
||||
# -
|
||||
# Check that the voucher state is Posted
|
||||
# -
|
||||
# !assert {model: account.voucher, id: account_voucher_seagate_0}:
|
||||
# - state == 'posted'
|
||||
# -
|
||||
# I check that move lines are validated but not reconciled
|
||||
# -
|
||||
# !python {model: account.voucher}: |
|
||||
# reconciled = False
|
||||
# for l in self.browse(cr, uid, [ref("account_voucher_seagate_0")])[0].move_ids:
|
||||
# if l.reconcile_id:
|
||||
# reconciled = True
|
||||
# break
|
||||
# assert (not reconciled), "Found reconciled move lines, should not be"
|
||||
# -
|
||||
# I create and post a voucher payment of amount 30000.0 for the partner Seagate
|
||||
# -
|
||||
# !python {model: account.voucher}: |
|
||||
# import time
|
||||
# vals = {}
|
||||
# journal_id = self.default_get(cr, uid, ['journal_id']).get('journal_id',None)
|
||||
# res = self.onchange_partner_id(cr, uid, [], ref("base.res_partner_2"), journal_id, 0.0, 1, ttype='receipt', date=False)
|
||||
# vals = {
|
||||
# 'account_id': ref('account.cash'),
|
||||
# 'amount': 30000.0,
|
||||
# 'company_id': ref('base.main_company'),
|
||||
# 'journal_id': ref('account.bank_journal'),
|
||||
# 'partner_id': ref('base.res_partner_2'),
|
||||
# 'date': time.strftime("%Y-%m-%d"),
|
||||
# 'voucher_type': 'receipt',
|
||||
# }
|
||||
# if not res['value']['line_cr_ids']:
|
||||
# res['value']['line_cr_ids'] = [{'voucher_type': 'cr', 'account_id': ref('account.a_recv'),}]
|
||||
# res['value']['line_cr_ids'][0]['amount'] = 30000.0
|
||||
# vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
|
||||
# id = self.create(cr, uid, vals)
|
||||
# voucher_id = self.browse(cr, uid, id)
|
||||
# assert (voucher_id.state=='draft'), "Voucher is not in draft state"
|
||||
# voucher_id.signal_workflow('proforma_voucher')
|
||||
# -
|
||||
# I check that move lines are reconciled meaning voucher is paid
|
||||
# -
|
||||
# !python {model: account.voucher}: |
|
||||
# reconciled = False
|
||||
# for l in self.browse(cr, uid, [ref("account_voucher_seagate_0")])[0].move_ids:
|
||||
# if l.reconcile_id:
|
||||
# reconciled = True
|
||||
# break
|
||||
# assert reconciled, "Found unreconciled move lines/unpaid voucher"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
-
|
||||
Use database uuid as client_id for OpenERP oauth provider
|
||||
-
|
||||
!python {model: ir.config_parameter}: |
|
||||
oauth = self.pool.get('auth.oauth.provider')
|
||||
oauth.write(cr, uid, [ref('provider_openerp')], {'client_id': self.get_param(cr, uid, 'database.uuid')})
|
||||
!python {model: ir.config_parameter, id: False}: |
|
||||
oauth = self.env['auth.oauth.provider']
|
||||
oauth.browse(ref('provider_openerp')).write({'client_id': self.get_param('database.uuid')})
|
||||
|
||||
@@ -20,19 +20,19 @@
|
||||
-
|
||||
An applicant is interested in the job position. So he sends a resume by email.
|
||||
-
|
||||
!python {model: mail.thread}: |
|
||||
request_file = open(openerp.modules.module.get_module_resource('hr_recruitment','test', 'resume.eml'),'rb')
|
||||
job_id = self.pool["ir.model.data"].xmlid_to_res_id(cr, uid, "hr.job_developer")
|
||||
!python {model: mail.thread, id: False}: |
|
||||
import odoo
|
||||
request_file = open(odoo.modules.module.get_module_resource('hr_recruitment','test', 'resume.eml'),'rb')
|
||||
job_id = self.env.ref('hr.job_developer').id
|
||||
request_message = request_file.read()
|
||||
self.message_process(cr, uid, 'hr.applicant', request_message, custom_values={"job_id": job_id})
|
||||
self.message_process('hr.applicant', request_message, custom_values={"job_id": job_id})
|
||||
-
|
||||
After getting the mail, I check the details of the new applicant.
|
||||
-
|
||||
!python {model: hr.applicant}: |
|
||||
applicant_ids = self.search(cr, uid, [('email_from','=', 'Mr. Richard Anderson <Richard_Anderson@yahoo.com>')])
|
||||
assert applicant_ids, "Applicant is not created after getting the mail"
|
||||
applicant = self.browse(cr, uid, applicant_ids[0], context=context)
|
||||
resume_ids = self.pool.get('ir.attachment').search(cr, uid, [('datas_fname','=','resume.pdf'),('res_model','=',self._name),('res_id','=',applicant.id)])
|
||||
!python {model: hr.applicant, id: False}: |
|
||||
applicant = self.search([('email_from','=', 'Mr. Richard Anderson <Richard_Anderson@yahoo.com>')], limit=1)
|
||||
assert applicant, "Applicant is not created after getting the mail"
|
||||
resume_ids = self.env['ir.attachment'].search([('datas_fname','=','resume.pdf'),('res_model','=',self._name),('res_id','=',applicant.id)])
|
||||
assert applicant.name == "Application for the post of Jr.application Programmer.", "Applicant name does not match."
|
||||
assert applicant.stage_id.id == ref('hr_recruitment.stage_job1'), "Stage should be 'Initial qualification' and is '%s'." % (applicant.stage_id.name)
|
||||
assert applicant.stage_id.sequence == 1, "Applicant stage sequence should be 1."
|
||||
@@ -40,16 +40,17 @@
|
||||
-
|
||||
I assign the Job position to the applicant
|
||||
-
|
||||
!python {model: hr.applicant}: |
|
||||
self.write(cr, uid, [ref('hr_case_programmer')], {'job_id':ref('hr.job_developer')})
|
||||
!python {model: hr.applicant, id: hr_case_programmer}: |
|
||||
self.write({'job_id':ref('hr.job_developer')})
|
||||
-
|
||||
I schedule meeting with applicant for interview.
|
||||
-
|
||||
!python {model: hr.applicant}: |
|
||||
self.action_makeMeeting(cr, uid, [ref('hr_case_programmer')])
|
||||
!python {model: hr.applicant, id: hr_case_programmer}: |
|
||||
self.action_makeMeeting()
|
||||
-
|
||||
I print Applicant fill up the interview quetion
|
||||
-
|
||||
!python {model: hr.applicant}: |
|
||||
!python {model: hr.applicant, id: False}: |
|
||||
context = self.env.context.copy()
|
||||
context.update({'active_model': 'hr.applicant', 'active_ids': [ref("hr_recruitment.hr_case_programmer")], 'active_id': ref("hr_recruitment.hr_case_programmer")})
|
||||
self.action_print_survey(cr, uid, [ref('hr_case_programmer')])
|
||||
self.browse(ref('hr_case_programmer')).with_context(context).action_print_survey()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
-
|
||||
Creating demo data that require looking for accounts
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
vals = {
|
||||
@@ -14,7 +14,7 @@
|
||||
'project_id': ref('project.project_project_2'),
|
||||
'amount': -60.00,
|
||||
}
|
||||
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_requirements')
|
||||
self._update('account.analytic.line', 'hr_timesheet', vals, 'working_hours_requirements')
|
||||
vals = {
|
||||
'name': 'Design and specification',
|
||||
'user_id': ref('base.user_root'),
|
||||
@@ -25,7 +25,7 @@
|
||||
'project_id': ref('project.project_project_2'),
|
||||
'amount': -30.00,
|
||||
}
|
||||
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_design')
|
||||
self._update('account.analytic.line', 'hr_timesheet', vals, 'working_hours_design')
|
||||
vals = {
|
||||
'name': 'Coding and module testing',
|
||||
'user_id': ref('base.user_root'),
|
||||
@@ -36,7 +36,7 @@
|
||||
'project_id': ref('project.project_project_2'),
|
||||
'amount': -90.00,
|
||||
}
|
||||
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_coding')
|
||||
self._update('account.analytic.line', 'hr_timesheet', vals, 'working_hours_coding')
|
||||
vals = {
|
||||
'name': 'Integration and system testing',
|
||||
'user_id': ref('base.user_root'),
|
||||
@@ -47,7 +47,7 @@
|
||||
'project_id': ref('project.project_project_2'),
|
||||
'amount': -30.00,
|
||||
}
|
||||
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_testing')
|
||||
self._update('account.analytic.line', 'hr_timesheet', vals, 'working_hours_testing')
|
||||
vals = {
|
||||
'name': 'Delivery and maintenance',
|
||||
'user_id': ref('base.user_root'),
|
||||
@@ -58,4 +58,4 @@
|
||||
'project_id': ref('project.project_project_2'),
|
||||
'amount': -30.00,
|
||||
}
|
||||
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_maintenance')
|
||||
self._update('account.analytic.line', 'hr_timesheet', vals, 'working_hours_maintenance')
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
-
|
||||
In order to test the PDF reports defined on a l10n_fr, we will print an Account Move Line Report for l10n_fr
|
||||
-
|
||||
!python {model: account.move.line}: |
|
||||
!python {model: account.move.line, id: False}: |
|
||||
import os
|
||||
import openerp.report
|
||||
from openerp import tools
|
||||
data, format = openerp.report.render_report(cr, uid, [], 'l10n_fr.report_l10nfrbilan', {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
|
||||
import odoo.report
|
||||
from odoo import tools
|
||||
data, format = odoo.report.render_report(self.env.cr, self.env.uid, [], 'l10n_fr.report_l10nfrbilan', {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
|
||||
if tools.config['test_report_directory']:
|
||||
file(os.path.join(tools.config['test_report_directory'], 'l10n_fr-bilan_report.'+format), 'wb+').write(data)
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
-
|
||||
!python {model: account.move.line}: |
|
||||
import os
|
||||
import openerp.report
|
||||
from openerp import tools
|
||||
data, format = openerp.report.render_report(cr, uid, [], 'l10n_fr.report_l10nfrresultat', {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
|
||||
import odoo.report
|
||||
from odoo import tools
|
||||
data, format = odoo.report.render_report(self.env.cr, self.env.uid, [], 'l10n_fr.report_l10nfrresultat', {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
|
||||
if tools.config['test_report_directory']:
|
||||
file(os.path.join(tools.config['test_report_directory'], 'l10n_fr-compute_resultant_report.'+format), 'wb+').write(data)
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
-
|
||||
!python {model: ir.model.data}: |
|
||||
warehouse = self.pool['stock.warehouse'].browse(cr, uid, ref('stock.warehouse0'), context=context)
|
||||
!python {model: ir.model.data, id: False}: |
|
||||
warehouse = self.env['stock.warehouse'].browse(ref('stock.warehouse0'))
|
||||
#create xml ids for demo data that are widely used in tests or in other codes, for more convenience
|
||||
xml_references = [
|
||||
{'name':'picking_type_manufacturing','module':'mrp', 'model':'stock.picking.type','res_id': warehouse.manu_type_id.id},
|
||||
]
|
||||
for xml_record in xml_references:
|
||||
xml_ids = self.search(cr, uid, [('module', '=', xml_record['module']), ('model', '=', xml_record['model']), ('name', '=', xml_record['name'])], context=context)
|
||||
xml_ids = self.search([('module', '=', xml_record['module']), ('model', '=', xml_record['model']), ('name', '=', xml_record['name'])]).ids
|
||||
if not xml_ids:
|
||||
self.create(cr, uid, xml_record, context=context)
|
||||
self.create(xml_record)
|
||||
#avoid the xml id and the associated resource being dropped by the orm by manually making a hit on it
|
||||
self._update_dummy(cr, uid, xml_record['model'], xml_record['module'], xml_record['name'])
|
||||
self._update_dummy(xml_record['model'], xml_record['module'], xml_record['name'])
|
||||
@@ -1,14 +1,12 @@
|
||||
-
|
||||
!python {model: mrp.production}: |
|
||||
mo = self.browse(cr, uid, ref('mrp_production_laptop_cust'), context=context)
|
||||
if mo.state != 'done':
|
||||
mo.action_assign()
|
||||
wiz_obj = self.pool['mrp.product.produce']
|
||||
ctx = dict(context, active_id=mo.id)
|
||||
wiz_id = wiz_obj.create(cr, uid, {'product_qty': mo.product_qty, 'lot_id': ref('lot_product_27_0')}, context=ctx)
|
||||
produce_wiz = wiz_obj.browse(cr, uid, wiz_id,context=ctx)
|
||||
!python {model: mrp.production, id: mrp_production_laptop_cust}: |
|
||||
if self.state != 'done':
|
||||
self.action_assign()
|
||||
wiz_obj = self.env['mrp.product.produce']
|
||||
ctx = dict(self.env.context, active_id=self.id)
|
||||
produce_wiz = wiz_obj.with_context(ctx).create({'product_qty': self.product_qty, 'lot_id': ref('lot_product_27_0')})
|
||||
produce_wiz.consume_line_ids.write({'quantity_done': produce_wiz.product_qty})
|
||||
#Produce Product,Post Inventory and Set MO Done.
|
||||
produce_wiz.do_produce()
|
||||
mo.post_inventory()
|
||||
mo.button_mark_done()
|
||||
self.post_inventory()
|
||||
self.button_mark_done()
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
-
|
||||
I compute the data of production order.
|
||||
-
|
||||
!python {model: mrp.production}: |
|
||||
self.action_compute(cr, uid, [ref("mrp_production_mo0")], {"active_ids": [ref("mrp_production_mo0")],"active_id": ref("mrp_production_mo0")})
|
||||
!python {model: mrp.production, id: mrp_production_mo0}: |
|
||||
self.with_context({"active_ids": [ref("mrp_production_mo0")],"active_id": ref("mrp_production_mo0")}).action_compute()
|
||||
-
|
||||
I confirm the production order.
|
||||
-
|
||||
@@ -40,16 +40,16 @@
|
||||
Now I check the stock moves for the byproduct I created in the bill of material.
|
||||
This move is created automatically when I confirmed the production order.
|
||||
-
|
||||
!python {model: stock.move}: |
|
||||
production_order = self.pool.get('mrp.production').browse(cr, uid, ref("mrp_production_mo0"))
|
||||
move_ids = self.search(cr, uid, [('origin','=',production_order.name), ('product_id','=',ref('product.product_delivery_01'))])
|
||||
assert move_ids, 'No moves are created !'
|
||||
assert self.browse(cr, uid, move_ids).product_uom_qty == 3, "Incorrect quantity for byproduct move"
|
||||
!python {model: stock.move, id: False}: |
|
||||
production_order = self.env['mrp.production'].browse(ref("mrp_production_mo0"))
|
||||
move = self.search([('origin','=',production_order.name), ('product_id','=',ref('product.product_delivery_01'))], limit=1)
|
||||
assert move, 'No move are created !'
|
||||
assert move.product_uom_qty == 3, "Incorrect quantity for byproduct move"
|
||||
-
|
||||
I want to start the production so I force the reservation of products.
|
||||
-
|
||||
!python {model: mrp.production}: |
|
||||
self.force_production(cr, uid, [ref("mrp_production_mo0")], {"active_ids":[ref("mrp.menu_mrp_production_action")], "active_id": ref("mrp.menu_mrp_production_action"),})
|
||||
!python {model: mrp.production, id: mrp_production_mo0}: |
|
||||
self.with_context({"active_ids":[ref("mrp.menu_mrp_production_action")], "active_id": ref("mrp.menu_mrp_production_action"),}).force_production()
|
||||
-
|
||||
I start the production.
|
||||
-
|
||||
@@ -65,17 +65,15 @@
|
||||
-
|
||||
I finish the production order.
|
||||
-
|
||||
!python {model: mrp.product.produce}: |
|
||||
!python {model: mrp.product.produce, id: mrp_product_produce0}: |
|
||||
ctx = context.copy()
|
||||
ctx['active_id'] = ref("mrp_production_mo0")
|
||||
self.on_change_qty(cr, uid, [ref('mrp_product_produce0')], context=ctx)
|
||||
self.do_produce(cr, uid, [ref("mrp_product_produce0")], {"active_model": "mrp.production", "active_ids":[ref("mrp_production_mo0")], "active_id": ref("mrp_production_mo0")})
|
||||
ctx['active_id'] = self.id
|
||||
self.with_context(ctx).on_change_qty()
|
||||
self.with_context({"active_model": "mrp.production", "active_ids":[ref("mrp_production_mo0")], "active_id": ref("mrp_production_mo0")}).do_produce()
|
||||
-
|
||||
I see that stock moves of External Hard Disk including Headset USB are done now.
|
||||
-
|
||||
!python {model: stock.move}: |
|
||||
production_order = self.pool.get('mrp.production').browse(cr, uid, ref("mrp_production_mo0"))
|
||||
move_ids = self.search(cr, uid, [('origin','=',production_order.name), ('product_id','in',[ref("product.product_delivery_02"),ref("product.product_delivery_01")])])
|
||||
moves = self.browse(cr, uid, move_ids)
|
||||
assert all(move.state == 'done' for move in moves), 'Moves are not done!'
|
||||
|
||||
!python {model: stock.move, id: False}: |
|
||||
production_order = self.env['mrp.production'].browse(ref("mrp_production_mo0"))
|
||||
moves = self.search([('origin','=',production_order.name), ('product_id','in',[ref("product.product_delivery_02"),ref("product.product_delivery_01")])])
|
||||
assert all(moves.state == 'done' for moves in moves), 'Moves are not done
|
||||
|
||||
@@ -8,18 +8,18 @@
|
||||
-
|
||||
I open margin for PC-DEM
|
||||
-
|
||||
!python {model: product.margin}: |
|
||||
self.action_open_window(cr, uid, [ref("product_margin_wiz0")], {"lang": 'en_US',
|
||||
!python {model: product.margin, id: False}: |
|
||||
self.browse(ref('product_margin_wiz0')).with_context({"lang": 'en_US',
|
||||
"search_default_filter_to_sell": "1", "tz": False, "active_model": "product.product", "disable_log": True,
|
||||
"active_ids": [ref("product.product_product_5")], "active_id": ref("product.product_product_5")})
|
||||
"active_ids": [ref("product.product_product_5")], "active_id": ref("product.product_product_5")}).action_open_window()
|
||||
-
|
||||
I read the fields of the product.
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
!python {model: product.product, id: False}: |
|
||||
fields = ['sale_avg_price', 'expected_margin_rate', 'total_margin_rate', 'total_cost', 'sale_num_invoiced',
|
||||
'total_margin', 'sales_gap', 'purchase_num_invoiced', 'expected_margin', 'turnover']
|
||||
self.read(cr, uid, [ref("product_margin_wiz0")], fields, {"lang": 'en_US',
|
||||
self.browse(ref('product_margin_wiz0')).with_context({"lang": 'en_US',
|
||||
"search_default_filter_to_sell": "1", "tz": False, "active_model": "product.product",
|
||||
"bin_size": True, "active_ids": [ref("product.product_product_5")],
|
||||
"active_id": ref("product.product_product_5")})
|
||||
"active_id": ref("product.product_product_5")}).read(fields)
|
||||
|
||||
|
||||
+25
-25
@@ -1,35 +1,35 @@
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'sale')])
|
||||
account_recv_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_receivable'))])
|
||||
account_sale_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_revenue')), ('tag_ids', 'in', [ref('account.account_tag_operating')])])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
journal_id = self.env['account.journal'].search([('type', '=', 'sale')], limit=1).id
|
||||
account_recv_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_receivable'))], limit=1).id
|
||||
account_sale_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_revenue')), ('tag_ids', 'in', [ref('account.account_tag_operating')])], limit=1).id
|
||||
if not account_sale_id:
|
||||
account_sale_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_revenue'))]
|
||||
account_sale_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_revenue'))], limit=1).id
|
||||
if journal_id and account_recv_id:
|
||||
vals = {
|
||||
'currency': ref('base.EUR'),
|
||||
'company_id': ref('base.main_company'),
|
||||
'partner_id': ref('base.res_partner_1'),
|
||||
'journal_id': journal_id[0],
|
||||
'journal_id': journal_id,
|
||||
'team_id': ref('sales_team.team_sales_department'),
|
||||
'state': 'draft',
|
||||
'type': 'out_invoice',
|
||||
'account_id': account_recv_id[0],
|
||||
'account_id': account_recv_id,
|
||||
'name': 'Test invoice 1',
|
||||
}
|
||||
self._update(cr, uid, 'account.invoice', 'sale', vals, 'test_crm_sale_invoice_1')
|
||||
self._update('account.invoice', 'sale', vals, 'test_crm_sale_invoice_1')
|
||||
vals = {
|
||||
'currency': ref('base.EUR'),
|
||||
'company_id': ref('base.main_company'),
|
||||
'partner_id': ref('base.res_partner_1'),
|
||||
'journal_id': journal_id[0],
|
||||
'journal_id': journal_id,
|
||||
'team_id': ref('sales_team.crm_team_1'),
|
||||
'state': 'draft',
|
||||
'type': 'out_invoice',
|
||||
'account_id': account_recv_id[0],
|
||||
'account_id': account_recv_id,
|
||||
'name': 'Test invoice 2',
|
||||
}
|
||||
self._update(cr, uid, 'account.invoice', 'sale', vals, 'test_crm_sale_invoice_2')
|
||||
self._update('account.invoice', 'sale', vals, 'test_crm_sale_invoice_2')
|
||||
if account_sale_id:
|
||||
vals = {
|
||||
'name': '',
|
||||
@@ -37,41 +37,41 @@
|
||||
'invoice_id': ref('test_crm_sale_invoice_1'),
|
||||
'price_unit': 250,
|
||||
'quantity': 1,
|
||||
'account_id': account_sale_id[0],
|
||||
'account_id': account_sale_id,
|
||||
}
|
||||
self._update(cr, uid, 'account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_1_line_1')
|
||||
self._update('account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_1_line_1')
|
||||
vals = {
|
||||
'name': '',
|
||||
'product_id': ref('product.consu_delivery_02'),
|
||||
'invoice_id': ref('test_crm_sale_invoice_1'),
|
||||
'price_unit': 800,
|
||||
'quantity': 2,
|
||||
'account_id': account_sale_id[0],
|
||||
'account_id': account_sale_id,
|
||||
}
|
||||
self._update(cr, uid, 'account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_1_line_2')
|
||||
self._update('account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_1_line_2')
|
||||
vals = {
|
||||
'name': '',
|
||||
'product_id': ref('product.consu_delivery_01'),
|
||||
'invoice_id': ref('test_crm_sale_invoice_1'),
|
||||
'price_unit': 4800,
|
||||
'quantity': 4,
|
||||
'account_id': account_sale_id[0],
|
||||
'account_id': account_sale_id,
|
||||
}
|
||||
self._update(cr, uid, 'account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_1_line_3')
|
||||
self._update('account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_1_line_3')
|
||||
vals = {
|
||||
'name': '',
|
||||
'product_id': ref('product.consu_delivery_01'),
|
||||
'invoice_id': ref('test_crm_sale_invoice_2'),
|
||||
'price_unit': 500,
|
||||
'quantity': 1,
|
||||
'account_id': account_sale_id[0],
|
||||
'account_id': account_sale_id,
|
||||
}
|
||||
self._update(cr, uid, 'account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_2_line_1')
|
||||
self.pool.get('account.invoice').signal_workflow(cr, uid, [ref('test_crm_sale_invoice_1')], 'invoice_open')
|
||||
self.pool.get('account.invoice').signal_workflow(cr, uid, [ref('test_crm_sale_invoice_2')], 'invoice_open')
|
||||
bank_journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'bank')])
|
||||
self._update('account.invoice.line', 'sale', vals, 'test_crm_sale_invoice_2_line_1')
|
||||
self.env['account.invoice'].browse(ref('test_crm_sale_invoice_1')).signal_workflow('invoice_open')
|
||||
self.env['account.invoice'].browse(ref('test_crm_sale_invoice_2')).signal_workflow('invoice_open')
|
||||
bank_journal_id = self.env['account.journal'].search([('type', '=', 'bank')], limit=1).id
|
||||
if bank_journal_id:
|
||||
bank_journal_id = bank_journal_id[0]
|
||||
self.pool.get('account.invoice').pay_and_reconcile(cr, uid, [ref('test_crm_sale_invoice_1')], bank_journal_id[0], 1850)
|
||||
self.pool.get('account.invoice').pay_and_reconcile(cr, uid, [ref('test_crm_sale_invoice_2')], bank_journal_id[0], 500)
|
||||
bank_journal_id = bank_journal_id
|
||||
self.env['account.invoice'].browse(ref('test_crm_sale_invoice_1')).pay_and_reconcile(bank_journal_id[0], 1850)
|
||||
self.env['account.invoice'].browse(ref('test_crm_sale_invoice_2')).pay_and_reconcile(bank_journal_id[0], 500)
|
||||
-
|
||||
|
||||
@@ -32,10 +32,10 @@
|
||||
-
|
||||
And set routes on product to be MTO and manufacture
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
route_warehouse0_manufacture = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock.warehouse0')).manufacture_pull_id.route_id.id
|
||||
route_warehouse0_mto = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock.warehouse0')).mto_pull_id.route_id.id
|
||||
self.write(cr, uid, ref('product_manu'), { 'route_ids': [(6, 0, [route_warehouse0_mto,route_warehouse0_manufacture])]}, context=context)
|
||||
!python {model: product.product, id: product_manu}: |
|
||||
route_warehouse0_manufacture_id = self.env['stock.warehouse'].browse(ref('stock.warehouse0')).manufacture_pull_id.route_id.id
|
||||
route_warehouse0_mto_id = self.env['stock.warehouse'].browse(ref('stock.warehouse0')).mto_pull_id.route_id.id
|
||||
self.write({'route_ids': [(6, 0, [route_warehouse0_mto_id, route_warehouse0_manufacture_id])]})
|
||||
-
|
||||
I create a sales order
|
||||
-
|
||||
@@ -53,13 +53,13 @@
|
||||
-
|
||||
Confirm sales order
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, [ref("sale_order_product_manu")], context=context)
|
||||
!python {model: sale.order, id: sale_order_product_manu}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
I run scheduler.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
self.run_scheduler(cr, uid)
|
||||
!python {model: procurement.order, id: False}: |
|
||||
self.run_scheduler()
|
||||
-
|
||||
Check the propagation when we cancel the main procurement
|
||||
* Retrieve related procurements and check that there are all running
|
||||
@@ -67,30 +67,30 @@
|
||||
* Cancel the main procurement
|
||||
* Check that all procurements related and the purchase order has been well cancelled
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
!python {model: procurement.order, id: False}: |
|
||||
# Retrieve related procu
|
||||
so = self.pool.get('sale.order').browse(cr, uid, ref('sale_order_product_manu'))
|
||||
procu_ids = self.search(cr, uid, [('group_id.name', '=', so.name)])
|
||||
assert len(procu_ids)>0, 'No procurements are found for sale order "%s" (with id : %d)' %(so.name, so.id)
|
||||
so = self.env['sale.order'].browse(ref('sale_order_product_manu'))
|
||||
procus = self.search([('group_id.name', '=', so.name)])
|
||||
assert len(procus.ids)>0, 'No procurements are found for sale order "%s" (with id : %d)' %(so.name, so.id)
|
||||
|
||||
# Check that all procurements are running
|
||||
for procu in self.browse(cr, uid, procu_ids, context=context):
|
||||
for procu in procus:
|
||||
assert procu.state == u'running', 'Procurement with id %d should be "running" but is with a state : %s!' %(procu.id, procu.state)
|
||||
|
||||
# Check that one production order exist
|
||||
prodor_ids = [proc.production_id for proc in self.browse(cr, uid, procu_ids) if proc.production_id]
|
||||
prodor_ids = [proc.production_id for proc in procus if proc.production_id]
|
||||
assert len(prodor_ids) > 0, 'No production order found !'
|
||||
|
||||
# Cancel the main procurement
|
||||
main_procu_id = self.search(cr, uid, [('origin', '=', so.name)])
|
||||
assert len(main_procu_id) == 1, 'Main procurement not identified !'
|
||||
self.cancel(cr, uid, main_procu_id,context=context)
|
||||
assert self.browse(cr, uid, main_procu_id[0]).state == u'cancel', 'Main procurement should be cancelled !'
|
||||
main_procu = self.search([('origin', '=', so.name)])
|
||||
assert len(main_procu.ids) == 1, 'Main procurement not identified !'
|
||||
main_procu.cancel()
|
||||
assert main_procu[0].state == u'cancel', 'Main procurement should be cancelled !'
|
||||
|
||||
# Check that all procurements related are cancelled
|
||||
for procu in self.browse(cr, uid, procu_ids, context=context):
|
||||
for procu in procus:
|
||||
assert procu.state == u'cancel', 'Procurement with id %d should be with the state "cancel" but is with a state : %s!' %(procu.id, procu.state)
|
||||
|
||||
# Check that the production order is cancelled
|
||||
for prodor in self.pool.get('mrp.production').browse(cr, uid, [prodor.id for prodor in prodor_ids], context=context):
|
||||
for prodor in self.env['mrp.production'].browse([prodor.id for prodor in prodor_ids]):
|
||||
assert prodor.state == u'cancel', 'Production order %d should be cancelled but is in state : %s!' %(prodor.id, prodor.state)
|
||||
|
||||
@@ -39,10 +39,10 @@
|
||||
-
|
||||
I add the routes manufacture and mto to the product
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
route_warehouse0_manufacture = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock.warehouse0')).manufacture_pull_id.route_id.id
|
||||
route_warehouse0_mto = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock.warehouse0')).mto_pull_id.route_id.id
|
||||
self.write(cr, uid, ref('product_product_slidermobile0'), { 'route_ids': [(6, 0, [route_warehouse0_mto,route_warehouse0_manufacture])]}, context=context)
|
||||
!python {model: product.product, id: product_product_slidermobile0}: |
|
||||
route_warehouse0_manufacture_id = self.env['stock.warehouse'].browse(ref('stock.warehouse0')).manufacture_pull_id.route_id.id
|
||||
route_warehouse0_mto_id = self.env['stock.warehouse'].browse(ref('stock.warehouse0')).mto_pull_id.route_id.id
|
||||
self.write({'route_ids': [(6, 0, [route_warehouse0_mto_id,route_warehouse0_manufacture_id])]})
|
||||
-
|
||||
I create a Bill of Material record for Slider Mobile
|
||||
-
|
||||
@@ -77,42 +77,36 @@
|
||||
-
|
||||
I confirm the sale order
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, [ref("sale_order_so0")], context=context)
|
||||
!python {model: sale.order, id: sale_order_so0}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
I verify that a procurement has been generated for sale order
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
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)])
|
||||
assert proc_ids, 'No Procurements!'
|
||||
!python {model: procurement.order, id: False}: |
|
||||
so = self.env['sale.order'].browse(ref("sale_order_so0"))
|
||||
procs = self.search([('origin','=',so.name)])
|
||||
assert procs, 'No Procurements!'
|
||||
-
|
||||
Then I click on the "Run Procurement" button
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
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','like',so.name)])
|
||||
self.run(cr, uid, proc_ids)
|
||||
!python {model: procurement.order, id: False}: |
|
||||
so = self.env['sale.order'].browse(ref("sale_order_so0"))
|
||||
procs = self.search([('origin','like',so.name)])
|
||||
procs.run()
|
||||
-
|
||||
I verify that a procurement state is "running"
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
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','like',so.name)])
|
||||
!python {model: procurement.order, id: False}: |
|
||||
so = self.env['sale.order'].browse(ref("sale_order_so0"))
|
||||
procs = self.search([('origin','like',so.name)])
|
||||
# Check that all procurement are running
|
||||
for procu in self.browse(cr,uid,proc_ids,context=context):
|
||||
for procu in procs:
|
||||
assert procu.state == u'running', 'Procurement with id %d should be with a state "running" but is with a state : %s!' %(procu.id,procu.state)
|
||||
-
|
||||
I verify that a manufacturing order has been generated, and that its name and reference are correct
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
mnf_obj = self.pool.get('mrp.production')
|
||||
so = self.browse(cr, uid, ref("sale_order_so0"))
|
||||
mnf_id = mnf_obj.search(cr, uid, [('origin','like',so.name)])
|
||||
assert mnf_id, 'Manufacturing order has not been generated'
|
||||
mo = mnf_obj.browse(cr, uid, mnf_id)[0]
|
||||
assert mo.sale_name == so.name, 'Wrong Name for the Manufacturing Order. Expected %s, Got %s' % (so.name, mo.sale_name)
|
||||
assert mo.sale_ref == so.client_order_ref, 'Wrong Sale Reference for the Manufacturing Order'
|
||||
!python {model: sale.order, id: sale_order_so0}: |
|
||||
mo = self.env['mrp.production'].search([('origin','like',self.name)], limit=1)
|
||||
assert mo, 'Manufacturing order has not been generated'
|
||||
assert mo.sale_name == self.name, 'Wrong Name for the Manufacturing Order. Expected %s, Got %s' % (self.name, mo.sale_name)
|
||||
assert mo.sale_ref == self.client_order_ref, 'Wrong Sale Reference for the Manufacturing Order'
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
-
|
||||
!python {model: res.partner}: |
|
||||
main_warehouse = self.pool.get('stock.warehouse').browse(cr, uid, ref('warehouse0'), context=context)
|
||||
self.write(cr, uid, ref('base.main_partner'), {'property_stock_customer':main_warehouse.lot_stock_id.id})
|
||||
!python {model: res.partner, id: base.main_partner}: |
|
||||
main_warehouse = self.env['stock.warehouse'].browse(ref('warehouse0'))
|
||||
self.write({'property_stock_customer':main_warehouse.lot_stock_id.id})
|
||||
|
||||
-
|
||||
!python {model: ir.model.data}: |
|
||||
main_warehouse = self.pool.get('stock.warehouse').browse(cr, uid, ref('warehouse0'), context=context)
|
||||
!python {model: ir.model.data, id: False}: |
|
||||
main_warehouse = self.env['stock.warehouse'].browse(ref('warehouse0'))
|
||||
|
||||
#create xml ids for demo data that are widely used in tests or in other codes, for more convenience
|
||||
xml_references = [
|
||||
@@ -18,16 +18,16 @@
|
||||
{'name':'picking_type_out','module':'stock', 'model':'stock.picking.type','res_id':main_warehouse.out_type_id.id},
|
||||
]
|
||||
for xml_record in xml_references:
|
||||
xml_ids = self.search(cr, uid, [('module', '=', xml_record['module']), ('model', '=', xml_record['model']), ('name', '=', xml_record['name'])], context=context)
|
||||
xml_ids = self.search([('module', '=', xml_record['module']), ('model', '=', xml_record['model']), ('name', '=', xml_record['name'])]).ids
|
||||
if not xml_ids:
|
||||
self.create(cr, uid, xml_record, context=context)
|
||||
self.create(xml_record)
|
||||
#avoid the xml id and the associated resource being dropped by the orm by manually making a hit on it
|
||||
self._update_dummy(cr, uid, xml_record['model'], xml_record['module'], xml_record['name'])
|
||||
self._update_dummy(xml_record['model'], xml_record['module'], xml_record['name'])
|
||||
|
||||
-
|
||||
!python {model: res.company}: |
|
||||
!python {model: res.company, id: False}: |
|
||||
#create the transit location for each company existing
|
||||
company_ids = self.search(cr, uid, [('internal_transit_location_id', '=', False)], context=context)
|
||||
for company in self.browse(cr, uid, company_ids, context=context):
|
||||
self.create_transit_location(cr, uid, [company.id], context=context)
|
||||
companies = self.search([('internal_transit_location_id', '=', False)])
|
||||
for company in companies:
|
||||
company.create_transit_location()
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
-
|
||||
!python {model: ir.model.data}: |
|
||||
chicago_warehouse = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock_warehouse_shop0'), context=context)
|
||||
!python {model: ir.model.data, id: False}: |
|
||||
chicago_warehouse = self.env['stock.warehouse'].browse(ref('stock_warehouse_shop0'))
|
||||
|
||||
#create xml ids for demo data that are widely used in tests or in other codes, for more convenience
|
||||
xml_references = [
|
||||
@@ -9,11 +9,11 @@
|
||||
{'name':'stock_location_shop0','module':'stock', 'model':'stock.location','res_id': chicago_warehouse.lot_stock_id.id},
|
||||
]
|
||||
for xml_record in xml_references:
|
||||
xml_ids = self.search(cr, uid, [('module', '=', xml_record['module']), ('model', '=', xml_record['model']), ('name', '=', xml_record['name'])], context=context)
|
||||
xml_ids = self.search([('module', '=', xml_record['module']), ('model', '=', xml_record['model']), ('name', '=', xml_record['name'])]).ids
|
||||
if not xml_ids:
|
||||
self.create(cr, uid, xml_record, context=context)
|
||||
self.create(xml_record)
|
||||
#avoid the xml id and the associated resource being dropped by the orm by manually making a hit on it
|
||||
self._update_dummy(cr, uid, xml_record['model'], xml_record['module'], xml_record['name'])
|
||||
self._update_dummy(xml_record['model'], xml_record['module'], xml_record['name'])
|
||||
-
|
||||
!record {model: stock.location, id: location_refrigerator_small}:
|
||||
name: Small Refrigerator
|
||||
@@ -331,11 +331,31 @@
|
||||
location_id: stock.stock_location_shop0
|
||||
location_dest_id: stock.stock_location_customers
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('outgoing_shipment_main_warehouse'),ref('outgoing_shipment_main_warehouse1'),ref('incomming_shipment2'),ref('incomming_shipment1'),ref('incomming_shipment3'),ref('outgoing_chicago_warehouse3'),ref('outgoing_chicago_warehouse2'),ref('outgoing_chicago_warehouse1'),ref('incomming_chicago_warehouse1'),ref('incomming_chicago_warehouse2'),ref('incomming_chicago_warehouse3')], context=context)
|
||||
record = self.browse(cr, uid, ref('outgoing_shipment_main_warehouse1'), context=context)
|
||||
record_chi_in = self.browse(cr, uid, ref('incomming_chicago_warehouse1'), context=context)
|
||||
record_chi_out = self.browse(cr, uid, ref('outgoing_chicago_warehouse1'), context=context)
|
||||
!python {model: stock.picking, id: False}: |
|
||||
self.browse([
|
||||
ref('outgoing_shipment_main_warehouse'),
|
||||
ref('outgoing_shipment_main_warehouse1'),
|
||||
ref('incomming_shipment2'),
|
||||
ref('incomming_shipment1'),
|
||||
ref('incomming_shipment3'),
|
||||
ref('outgoing_chicago_warehouse3'),
|
||||
ref('outgoing_chicago_warehouse2'),
|
||||
ref('outgoing_chicago_warehouse1'),
|
||||
ref('incomming_chicago_warehouse1'),
|
||||
ref('incomming_chicago_warehouse2'),
|
||||
ref('incomming_chicago_warehouse3')
|
||||
]).action_confirm()
|
||||
record = self.browse(ref('outgoing_shipment_main_warehouse1'))
|
||||
record_chi_in = self.browse(ref('incomming_chicago_warehouse1'))
|
||||
record_chi_out = self.browse(ref('outgoing_chicago_warehouse1'))
|
||||
if record.state != 'done' and record_chi_in.state != 'done' and record_chi_out.state != 'done':
|
||||
self.force_assign(cr, uid, [ref('outgoing_shipment_main_warehouse'),ref('outgoing_chicago_warehouse3'),ref('outgoing_shipment_main_warehouse2')], context=context)
|
||||
self.do_transfer(cr, uid, [ref('outgoing_shipment_main_warehouse1'),ref('incomming_chicago_warehouse1'),ref('outgoing_chicago_warehouse1')], context=context)
|
||||
self.browse([
|
||||
ref('outgoing_shipment_main_warehouse'),
|
||||
ref('outgoing_chicago_warehouse3'),
|
||||
ref('outgoing_shipment_main_warehouse2')
|
||||
]).force_assign()
|
||||
self.browse([
|
||||
ref('outgoing_shipment_main_warehouse1'),
|
||||
ref('incomming_chicago_warehouse1'),
|
||||
ref('outgoing_chicago_warehouse1')
|
||||
]).do_transfer()
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
posx: 0
|
||||
|
||||
-
|
||||
!python {model: ir.model.data}: |
|
||||
main_warehouse = self.pool.get('stock.warehouse').browse(cr, uid, ref('warehouse0'), context=context)
|
||||
self.pool.get('stock.location').write(cr, uid, [ref('stock_location_14'), ref('stock_location_components')], {'location_id':main_warehouse.lot_stock_id.id}, context=context)
|
||||
!python {model: ir.model.data, id: False}: |
|
||||
main_warehouse = self.env['stock.warehouse'].browse(ref('warehouse0'))
|
||||
self.env['stock.location'].browse([
|
||||
ref('stock_location_14'),
|
||||
ref('stock_location_components')
|
||||
]).write({'location_id':main_warehouse.lot_stock_id.id})
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
-
|
||||
!python {model: stock.location}: |
|
||||
main_warehouse = self.pool.get('stock.warehouse').browse(cr, uid, ref('warehouse0'), context=context)
|
||||
!python {model: stock.location, id: False}: |
|
||||
main_warehouse = self.env['stock.warehouse'].browse(ref('warehouse0'))
|
||||
main_stock = main_warehouse.lot_stock_id.id
|
||||
stowar_op_ids = self.pool.get('stock.warehouse.orderpoint').search(cr, uid, [], context=context)
|
||||
self.pool.get('stock.warehouse.orderpoint').write(cr,uid,stowar_op_ids,{'location_id':main_stock}, context=context)
|
||||
stowar_ops = self.env['stock.warehouse.orderpoint'].search([])
|
||||
stowar_ops.write({'location_id':main_stock})
|
||||
|
||||
@@ -28,55 +28,70 @@
|
||||
-
|
||||
Confirm and assign picking and prepare partial
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('pick1')], context=context)
|
||||
self.do_prepare_partial(cr, uid, [ref('pick1')], context=context)
|
||||
!python {model: stock.picking, id: pick1}: |
|
||||
self.action_confirm()
|
||||
self.do_prepare_partial()
|
||||
-
|
||||
Put 120 pieces on Pallet 1 (package), 120 pieces on Pallet 2 with lot A and 60 pieces on Pallet 3
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
!python {model: stock.picking, id: pick1}: |
|
||||
#Change quantity of first to 120 and create 2 others quant operations
|
||||
record = self.browse(cr, uid, ref('pick1'), context=context)
|
||||
stock_pack = self.pool.get('stock.pack.operation')
|
||||
stock_quant_pack = self.pool.get('stock.quant.package')
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
stock_quant_pack = self.env['stock.quant.package']
|
||||
#create lot A
|
||||
lot_a = self.pool.get('stock.production.lot').create(cr, uid, {'name': 'Lot A', 'product_id': ref('product1')}, context=context)
|
||||
lot_a = self.env['stock.production.lot'].create({'name': 'Lot A', 'product_id': ref('product1')})
|
||||
#create package
|
||||
package1 = stock_quant_pack.create(cr, uid, {'name': 'Pallet 1'}, context=context)
|
||||
package2 = stock_quant_pack.create(cr, uid, {'name': 'Pallet 2'}, context=context)
|
||||
package3 = stock_quant_pack.create(cr, uid, {'name': 'Pallet 3'}, context=context)
|
||||
package1 = stock_quant_pack.create({'name': 'Pallet 1'})
|
||||
package2 = stock_quant_pack.create({'name': 'Pallet 2'})
|
||||
package3 = stock_quant_pack.create({'name': 'Pallet 3'})
|
||||
#Create package for each line and assign it as result_package_id
|
||||
#create pack operation
|
||||
stock_pack.write(cr, uid, record.pack_operation_ids[0].id, {'result_package_id': package1, 'product_qty': 120})
|
||||
new_pack1 = stock_pack.create(cr, uid, {'product_id': ref('product1'), 'product_uom_id': ref('product.product_uom_unit'), 'picking_id': ref('pick1'), 'pack_lot_ids': [(0, 0, {'lot_id': lot_a, 'qty': 120})], 'result_package_id': package2, 'product_qty': 120, 'location_id': ref('stock_location_suppliers'), 'location_dest_id': ref('stock_location_stock')}, context=context)
|
||||
new_pack2 = stock_pack.create(cr, uid, {'product_id': ref('product1'), 'product_uom_id': ref('product.product_uom_unit'), 'picking_id': ref('pick1'), 'result_package_id': package3, 'product_qty': 60, 'location_id': ref('stock_location_suppliers'), 'location_dest_id': ref('stock_location_stock')}, context=context)
|
||||
self.pack_operation_ids[0].write({'result_package_id': package1.id, 'product_qty': 120})
|
||||
new_pack1 = stock_pack.create({
|
||||
'product_id': ref('product1'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
'picking_id': ref('pick1'),
|
||||
'pack_lot_ids': [(0, 0, {'lot_id': lot_a.id, 'qty': 120})],
|
||||
'result_package_id': package2.id,
|
||||
'product_qty': 120,
|
||||
'location_id': ref('stock_location_suppliers'),
|
||||
'location_dest_id': ref('stock_location_stock')
|
||||
})
|
||||
new_pack2 = stock_pack.create({
|
||||
'product_id': ref('product1'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
'picking_id': ref('pick1'),
|
||||
'result_package_id': package3.id,
|
||||
'product_qty': 60,
|
||||
'location_id': ref('stock_location_suppliers'),
|
||||
'location_dest_id': ref('stock_location_stock')
|
||||
})
|
||||
-
|
||||
Transfer the receipt
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('pick1')], context=context)
|
||||
!python {model: stock.picking, id: pick1}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check the system created 3 quants one with 120 pieces on pallet 1, one with 120 pieces on pallet 2 with lot A and 60 pieces on pallet 3
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product1'))], context=context)
|
||||
assert len(reco_id) == 3, "The number of quants created is not correct"
|
||||
for rec in self.browse(cr, uid, reco_id, context=context):
|
||||
if rec.package_id.name == 'Pallet 1':
|
||||
assert rec.qty == 120, "Should have 120 pieces on pallet 1"
|
||||
elif rec.package_id.name == 'Pallet 2':
|
||||
assert rec.qty == 120, "Should have 120 pieces on pallet 2"
|
||||
elif rec.package_id.name == 'Pallet 3':
|
||||
assert rec.qty == 60, "Should have 60 pieces on pallet 3"
|
||||
!python {model: stock.quant, id: False}: |
|
||||
quants = self.search([('product_id','=',ref('product1'))])
|
||||
assert len(quants.ids) == 3, "The number of quants created is not correct"
|
||||
for quant in quants:
|
||||
if quant.package_id.name == 'Pallet 1':
|
||||
assert quant.qty == 120, "Should have 120 pieces on pallet 1"
|
||||
elif quant.package_id.name == 'Pallet 2':
|
||||
assert quant.qty == 120, "Should have 120 pieces on pallet 2"
|
||||
elif quant.package_id.name == 'Pallet 3':
|
||||
assert quant.qty == 60, "Should have 60 pieces on pallet 3"
|
||||
-
|
||||
Check there is no backorder or extra moves created
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
picking = self.browse(cr, uid, ref('pick1'), context=context)
|
||||
backorder = self.search(cr, uid, [('backorder_id', '=', ref('pick1'))])
|
||||
!python {model: stock.picking, id: pick1}: |
|
||||
backorder = self.search([('backorder_id', '=', ref('pick1'))])
|
||||
assert not backorder, ""
|
||||
#Check extra moves created
|
||||
assert len(picking.move_lines) == 1, ""
|
||||
assert len(self.move_lines) == 1, ""
|
||||
-
|
||||
Make a delivery order of 300 pieces to the customer
|
||||
-
|
||||
@@ -92,33 +107,41 @@
|
||||
-
|
||||
Assign and confirm
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('delivery_order1')], context=context)
|
||||
self.action_assign(cr, uid, [ref('delivery_order1')])
|
||||
!python {model: stock.picking, id: delivery_order1}: |
|
||||
self.action_confirm()
|
||||
self.action_assign()
|
||||
-
|
||||
Instead of doing the 300 pieces, you decide to take pallet 1 (do not mention product in operation here) and 20 pieces from lot A and 10 pieces from pallet 3
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
stock_pack = self.pool.get('stock.pack.operation')
|
||||
self.do_prepare_partial(cr, uid, [ref('delivery_order1')], context=context)
|
||||
delivery_id = self.browse(cr, uid, ref('delivery_order1'), context=context)
|
||||
for rec in delivery_id.pack_operation_ids:
|
||||
!python {model: stock.picking, id: delivery_order1}: |
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
self.do_prepare_partial()
|
||||
for rec in self.pack_operation_ids:
|
||||
if rec.package_id.name == 'Pallet 2':
|
||||
lot_ids = self.pool.get("stock.production.lot").search(cr, uid, [('product_id', '=', ref('product1')), ('name','=','Lot A')])
|
||||
stock_pack.write(cr, uid, [rec.id], {'product_id': ref('product1'), 'product_qty': 20, 'pack_lot_ids': [(0, 0, {'lot_id': lot_ids[0], 'qty': 20})], 'product_uom_id': ref('product.product_uom_unit')}, context=context)
|
||||
lot = self.env["stock.production.lot"].search([('product_id', '=', ref('product1')), ('name','=','Lot A')], limit=1)
|
||||
rec.write({
|
||||
'product_id': ref('product1'),
|
||||
'product_qty': 20,
|
||||
'pack_lot_ids': [(0, 0, {'lot_id': lot.id, 'qty': 20})],
|
||||
'product_uom_id': ref('product.product_uom_unit')
|
||||
})
|
||||
if rec.package_id.name == 'Pallet 3':
|
||||
stock_pack.write(cr, uid, [rec.id], {'product_id': ref('product1'),'product_qty': 10, 'product_uom_id': ref('product.product_uom_unit')}, context=context)
|
||||
rec.write({
|
||||
'product_id': ref('product1'),
|
||||
'product_qty': 10,
|
||||
'product_uom_id': ref('product.product_uom_unit')
|
||||
})
|
||||
-
|
||||
Process this picking
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('delivery_order1')], context=context)
|
||||
!python {model: stock.picking, id: delivery_order1 }: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check the quants that you have 120 pieces pallet 1 in customers, 100 pieces pallet 2 in stock and 20 with customers and 50 in stock, 10 in customers from pallet 3
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product1'))], context=context)
|
||||
for rec in self.browse(cr, uid, reco_id, context=context):
|
||||
!python {model: stock.quant, id: False}: |
|
||||
records = self.search([('product_id','=',ref('product1'))])
|
||||
for rec in records:
|
||||
if rec.package_id.name == 'Pallet 1' and rec.location_id.id == ref('stock_location_customers'):
|
||||
assert rec.qty == 120, "Should have 120 pieces on pallet 1, got " + str(rec.qty)
|
||||
elif rec.package_id.name == 'Pallet 2' and rec.location_id.id == ref('stock_location_stock'):
|
||||
@@ -134,25 +157,25 @@
|
||||
-
|
||||
Check a backorder was created and on that backorder, prepare partial and process backorder
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
backorder_ids = self.search(cr, uid, [('backorder_id', '=', ref('delivery_order1'))], context=context)
|
||||
assert backorder_ids, "Backorder should have been created"
|
||||
self.action_assign(cr, uid, backorder_ids, context=context)
|
||||
self.do_prepare_partial(cr, uid, backorder_ids, context=context)
|
||||
picking = self.browse(cr, uid, backorder_ids[0])
|
||||
!python {model: stock.picking, id: False}: |
|
||||
backorders = self.search([('backorder_id', '=', ref('delivery_order1'))])
|
||||
assert backorders, "Backorder should have been created"
|
||||
backorders.action_assign()
|
||||
backorders.do_prepare_partial()
|
||||
picking = backorders[0]
|
||||
assert len(picking.pack_operation_ids) == 2, "Wrong number of pack operation"
|
||||
for pack_op in picking.pack_operation_ids:
|
||||
assert pack_op.product_qty == 1, "Wrong quantity in pack operation (%s found instead of 1)" % (pack_op.product_qty)
|
||||
assert pack_op.package_id.name in ('Pallet 2', 'Pallet 3'), "Wrong pallet info in pack operation (%s found)" % (pack_op.package_id.name)
|
||||
self.do_transfer(cr, uid, backorder_ids, context=context)
|
||||
backorders.do_transfer()
|
||||
-
|
||||
Check there are still 0 pieces in stock
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product1')), ('location_id', '=', ref('stock_location_stock'))], context=context)
|
||||
!python {model: stock.quant, id: False}: |
|
||||
records = self.search([('product_id','=',ref('product1')), ('location_id', '=', ref('stock_location_stock'))])
|
||||
total_qty = 0
|
||||
for rec in self.browse(cr, uid, reco_id, context=context):
|
||||
for rec in records:
|
||||
total_qty += rec.qty
|
||||
product = self.pool.get("product.product").browse(cr, uid, ref('product1'))
|
||||
product = self.env["product.product"].browse(ref('product1'))
|
||||
assert total_qty == 0, "Total quantity in stock should be 0 as the backorder took everything out of stock"
|
||||
assert product.qty_available == 0, "Quantity available should be 0 too"
|
||||
@@ -28,32 +28,48 @@
|
||||
-
|
||||
Confirm and assign picking and prepare partial
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('pick_neg')], context=context)
|
||||
!python {model: stock.picking, id: pick_neg}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
Put 120 pieces on Palneg 1 (package), 120 pieces on Palneg 2 with lot A and 60 pieces on Palneg 3
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
!python {model: stock.picking, id: pick_neg}: |
|
||||
#Change quantity of first to 120 and create 2 others quant operations
|
||||
record = self.browse(cr, uid, ref('pick_neg'), context=context)
|
||||
stock_pack = self.pool.get('stock.pack.operation')
|
||||
stock_quant_pack = self.pool.get('stock.quant.package')
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
stock_quant_pack = self.env['stock.quant.package']
|
||||
#create lot A
|
||||
lot_a = self.pool.get('stock.production.lot').create(cr, uid, {'name': 'Lot neg', 'product_id': ref('product_neg')}, context=context)
|
||||
lot_a = self.env['stock.production.lot'].create({'name': 'Lot neg', 'product_id': ref('product_neg')})
|
||||
#create package
|
||||
package1 = stock_quant_pack.create(cr, uid, {'name': 'Palneg 1'}, context=context)
|
||||
package2 = stock_quant_pack.create(cr, uid, {'name': 'Palneg 2'}, context=context)
|
||||
package3 = stock_quant_pack.create(cr, uid, {'name': 'Palneg 3'}, context=context)
|
||||
package1 = stock_quant_pack.create({'name': 'Palneg 1'})
|
||||
package2 = stock_quant_pack.create({'name': 'Palneg 2'})
|
||||
package3 = stock_quant_pack.create({'name': 'Palneg 3'})
|
||||
#Create package for each line and assign it as result_package_id
|
||||
#create pack operation
|
||||
stock_pack.write(cr, uid, record.pack_operation_ids[0].id, {'result_package_id': package1, 'product_qty': 120})
|
||||
new_pack1 = stock_pack.create(cr, uid, {'product_id': ref('product_neg'), 'product_uom_id': ref('product.product_uom_unit'), 'picking_id': ref('pick_neg'), 'pack_lot_ids': [(0, 0, {'lot_id': lot_a, 'qty': 120})], 'result_package_id': package2, 'product_qty': 120, 'location_id': ref('stock_location_suppliers'), 'location_dest_id': ref('stock_location_stock')}, context=context)
|
||||
new_pack2 = stock_pack.create(cr, uid, {'product_id': ref('product_neg'), 'product_uom_id': ref('product.product_uom_unit'), 'picking_id': ref('pick_neg'), 'result_package_id': package3, 'product_qty': 60, 'location_id': ref('stock_location_suppliers'), 'location_dest_id': ref('stock_location_stock')}, context=context)
|
||||
self.pack_operation_ids[0].write({'result_package_id': package1.id, 'product_qty': 120})
|
||||
new_pack1 = stock_pack.create({
|
||||
'product_id': ref('product_neg'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
'picking_id': ref('pick_neg'),
|
||||
'pack_lot_ids': [(0, 0, {'lot_id': lot_a.id, 'qty': 120})],
|
||||
'result_package_id': package2.id,
|
||||
'product_qty': 120,
|
||||
'location_id': ref('stock_location_suppliers'),
|
||||
'location_dest_id': ref('stock_location_stock')
|
||||
})
|
||||
new_pack2 = stock_pack.create({
|
||||
'product_id': ref('product_neg'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
'picking_id': ref('pick_neg'),
|
||||
'result_package_id': package3.id,
|
||||
'product_qty': 60,
|
||||
'location_id': ref('stock_location_suppliers'),
|
||||
'location_dest_id': ref('stock_location_stock')
|
||||
})
|
||||
-
|
||||
Transfer the receipt
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('pick_neg')], context=context)
|
||||
!python {model: stock.picking, id: pick_neg}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Make a delivery order of 300 pieces to the customer
|
||||
-
|
||||
@@ -69,33 +85,40 @@
|
||||
-
|
||||
Assign and confirm
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('delivery_order_neg')], context=context)
|
||||
self.action_assign(cr, uid, [ref('delivery_order_neg')])
|
||||
!python {model: stock.picking, id: delivery_order_neg}: |
|
||||
self.action_confirm()
|
||||
self.action_assign()
|
||||
-
|
||||
Instead of doing the 300 pieces, you decide to take pallet 1 (do not mention product in operation here) and 140 pieces from lot A/pallet 2 and 10 pieces from pallet 3
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
stock_pack = self.pool.get('stock.pack.operation')
|
||||
delivery_id = self.browse(cr, uid, ref('delivery_order_neg'), context=context)
|
||||
for rec in delivery_id.pack_operation_ids:
|
||||
!python {model: stock.picking, id: delivery_order_neg}: |
|
||||
for rec in self.pack_operation_ids:
|
||||
if rec.package_id.name == 'Palneg 2':
|
||||
lot_ids = self.pool.get("stock.production.lot").search(cr, uid, [('product_id', '=', ref('product_neg')), ('name','=','Lot neg')])
|
||||
stock_pack.write(cr, uid, [rec.id], {'product_id': ref('product_neg'), 'product_qty': 140, 'pack_lot_ids': [(0, 0, {'lot_id': lot_ids[0], 'qty': 140})], 'product_uom_id': ref('product.product_uom_unit')}, context=context)
|
||||
lot_id = self.env["stock.production.lot"].search([('product_id', '=', ref('product_neg')), ('name','=','Lot neg')], limit=1).id
|
||||
rec.write({
|
||||
'product_id': ref('product_neg'),
|
||||
'product_qty': 140,
|
||||
'pack_lot_ids': [(0, 0, {'lot_id': lot_id, 'qty': 140})],
|
||||
'product_uom_id': ref('product.product_uom_unit')
|
||||
})
|
||||
if rec.package_id.name == 'Palneg 3':
|
||||
stock_pack.write(cr, uid, [rec.id], {'product_id': ref('product_neg'),'product_qty': 10, 'product_uom_id': ref('product.product_uom_unit')}, context=context)
|
||||
rec.write({
|
||||
'product_id': ref('product_neg'),
|
||||
'product_qty': 10,
|
||||
'product_uom_id': ref('product.product_uom_unit')
|
||||
})
|
||||
-
|
||||
Process this picking
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('delivery_order_neg')], context=context)
|
||||
!python {model: stock.picking, id: delivery_order_neg}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check the quants that you have 120 pieces pallet 1 in customers, -20 pieces pallet 2 in stock, 120 + 20 pieces 2 in customer with lot, and a total quantity of 50 in stock from pallet 3 (should be 20+30, as it has been split by reservation), finally 10 in customers from pallet 3
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product_neg'))], context=context)
|
||||
!python {model: stock.quant, id: False}: |
|
||||
records = self.search([('product_id','=',ref('product_neg'))])
|
||||
pallet_3_stock_qty = 0
|
||||
for rec in self.browse(cr, uid, reco_id, context=context):
|
||||
for rec in records:
|
||||
if rec.package_id.name == 'Palneg 1' and rec.location_id.id == ref('stock_location_customers'):
|
||||
assert rec.qty == 120, "Should have 120 pieces on pallet 1"
|
||||
elif rec.package_id.name == 'Palneg 2' and rec.location_id.id == ref('stock_location_stock'):
|
||||
@@ -125,21 +148,24 @@
|
||||
-
|
||||
Receive 20 products with lot neg in stock with a new incoming shipment that should be on pallet 2
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref("delivery_reconcile")])
|
||||
pick = self.browse(cr, uid, ref("delivery_reconcile"))
|
||||
ops_obj = self.pool.get("stock.pack.operation")
|
||||
pack_obj = self.pool.get("stock.quant.package")
|
||||
lot_ids = self.pool.get("stock.production.lot").search(cr, uid, [('product_id', '=', ref('product_neg')), ('name','=','Lot neg')])
|
||||
pack_ids = pack_obj.search(cr, uid, [('name', '=', 'Palneg 2')])
|
||||
ops_obj.write(cr, uid, [pick.pack_operation_ids[0].id], {'pack_lot_ids': {'lot_id': lot_ids[0], 'qty': 20.0}, 'result_package_id': pack_ids[0]})
|
||||
self.do_transfer(cr, uid, [ref("delivery_reconcile")])
|
||||
!python {model: stock.picking, id: delivery_reconcile}: |
|
||||
self.action_confirm()
|
||||
pack_obj = self.env["stock.quant.package"]
|
||||
lot = self.env["stock.production.lot"].search([('product_id', '=', ref('product_neg')), ('name','=','Lot neg')], limit=1)
|
||||
pack = pack_obj.search([('name', '=', 'Palneg 2')], limit=1)
|
||||
self.pack_operation_ids[0].write({'pack_lot_ids': {'lot_id': lot.id, 'qty': 20.0}, 'result_package_id': pack.id})
|
||||
self.do_transfer()
|
||||
-
|
||||
Check the negative quant was reconciled and the 20 pieces of lot neg at customers have the incoming shipments in the history_ids
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
neg_quants = self.search(cr, uid, [('product_id','=', ref('product_neg')), ('qty', '<', 0)])
|
||||
assert len(neg_quants) == 0, "Negative quants should have been reconciled"
|
||||
pick = self.pool.get('stock.picking').browse(cr, uid, ref('delivery_reconcile'))
|
||||
customer_quant = self.search(cr, uid, [('product_id', '=', ref('product_neg')), ('location_id', '=', ref('stock_location_customers')), ('lot_id.name','=', 'Lot neg'), ('qty','=', 20)])
|
||||
assert pick.move_lines[0].id in [x.id for x in self.browse(cr, uid, customer_quant[0]).history_ids]
|
||||
!python {model: stock.quant, id: False}: |
|
||||
neg_quants = self.search([('product_id','=', ref('product_neg')), ('qty', '<', 0)])
|
||||
assert len(neg_quants.ids) == 0, "Negative quants should have been reconciled"
|
||||
pick = self.env['stock.picking'].browse(ref('delivery_reconcile'))
|
||||
customer_quant = self.search([
|
||||
('product_id', '=', ref('product_neg')),
|
||||
('location_id', '=', ref('stock_location_customers')),
|
||||
('lot_id.name','=', 'Lot neg'),
|
||||
('qty','=', 20)
|
||||
])
|
||||
assert pick.move_lines[0].id in [x.id for x in customer_quant[0].history_ids]
|
||||
|
||||
@@ -23,18 +23,22 @@
|
||||
-
|
||||
Confirm delivery order.
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('pick_output')])
|
||||
!python {model: stock.picking, id: pick_output}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
I run the scheduler.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
self.run_scheduler(cr, uid)
|
||||
!python {model: procurement.order, id: False}: |
|
||||
self.run_scheduler()
|
||||
-
|
||||
Check a picking was created from stock to output.
|
||||
-
|
||||
!python {model: stock.move }: |
|
||||
picking = self.pool.get("stock.picking").browse(cr, uid, ref("pick_output"))
|
||||
move_id = self.search(cr, uid, [('product_id', '=', ref('product.product_product_3')),('location_id', '=', ref('stock.stock_location_stock')),
|
||||
('location_dest_id', '=', ref('stock.stock_location_output')), ('move_dest_id', '=', picking.move_lines[0].id)])
|
||||
assert len(move_id) == 1, "It should have created a picking from Stock to Output with the original picking as destination"
|
||||
!python {model: stock.move, id: False}: |
|
||||
picking = self.env["stock.picking"].browse(ref("pick_output"))
|
||||
moves = self.search([
|
||||
('product_id', '=', ref('product.product_product_3')),
|
||||
('location_id', '=', ref('stock.stock_location_stock')),
|
||||
('location_dest_id', '=', ref('stock.stock_location_output')),
|
||||
('move_dest_id', '=', picking.move_lines[0].id)
|
||||
])
|
||||
assert len(moves.ids) == 1, "It should have created a picking from Stock to Output with the original picking as destination"
|
||||
|
||||
@@ -22,30 +22,40 @@
|
||||
-
|
||||
Confirm and assign picking and prepare partial
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('pick1_wise')], context=context)
|
||||
self.do_prepare_partial(cr, uid, [ref('pick1_wise')], context=context)
|
||||
!python {model: stock.picking, id: pick1_wise}: |
|
||||
self.action_confirm()
|
||||
self.do_prepare_partial()
|
||||
-
|
||||
Put 6 pieces in shelf1 and 4 pieces in shelf2
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
record = self.browse(cr, uid, ref('pick1_wise'), context=context)
|
||||
stock_pack = self.pool.get('stock.pack.operation')
|
||||
stock_quant_pack = self.pool.get('stock.quant.package')
|
||||
package1 = stock_quant_pack.create(cr, uid, {'name': 'Pack 1'}, context=context)
|
||||
stock_pack.write(cr, uid, record.pack_operation_ids[0].id, {'result_package_id': package1, 'product_qty': 4, 'location_dest_id': ref('stock_location_components')})
|
||||
new_pack1 = stock_pack.create(cr, uid, {'product_id': ref('product_wise'), 'product_uom_id': ref('product.product_uom_unit'), 'picking_id': ref('pick1_wise'), 'product_qty': 6.0, 'location_id': ref('stock_location_suppliers'), 'location_dest_id': ref('stock_location_14')}, context=context)
|
||||
!python {model: stock.picking, id: pick1_wise}: |
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
stock_quant_pack = self.env['stock.quant.package']
|
||||
package1 = stock_quant_pack.create({'name': 'Pack 1'})
|
||||
self.pack_operation_ids[0].write({
|
||||
'result_package_id': package1.id,
|
||||
'product_qty': 4,
|
||||
'location_dest_id': ref('stock_location_components')
|
||||
})
|
||||
new_pack1 = stock_pack.create({
|
||||
'product_id': ref('product_wise'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
'picking_id': ref('pick1_wise'),
|
||||
'product_qty': 6.0,
|
||||
'location_id': ref('stock_location_suppliers'),
|
||||
'location_dest_id': ref('stock_location_14')
|
||||
})
|
||||
-
|
||||
Transfer the receipt
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('pick1_wise')], context=context)
|
||||
!python {model: stock.picking, id: pick1_wise}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check the system created 2 quants
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product_wise'))], context=context)
|
||||
assert len(reco_id) == 2, "The number of quants created is not correct"
|
||||
!python {model: stock.quant, id: False}: |
|
||||
records = self.search([('product_id','=',ref('product_wise'))])
|
||||
assert len(records.ids) == 2, "The number of quants created is not correct"
|
||||
-
|
||||
Make a delivery order of 5 pieces to the customer
|
||||
-
|
||||
@@ -61,9 +71,9 @@
|
||||
-
|
||||
Assign and confirm
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('delivery_order_wise1')], context=context)
|
||||
self.action_assign(cr, uid, [ref('delivery_order_wise1')])
|
||||
!python {model: stock.picking, id: delivery_order_wise1}: |
|
||||
self.action_confirm()
|
||||
self.action_assign()
|
||||
-
|
||||
Make a delivery order of 5 pieces to the customer
|
||||
-
|
||||
@@ -79,48 +89,48 @@
|
||||
-
|
||||
Assign and confirm
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_confirm(cr, uid, [ref('delivery_order_wise2')], context=context)
|
||||
self.action_assign(cr, uid, [ref('delivery_order_wise2')])
|
||||
!python {model: stock.picking, id: delivery_order_wise2}: |
|
||||
self.action_confirm()
|
||||
self.action_assign()
|
||||
-
|
||||
The operator is a wise guy and decides to do the opposite of what Odoo proposes. He uses the products reserved on picking 1 on picking 2 and vice versa
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
stock_pack = self.pool.get('stock.pack.operation')
|
||||
picking1 = self.browse(cr, uid, ref('delivery_order_wise1'))
|
||||
picking2 = self.browse(cr, uid, ref('delivery_order_wise2'))
|
||||
!python {model: stock.picking, id: False}: |
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
picking1 = self.browse(ref('delivery_order_wise1'))
|
||||
picking2 = self.browse(ref('delivery_order_wise2'))
|
||||
pack_ids1 = [x.id for x in picking1.pack_operation_ids]
|
||||
pack_ids2 = [x.id for x in picking2.pack_operation_ids]
|
||||
stock_pack.write(cr, uid, pack_ids1, {'picking_id': picking2.id})
|
||||
stock_pack.write(cr, uid, pack_ids2, {'picking_id': picking1.id})
|
||||
link_obj = self.pool['stock.move.operation.link']
|
||||
self.env['stock.pack.operation'].browse(pack_ids1).write({'picking_id': picking2.id})
|
||||
self.env['stock.pack.operation'].browse(pack_ids2).write({'picking_id': picking1.id})
|
||||
link_obj = self.env['stock.move.operation.link']
|
||||
# The recompute remaining qtys does not take into account that pack operations change picking
|
||||
links = link_obj.search(cr, uid, [('operation_id', 'in', pack_ids1 + pack_ids2)])
|
||||
link_obj.unlink(cr, uid, links)
|
||||
links = link_obj.search([('operation_id', 'in', pack_ids1 + pack_ids2)])
|
||||
links.unlink()
|
||||
-
|
||||
Process this picking
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('delivery_order_wise1')], context=context)
|
||||
!python {model: stock.picking, id: delivery_order_wise1}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check there was no negative quant created by this picking
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product_wise')), ('qty', '<', 0.0)], context=context)
|
||||
assert len(reco_id) == 0, 'This should not have created a negative quant'
|
||||
!python {model: stock.quant, id: False}: |
|
||||
records = self.search([('product_id','=',ref('product_wise')), ('qty', '<', 0.0)])
|
||||
assert len(records.ids) == 0, 'This should not have created a negative quant'
|
||||
-
|
||||
Check the other delivery order has changed its state back to partially available
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
assert self.browse(cr, uid, ref('delivery_order_wise2')).state == 'partially_available', "Delivery order 2 should be back in confirmed state"
|
||||
!python {model: stock.picking, id: delivery_order_wise2}: |
|
||||
assert self.state == 'partially_available', "Delivery order 2 should be back in confirmed state"
|
||||
-
|
||||
Process the second picking
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.do_transfer(cr, uid, [ref('delivery_order_wise2')], context=context)
|
||||
!python {model: stock.picking, id: delivery_order_wise2}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check all quants are in Customers and there are no negative quants anymore
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
reco_id = self.search(cr ,uid , [('product_id','=',ref('product_wise'))], context=context)
|
||||
assert all([x.location_id.id==ref('stock_location_customers') and x.qty > 0.0 for x in self.browse(cr, uid, reco_id)]), "Negative quant or wrong location detected"
|
||||
!python {model: stock.quant, id: False}: |
|
||||
records = self.search([('product_id','=',ref('product_wise'))])
|
||||
assert all([x.location_id.id==ref('stock_location_customers') and x.qty > 0.0 for x in records]), "Negative quant or wrong location detected"
|
||||
@@ -1,43 +1,54 @@
|
||||
-
|
||||
Setting journal and property field (if needed)
|
||||
-
|
||||
!python {model: account.journal} : |
|
||||
!python {model: account.journal, id: False} : |
|
||||
#if we already have a coa installed, create journal and set property field
|
||||
company_obj = self.pool['res.company']
|
||||
company_ids = company_obj.search(cr, uid, [('chart_template_id', '!=', False)])
|
||||
company_obj = self.env['res.company']
|
||||
company_ids = company_obj.search([('chart_template_id', '!=', False)]).ids
|
||||
for company_id in company_ids:
|
||||
from openerp.tools.translate import _
|
||||
from odoo.tools.translate import _
|
||||
|
||||
#Check if property exists for stock account journal exists
|
||||
PropertyObj = self.pool.get('ir.property')
|
||||
properties = PropertyObj.search(cr, uid, [('name', '=', 'property_stock_journal'), ('company_id', '=', company_id)])
|
||||
PropertyObj = self.env['ir.property']
|
||||
properties = PropertyObj.search([('name', '=', 'property_stock_journal'), ('company_id', '=', company_id)])
|
||||
AccountJournal = self.pool.get('account.journal')
|
||||
|
||||
#If not, check if you can find a journal that is already there with the same name, otherwise create one
|
||||
if not properties:
|
||||
journal_ids = AccountJournal.search(cr, uid, [('name', '=', _('Stock Journal')), ('company_id', '=', company_id), ('type', '=', 'general')])
|
||||
if journal_ids:
|
||||
journal_id = journal_ids[0]
|
||||
else:
|
||||
journal_id = AccountJournal.create(cr, uid, {'name': _('Stock Journal'), 'type': 'general', 'code': 'STJ', 'company_id': company_id, 'show_on_dashboard': False})
|
||||
journal_id = AccountJournal.search([('name', '=', _('Stock Journal')), ('company_id', '=', company_id), ('type', '=', 'general')], limit=1).id
|
||||
if not journal_id:
|
||||
journal_id = AccountJournal.create({
|
||||
'name': _('Stock Journal'),
|
||||
'type': 'general',
|
||||
'code': 'STJ',
|
||||
'company_id': company_id,
|
||||
'show_on_dashboard': False
|
||||
}).id
|
||||
vals = {'name': 'property_stock_journal',
|
||||
'fields_id': self.pool.get('ir.model.fields').search(cr, uid, [('name', '=', 'property_stock_journal'), ('model', '=', 'product.category'), ('relation', '=', 'account.journal')], limit=1)[0],
|
||||
'fields_id': self.env['ir.model.fields'].search([
|
||||
('name', '=', 'property_stock_journal'),
|
||||
('model', '=', 'product.category'),
|
||||
('relation', '=', 'account.journal')], limit=1).id,
|
||||
'company_id': company_id,
|
||||
'value': 'account.journal,' + str(journal_id)}
|
||||
|
||||
PropertyObj.create(cr, uid, vals)
|
||||
PropertyObj.create(vals)
|
||||
|
||||
todo_list = [ # Property Stock Accounts
|
||||
'property_stock_account_input_categ_id',
|
||||
'property_stock_account_output_categ_id',
|
||||
'property_stock_valuation_account_id',
|
||||
]
|
||||
company = company_obj.browse(cr, uid, company_id)
|
||||
company = company_obj.browse(company_id)
|
||||
for record in todo_list:
|
||||
account = getattr(company, record)
|
||||
value = account and 'account.account,' + str(account.id) or False
|
||||
if value:
|
||||
field_id = self.pool.get('ir.model.fields').search(cr, uid, [('name', '=', record), ('model', '=', 'product.category'), ('relation', '=', 'account.account')], limit=1)[0]
|
||||
field_id = self.env['ir.model.fields'].search([
|
||||
('name', '=', record),
|
||||
('model', '=', 'product.category'),
|
||||
('relation', '=', 'account.account')
|
||||
], limit=1).id
|
||||
vals = {
|
||||
'name': record,
|
||||
'company_id': company_id,
|
||||
@@ -45,7 +56,7 @@
|
||||
'value': value,
|
||||
'res_id': 'product.category,'+str(ref('product.product_category_all')),
|
||||
}
|
||||
properties = PropertyObj.search(cr, uid, [('name', '=', record), ('company_id', '=', company.id), ('value_reference', '!=', False)])
|
||||
properties = PropertyObj.search([('name', '=', record), ('company_id', '=', company.id), ('value_reference', '!=', False)])
|
||||
if not properties:
|
||||
#create the property
|
||||
PropertyObj.create(cr, uid, vals)
|
||||
PropertyObj.create(vals)
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
-
|
||||
Setting property field
|
||||
-
|
||||
!python {model: ir.model.data} : |
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('tag_ids', 'in', [ref('account.demo_stock_account')])])
|
||||
fields_id = self.pool.get('ir.model.fields').search(cr, uid, [('model','=','product.category'),('name','=','property_stock_valuation_account_id')])
|
||||
!python {model: ir.model.data, id: False} : |
|
||||
account_id = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_stock_account')])], limit=1).id
|
||||
fields_id = self.env['ir.model.fields'].search([('model','=','product.category'),('name','=','property_stock_valuation_account_id')], limit=1).id
|
||||
if not account_id:
|
||||
account_id = self.pool.get('account.account').search(cr, uid, [('user_type_id', '=', ref('account.data_account_type_current_assets'))])
|
||||
account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_current_assets'))], limit=1).id
|
||||
if account_id:
|
||||
vals = {
|
||||
'name': 'property_stock_valuation_account_id',
|
||||
'fields_id': fields_id[0],
|
||||
'value': 'account.account,'+str(account_id[0]),
|
||||
'fields_id': fields_id,
|
||||
'value': 'account.account,'+str(account_id),
|
||||
'company_id': ref('base.main_company'),
|
||||
}
|
||||
self._update(cr, uid, 'ir.property', 'stock_account', vals, 'property_stock_valuation_account_id')
|
||||
self._update('ir.property', 'stock_account', vals, 'property_stock_valuation_account_id')
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
-
|
||||
Set routes on product to be MTO and Buy
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
route_warehouse0_buy = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock.warehouse0')).buy_pull_id.route_id.id
|
||||
route_warehouse0_mto = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock.warehouse0')).mto_pull_id.route_id.id
|
||||
self.write(cr, uid, ref('product_mto'), { 'route_ids': [(6, 0, [route_warehouse0_mto,route_warehouse0_buy])]}, context=context )
|
||||
!python {model: product.product, id: product_mto}: |
|
||||
route_warehouse0_buy = self.env['stock.warehouse'].browse(ref('stock.warehouse0')).buy_pull_id.route_id.id
|
||||
route_warehouse0_mto = self.env['stock.warehouse'].browse(ref('stock.warehouse0')).mto_pull_id.route_id.id
|
||||
self.write({'route_ids': [(6, 0, [route_warehouse0_mto,route_warehouse0_buy])]})
|
||||
-
|
||||
Create a sales order with a line of 5 Units "My Product".
|
||||
-
|
||||
@@ -41,8 +41,8 @@
|
||||
-
|
||||
Confirm the sale order
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, ref("sale_order_product_mto"), context=context)
|
||||
!python {model: sale.order, id: sale_order_product_mto}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
Create another sales order with 2 Dozen of the same product
|
||||
-
|
||||
@@ -58,13 +58,13 @@
|
||||
-
|
||||
Confirm the sale order
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, ref("sale_order_product_mto2"), context=context)
|
||||
!python {model: sale.order, id: sale_order_product_mto2}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
I run scheduler.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
self.run_scheduler(cr, uid)
|
||||
!python {model: procurement.order, id: False}: |
|
||||
self.run_scheduler()
|
||||
-
|
||||
Check the propagation when we cancel the main procurement
|
||||
* Retrieve related procurements and check that there are all running
|
||||
@@ -72,36 +72,35 @@
|
||||
* Cancel the main procurement
|
||||
* Check that all procurements related and the purchase order are well cancelled
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
!python {model: procurement.order, id: False}: |
|
||||
# Retrieve related procurement
|
||||
so1 = self.pool.get('sale.order').browse(cr, uid, ref('sale_order_product_mto'))
|
||||
so2 = self.pool.get('sale.order').browse(cr, uid, ref('sale_order_product_mto2'))
|
||||
procu_ids = self.browse(cr, uid, self.search(cr, uid, [('group_id.name', 'in', [so1.name, so2.name])]))
|
||||
assert len(procu_ids)>0, 'No procurement found!'
|
||||
|
||||
so1 = self.env['sale.order'].browse(ref('sale_order_product_mto'))
|
||||
so2 = self.env['sale.order'].browse(ref('sale_order_product_mto2'))
|
||||
procus = self.search([('group_id.name', 'in', [so1.name, so2.name])])
|
||||
assert len(procus.ids)>0, 'No procurement found!'
|
||||
# Check that all procurements are running
|
||||
for procu in procu_ids:
|
||||
for procu in procus:
|
||||
assert procu.state == u'running', 'Procurement with id: %d should be running but is with state : %s!' %(procu.id, procu.state)
|
||||
|
||||
# Check that one purchase order has been created
|
||||
purchase_ids = procu_ids.mapped('purchase_line_id').mapped('order_id')
|
||||
assert len(purchase_ids) == 1, 'No purchase order found !'
|
||||
purchases = procus.mapped('purchase_line_id').mapped('order_id')
|
||||
assert len(purchases.ids) == 1, 'No purchase order found !'
|
||||
|
||||
# Check the two purchase order lines
|
||||
purchase_line = purchase_ids[0].order_line[0]
|
||||
purchase_line = purchases[0].order_line[0]
|
||||
assert purchase_line.product_qty == 29.0, 'The product quantity of the first order line should be 5 and not %s' % (purchase_line.product_qty,)
|
||||
assert purchase_line.product_uom.id == ref("product.product_uom_unit"), 'The product UoM ID of the first order line should be %s and not %s' % (ref("product.product_uom_unit"), purchase_line.product_uom.id,)
|
||||
|
||||
# Cancel the Sales Order 2
|
||||
self.cancel(cr, uid, [so2.order_line[0].procurement_ids[0].id], context=context)
|
||||
so2.order_line[0].procurement_ids[0].cancel()
|
||||
assert so2.order_line[0].procurement_ids[0].state == u'cancel', 'Procurement 2 should be cancelled !'
|
||||
assert purchase_line.product_qty == 5.0, 'The product quantity of the first order line should be 5 and not %s' % (purchase_line.product_qty,)
|
||||
|
||||
# Cancel the Sales Order 1
|
||||
self.cancel(cr, uid, [so1.order_line[0].procurement_ids[0].id], context=context)
|
||||
so1.order_line[0].procurement_ids[0].cancel()
|
||||
assert so1.order_line[0].procurement_ids[0].state == u'cancel', 'Procurement 1 should be cancelled !'
|
||||
assert len(purchase_ids.order_line) == 0, 'The PO line should have been unlinked!'
|
||||
assert len(purchases.order_line) == 0, 'The PO line should have been unlinked!'
|
||||
|
||||
# Check that all procurements related are cancelled
|
||||
for procu in procu_ids:
|
||||
for procu in procus:
|
||||
assert procu.state == u'cancel', 'Procurement %d should be cancelled but is with a state : %s!' %(procu.id, procu.state)
|
||||
|
||||
@@ -35,24 +35,23 @@
|
||||
- product_id: cross_shop_product
|
||||
product_uom_qty: 100.00
|
||||
-
|
||||
!python {model: sale.order.line}: |
|
||||
route_wh_pps_crossdock = self.pool.get('stock.warehouse').browse(cr, uid, ref('stock_dropshipping.wh_pps')).crossdock_route_id.id
|
||||
order = self.pool.get('sale.order').browse(cr, uid, ref('sale_order_crossdock_shpng'))
|
||||
line_ids = [x.id for x in order.order_line]
|
||||
self.write(cr, uid, line_ids, {'route_id': route_wh_pps_crossdock})
|
||||
!python {model: sale.order.line, id: False}: |
|
||||
route_wh_pps_crossdock = self.env['stock.warehouse'].browse(ref('stock_dropshipping.wh_pps')).crossdock_route_id.id
|
||||
order = self.env['sale.order'].browse(ref('sale_order_crossdock_shpng'))
|
||||
order.order_line.write({'route_id': route_wh_pps_crossdock})
|
||||
-
|
||||
Confirm sales order.
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, ref("sale_order_crossdock_shpng"), context=context)
|
||||
!python {model: sale.order, id: sale_order_crossdock_shpng}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
Run the scheduler.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
self.run_scheduler(cr, uid)
|
||||
!python {model: procurement.order, id: False}: |
|
||||
self.run_scheduler()
|
||||
-
|
||||
Check a quotation was created for the created supplier and confirm it.
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
po_id = self.search(cr, uid, [('partner_id', '=', ref('supplier_crossdock')), ('state','=','draft')])
|
||||
self.button_confirm(cr, uid, po_id)
|
||||
!python {model: purchase.order, id: False}: |
|
||||
po = self.search([('partner_id', '=', ref('supplier_crossdock')), ('state','=','draft')])
|
||||
po.button_confirm()
|
||||
|
||||
@@ -34,45 +34,45 @@
|
||||
-
|
||||
Confirm sales order
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, ref("sale_order_drp_shpng"), context=context)
|
||||
!python {model: sale.order, id: sale_order_drp_shpng}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
Check the sales order created a procurement group which has a procurement of 200 pieces
|
||||
-
|
||||
!python {model: procurement.group}: |
|
||||
sale_record = self.pool.get("sale.order").browse(cr, uid, ref('sale_order_drp_shpng'))
|
||||
assert self.browse(cr, uid, sale_record.procurement_group_id.id).procurement_ids[0].product_qty == 200
|
||||
!python {model: procurement.group, id: False}: |
|
||||
sale_record = self.env["sale.order"].browse(ref('sale_order_drp_shpng'))
|
||||
assert sale_record.procurement_group_id.procurement_ids[0].product_qty == 200
|
||||
-
|
||||
Check a quotation was created to a certain vendor and confirm so it becomes a confirmed purchase order
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
from openerp import netsvc
|
||||
sale_record = self.pool.get("sale.order").browse(cr, uid, ref('sale_order_drp_shpng'))
|
||||
procurement_order = self.pool.get("procurement.group").browse(cr, uid, sale_record.procurement_group_id.id).procurement_ids[0]
|
||||
purchase_id = procurement_order.purchase_line_id.order_id.id
|
||||
!python {model: purchase.order, id: False}: |
|
||||
from odoo import netsvc
|
||||
sale_record = self.env["sale.order"].browse(ref('sale_order_drp_shpng'))
|
||||
procurement_order = sale_record.procurement_group_id.procurement_ids[0]
|
||||
purchase = procurement_order.purchase_line_id.order_id
|
||||
|
||||
self.button_confirm(cr, uid, purchase_id)
|
||||
po_id = self.pool.get('purchase.order').search(cr, uid, [('partner_id', '=', ref('supplier_dropship'))])
|
||||
assert self.browse(cr, uid, purchase_id).state == 'purchase', 'Purchase order should be in the approved state'
|
||||
purchase.button_confirm()
|
||||
po_id = self.env['purchase.order'].search([('partner_id', '=', ref('supplier_dropship'))])
|
||||
assert purchase.state == 'purchase', 'Purchase order should be in the approved state'
|
||||
-
|
||||
Use 'Receive Products' button to immediately view this picking, it should have created a picking with 200 pieces
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
po_id = self.search(cr, uid, [('partner_id', '=', ref('supplier_dropship'))])
|
||||
!python {model: purchase.order, id: False}: |
|
||||
po_id = self.search([('partner_id', '=', ref('supplier_dropship'))]).ids
|
||||
assert len(po_id) == 1, 'There should be one picking'
|
||||
-
|
||||
Send the 200 pieces.
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
po_id = self.pool.get('purchase.order').search(cr, uid, [('partner_id', '=', ref('supplier_dropship'))])
|
||||
assert po_id and len(po_id) == 1, 'Problem with the Purchase Order detected'
|
||||
picking_ids = [pick.id for pick in self.pool.get('purchase.order').browse(cr, uid, po_id[0]).picking_ids]
|
||||
self.do_transfer(cr, uid, picking_ids)
|
||||
!python {model: stock.picking, id: False}: |
|
||||
po = self.env['purchase.order'].search([('partner_id', '=', ref('supplier_dropship'))])
|
||||
assert po.ids and len(po.ids) == 1, 'Problem with the Purchase Order detected'
|
||||
pickings = po[0].picking_ids
|
||||
pickings.do_transfer()
|
||||
-
|
||||
Check one quant was created in Customers location with 200 pieces and one move in the history_ids
|
||||
-
|
||||
!python {model: stock.quant}: |
|
||||
quant_ids = self.search(cr, uid, [('location_id', '=', ref('stock.stock_location_customers')), ('product_id', '=', ref("drop_shop_product"))])
|
||||
assert quant_ids, 'No Quant found'
|
||||
assert len(quant_ids) == 1, 'There should be exactly one quant'
|
||||
assert len(self.browse(cr, uid, quant_ids)[0].history_ids) == 1, 'The quant should have exactly 1 move in its history'
|
||||
!python {model: stock.quant, id: False}: |
|
||||
quants = self.search([('location_id', '=', ref('stock.stock_location_customers')), ('product_id', '=', ref("drop_shop_product"))])
|
||||
assert quants, 'No Quant found'
|
||||
assert len(quants.ids) == 1, 'There should be exactly one quant'
|
||||
assert len(quants[0].history_ids) == 1, 'The quant should have exactly 1 move in its history'
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
-
|
||||
Set the company currency as EURO for the sake of repeatibility
|
||||
-
|
||||
!python {model: res.company}: |
|
||||
self.write(cr, uid, [ref('base.main_company')], {'currency_id':ref('base.EUR')}, context=context)
|
||||
!python {model: res.company, id: base.main_company}: |
|
||||
self.write({'currency_id':ref('base.EUR')})
|
||||
|
||||
-
|
||||
Set product category removal strategy as LIFO
|
||||
@@ -54,8 +54,8 @@
|
||||
-
|
||||
I confirm the first purchase order
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
self.button_confirm(cr, uid, [ref("purchase_order_lifo1")])
|
||||
!python {model: purchase.order, id: purchase_order_lifo1}: |
|
||||
self.button_confirm()
|
||||
-
|
||||
I check the "Approved" status of purchase order 1
|
||||
-
|
||||
@@ -64,30 +64,28 @@
|
||||
-
|
||||
Process the receipt of purchase order 1
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
order = self.pool.get('purchase.order').browse(cr, uid, ref("purchase_order_lifo1"), context=context).picking_ids[0]
|
||||
order.do_transfer()
|
||||
!python {model: purchase.order, id: purchase_order_lifo1}: |
|
||||
self.picking_ids[0].do_transfer()
|
||||
-
|
||||
Check the standard price of the product (lifo icecream)
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
assert self.browse(cr, uid, ref("product_lifo_icecream")).standard_price == 70.0, 'Standard price should not have changed!'
|
||||
!python {model: product.product, id: product_lifo_icecream}: |
|
||||
assert self.standard_price == 70.0, 'Standard price should not have changed!'
|
||||
-
|
||||
I confirm the second purchase order
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
self.button_confirm(cr, uid, [ref("purchase_order_lifo2")])
|
||||
!python {model: purchase.order, id: purchase_order_lifo2}: |
|
||||
self.button_confirm()
|
||||
-
|
||||
Process the receipt of purchase order 2
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
order = self.pool.get('purchase.order').browse(cr, uid, ref("purchase_order_lifo2"), context=context).picking_ids[0]
|
||||
order.do_transfer()
|
||||
!python {model: purchase.order, id: purchase_order_lifo2}: |
|
||||
self.picking_ids[0].do_transfer()
|
||||
-
|
||||
Check the standard price should not have changed
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
assert self.browse(cr, uid, ref("product_lifo_icecream")).standard_price == 70.0, 'Standard price as lifo price of second receipt incorrect!'
|
||||
!python {model: product.product, id: product_lifo_icecream}: |
|
||||
assert self.standard_price == 70.0, 'Standard price as lifo price of second receipt incorrect!'
|
||||
-
|
||||
Let us send some goods
|
||||
-
|
||||
@@ -107,16 +105,15 @@
|
||||
-
|
||||
I assign this outgoing shipment
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
self.action_assign(cr, uid, [ref("outgoing_lifo_shipment")])
|
||||
!python {model: stock.picking, id: outgoing_lifo_shipment}: |
|
||||
self.action_assign()
|
||||
-
|
||||
Process the delivery of the outgoing shipment
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
pick_order = self.pool.get('stock.picking').browse(cr, uid, ref("outgoing_lifo_shipment"), context=context)
|
||||
pick_order.do_transfer()
|
||||
!python {model: stock.picking, id: outgoing_lifo_shipment}: |
|
||||
self.do_transfer()
|
||||
-
|
||||
Check standard price became 80 euro
|
||||
-
|
||||
!python {model: product.product}: |
|
||||
assert self.browse(cr, uid, ref("product_lifo_icecream")).standard_price == 80.0, 'Price should have been 80 euro'
|
||||
!python {model: product.product, id: product_lifo_icecream}: |
|
||||
assert self.standard_price == 80.0, 'Price should have been 80 euro'
|
||||
@@ -22,16 +22,16 @@
|
||||
-
|
||||
I confirm the sales order.
|
||||
-
|
||||
!python {model: sale.order}: |
|
||||
self.action_confirm(cr, uid, ref("sale_order_route_dropship01"), context=context)
|
||||
!python {model: sale.order, id: sale_order_route_dropship01}: |
|
||||
self.action_confirm()
|
||||
-
|
||||
I check there is a procurement in exception that has the procurement group of the sales order created before.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
self.run_scheduler(cr, uid)
|
||||
sale_id = self.pool.get('sale.order').browse(cr, uid, ref("sale_order_route_dropship01"))
|
||||
proc_id = self.search(cr, uid, [('group_id.name', '=', sale_id.name), ('state', '=', 'exception')])
|
||||
assert proc_id, 'No Procurement!'
|
||||
!python {model: procurement.order, id: False}: |
|
||||
self.run_scheduler()
|
||||
sale_order = self.env['sale.order'].browse(ref("sale_order_route_dropship01"))
|
||||
procs = self.search([('group_id.name', '=', sale_order.name), ('state', '=', 'exception')])
|
||||
assert procs, 'No Procurement!'
|
||||
-
|
||||
I set the at least one supplier on the product.
|
||||
-
|
||||
@@ -43,22 +43,22 @@
|
||||
-
|
||||
I run the Procurement.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
sale_id = self.pool.get('sale.order').browse(cr, uid, ref("sale_order_route_dropship01"))
|
||||
proc_id = self.search(cr, uid, [('group_id.name', '=', sale_id.name), ('state', '=', 'exception')])
|
||||
self.run(cr, uid, proc_id)
|
||||
!python {model: procurement.order, id: False}: |
|
||||
sale_order = self.env['sale.order'].browse(ref("sale_order_route_dropship01"))
|
||||
procs = self.search([('group_id.name', '=', sale_order.name), ('state', '=', 'exception')])
|
||||
procs.run()
|
||||
-
|
||||
I check the status changed there is no procurement order in exception any more from that procurement group
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
sale_id = self.pool.get('sale.order').browse(cr, uid, ref("sale_order_route_dropship01"))
|
||||
proc_id = self.search(cr, uid, [('group_id.name', '=', sale_id.name), ('state', '=', 'exception')])
|
||||
assert not proc_id, 'Procurement should be in running state'
|
||||
!python {model: procurement.order, id: False}: |
|
||||
sale_order = self.env['sale.order'].browse(ref("sale_order_route_dropship01"))
|
||||
procs = self.search([('group_id.name', '=', sale_order.name), ('state', '=', 'exception')])
|
||||
assert not procs, 'Procurement should be in running state'
|
||||
-
|
||||
I check a purchase quotation was created.
|
||||
-
|
||||
!python {model: procurement.order}: |
|
||||
sale_id = self.pool.get('sale.order').browse(cr, uid, ref("sale_order_route_dropship01"))
|
||||
proc_ids = self.search(cr, uid, [('group_id.name', '=', sale_id.name)])
|
||||
purchase_id = [proc.purchase_line_id.order_id for proc in self.browse(cr, uid, proc_ids) if proc.purchase_line_id]
|
||||
!python {model: procurement.order, id: False}: |
|
||||
sale_order = self.env['sale.order'].browse(ref("sale_order_route_dropship01"))
|
||||
procs = self.search([('group_id.name', '=', sale_order.name)])
|
||||
purchase_id = [proc.purchase_line_id.order_id for proc in procs if proc.purchase_line_id]
|
||||
assert purchase_id, 'No Purchase Quotation is created'
|
||||
|
||||
@@ -71,15 +71,14 @@
|
||||
-
|
||||
I compute the landed cost using Compute button
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
self.compute_landed_cost(cr, uid, [ref("stock_landed_cost_1")])
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_1}: |
|
||||
self.compute_landed_cost()
|
||||
|
||||
-
|
||||
I check the valuation adjustment lines
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
landed_cost = self.browse(cr, uid, ref("stock_landed_cost_1"))
|
||||
for valuation in landed_cost.valuation_adjustment_lines:
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_1}: |
|
||||
for valuation in self.valuation_adjustment_lines:
|
||||
if valuation.cost_line_id.name == 'equal split':
|
||||
assert valuation.additional_landed_cost == 5
|
||||
elif valuation.cost_line_id.name == 'split by quantity' and valuation.move_id.name == "move 1":
|
||||
@@ -99,8 +98,8 @@
|
||||
-
|
||||
I confirm the landed cost
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
self.button_validate(cr, uid, [ref("stock_landed_cost_1")])
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_1}: |
|
||||
self.button_validate()
|
||||
-
|
||||
I check that the landed cost is now "Closed" and that it has an accounting entry
|
||||
-
|
||||
|
||||
@@ -56,15 +56,14 @@
|
||||
-
|
||||
I receive picking LC_pick_3, and check how many quants are created
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
pick = self.browse(cr, uid, [ref("picking_landed_cost_3")], context=context)
|
||||
pick.move_lines.price_unit = 1.0
|
||||
!python {model: stock.picking, id: picking_landed_cost_3}: |
|
||||
self.move_lines.price_unit = 1.0
|
||||
|
||||
self.action_confirm(cr, uid, [ref("picking_landed_cost_3")], context=context)
|
||||
self.action_assign(cr, uid, [ref("picking_landed_cost_3")], context=context)
|
||||
self.action_done(cr, uid, [ref("picking_landed_cost_3")], context=context)
|
||||
self.action_confirm()
|
||||
self.action_assign()
|
||||
self.action_done()
|
||||
|
||||
quants = pick.move_lines.quant_ids
|
||||
quants = self.move_lines.quant_ids
|
||||
assert len(quants) == 1
|
||||
assert quants.qty == 13
|
||||
assert quants.cost == 1.0
|
||||
@@ -83,20 +82,19 @@
|
||||
-
|
||||
I compute the landed cost using Compute button
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
self.compute_landed_cost(cr, uid, [ref("stock_landed_cost_2")])
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_2}: |
|
||||
self.compute_landed_cost()
|
||||
-
|
||||
I check the valuation adjustment lines
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
landed_cost = self.browse(cr, uid, ref("stock_landed_cost_2"))
|
||||
for valuation in landed_cost.valuation_adjustment_lines:
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_2}: |
|
||||
for valuation in self.valuation_adjustment_lines:
|
||||
assert valuation.additional_landed_cost == 15
|
||||
-
|
||||
I confirm the landed cost
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
self.button_validate(cr, uid, [ref("stock_landed_cost_2")])
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_2}: |
|
||||
self.button_validate()
|
||||
-
|
||||
I check that the landed cost is now "Closed" and that it has an accounting entry
|
||||
-
|
||||
@@ -106,9 +104,8 @@
|
||||
-
|
||||
I check the quants quantity and cost
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
landed_cost = self.browse(cr, uid, ref("stock_landed_cost_2"))
|
||||
for valuation in landed_cost.valuation_adjustment_lines:
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_2}: |
|
||||
for valuation in self.valuation_adjustment_lines:
|
||||
quants = valuation.move_id.quant_ids
|
||||
assert quants.mapped('qty') == [12.0, 1.0]
|
||||
assert quants.mapped('cost') == [2.15, 2.2]
|
||||
@@ -117,15 +114,14 @@
|
||||
-
|
||||
I receive picking LC_pick_4, and check how many quants are created
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
pick = self.browse(cr, uid, [ref("picking_landed_cost_4")], context=context)
|
||||
pick.move_lines.price_unit = 17.0/12.0
|
||||
!python {model: stock.picking, id: picking_landed_cost_4}: |
|
||||
self.move_lines.price_unit = 17.0/12.0
|
||||
|
||||
self.action_confirm(cr, uid, [ref("picking_landed_cost_4")], context=context)
|
||||
self.action_assign(cr, uid, [ref("picking_landed_cost_4")], context=context)
|
||||
self.action_done(cr, uid, [ref("picking_landed_cost_4")], context=context)
|
||||
self.action_confirm()
|
||||
self.action_assign()
|
||||
self.action_done()
|
||||
|
||||
quants = pick.move_lines.quant_ids
|
||||
quants = self.move_lines.quant_ids
|
||||
assert len(quants) == 2
|
||||
assert quants.mapped('qty') == [11.0, 1.0]
|
||||
assert [round(c, 2) for c in quants.mapped('cost')] == [1.42, 1.38]
|
||||
@@ -144,20 +140,19 @@
|
||||
-
|
||||
I compute the landed cost using Compute button
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
self.compute_landed_cost(cr, uid, [ref("stock_landed_cost_3")])
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_3}: |
|
||||
self.compute_landed_cost()
|
||||
-
|
||||
I check the valuation adjustment lines
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
landed_cost = self.browse(cr, uid, ref("stock_landed_cost_3"))
|
||||
for valuation in landed_cost.valuation_adjustment_lines:
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_3}: |
|
||||
for valuation in self.valuation_adjustment_lines:
|
||||
assert valuation.additional_landed_cost == 11
|
||||
-
|
||||
I confirm the landed cost
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
self.button_validate(cr, uid, [ref("stock_landed_cost_3")])
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_3}: |
|
||||
self.button_validate()
|
||||
-
|
||||
I check that the landed cost is now "Closed" and that it has an accounting entry
|
||||
-
|
||||
@@ -167,9 +162,8 @@
|
||||
-
|
||||
I check the quants quantity and cost
|
||||
-
|
||||
!python {model: stock.landed.cost}: |
|
||||
landed_cost = self.browse(cr, uid, ref("stock_landed_cost_3"))
|
||||
for valuation in landed_cost.valuation_adjustment_lines:
|
||||
!python {model: stock.landed.cost, id: stock_landed_cost_3}: |
|
||||
for valuation in self.valuation_adjustment_lines:
|
||||
quants = valuation.move_id.quant_ids
|
||||
assert quants.mapped('qty') == [11.0, 1.0]
|
||||
assert [round(c, 2) for c in quants.mapped('cost')] == [2.34, 2.26]
|
||||
|
||||
Reference in New Issue
Block a user