[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:
Yannick Tivisse
2016-08-04 11:55:50 +02:00
parent 3769c7800e
commit 68c6f0deeb
38 changed files with 703 additions and 721 deletions
+15 -16
View File
@@ -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')
+40 -38
View File
@@ -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')
-
+12 -12
View File
@@ -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
-
+23 -23
View File
@@ -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')
+19 -19
View File
@@ -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"
+3 -3
View File
@@ -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()
+6 -6
View File
@@ -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')
+7 -7
View File
@@ -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)
+5 -5
View File
@@ -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'])
+8 -10
View File
@@ -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()
+17 -19
View File
@@ -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
View File
@@ -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)
+23 -29
View File
@@ -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'
+12 -12
View File
@@ -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()
+32 -12
View File
@@ -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()
+6 -3
View File
@@ -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})
+4 -4
View File
@@ -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})
+80 -57
View File
@@ -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"
+71 -45
View File
@@ -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]
+13 -9
View File
@@ -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"
+52 -42
View File
@@ -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)
+11 -12
View File
@@ -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()
+25 -25
View File
@@ -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'
+20 -23
View File
@@ -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]