[MERGE] Fixes related to server removal of osv_memory
bzr revid: odo@openerp.com-20110927213803-rj2hujpigijhvvpl
This commit is contained in:
commit
8b7800750c
|
@ -1256,7 +1256,7 @@ class account_move(osv.osv):
|
||||||
context = {}
|
context = {}
|
||||||
c = context.copy()
|
c = context.copy()
|
||||||
c['novalidate'] = True
|
c['novalidate'] = True
|
||||||
result = super(osv.osv, self).write(cr, uid, ids, vals, c)
|
result = super(account_move, self).write(cr, uid, ids, vals, c)
|
||||||
self.validate(cr, uid, ids, context=context)
|
self.validate(cr, uid, ids, context=context)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
|
@ -1273,7 +1273,7 @@ class account_move_line(osv.osv):
|
||||||
'user_id': uid
|
'user_id': uid
|
||||||
})]
|
})]
|
||||||
|
|
||||||
result = super(osv.osv, self).create(cr, uid, vals, context=context)
|
result = super(account_move_line, self).create(cr, uid, vals, context=context)
|
||||||
# CREATE Taxes
|
# CREATE Taxes
|
||||||
if vals.get('account_tax_id', False):
|
if vals.get('account_tax_id', False):
|
||||||
tax_id = tax_obj.browse(cr, uid, vals['account_tax_id'])
|
tax_id = tax_obj.browse(cr, uid, vals['account_tax_id'])
|
||||||
|
|
|
@ -32,7 +32,7 @@ class res_company(osv.osv):
|
||||||
string="Reserve and Profit/Loss Account",
|
string="Reserve and Profit/Loss Account",
|
||||||
view_load=True,
|
view_load=True,
|
||||||
domain="[('type', '=', 'other')]",
|
domain="[('type', '=', 'other')]",
|
||||||
help="This Account is used for transferring Profit/Loss(If It is Profit: Amount will be added, Loss : Amount will be deducted.), Which is calculated from Profit & Loss Report"),
|
help="This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report"),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
|
|
|
@ -29,7 +29,7 @@ class account_analytic_cost_ledger_journal_report(osv.osv_memory):
|
||||||
_columns = {
|
_columns = {
|
||||||
'date1': fields.date('Start of period', required=True),
|
'date1': fields.date('Start of period', required=True),
|
||||||
'date2': fields.date('End of period', required=True),
|
'date2': fields.date('End of period', required=True),
|
||||||
'journal': fields.many2many('account.analytic.journal', 'ledger_journal_rel', 'ledger_id', 'Journal_id', 'Journals'),
|
'journal': fields.many2many('account.analytic.journal', 'ledger_journal_rel', 'ledger_id', 'journal_id', 'Journals'),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
|
|
|
@ -147,7 +147,7 @@
|
||||||
!python {model: account.account}: |
|
!python {model: account.account}: |
|
||||||
ctx={}
|
ctx={}
|
||||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]})
|
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]})
|
||||||
data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False}
|
data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all'}
|
||||||
from tools import test_reports
|
from tools import test_reports
|
||||||
test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account')
|
test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account')
|
||||||
-
|
-
|
||||||
|
@ -156,7 +156,7 @@
|
||||||
!python {model: account.account}: |
|
!python {model: account.account}: |
|
||||||
ctx={}
|
ctx={}
|
||||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]})
|
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]})
|
||||||
data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True}
|
data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True,'target_move': 'all'}
|
||||||
from tools import test_reports
|
from tools import test_reports
|
||||||
test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account')
|
test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account')
|
||||||
-
|
-
|
||||||
|
|
|
@ -19,13 +19,17 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from osv import osv
|
from osv import osv, fields
|
||||||
|
|
||||||
class account_balance_report(osv.osv_memory):
|
class account_balance_report(osv.osv_memory):
|
||||||
_inherit = "account.common.account.report"
|
_inherit = "account.common.account.report"
|
||||||
_name = 'account.balance.report'
|
_name = 'account.balance.report'
|
||||||
_description = 'Trial Balance Report'
|
_description = 'Trial Balance Report'
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_balance_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'journal_ids': [],
|
'journal_ids': [],
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ class account_aged_trial_balance(osv.osv_memory):
|
||||||
'direction_selection': fields.selection([('past','Past'),
|
'direction_selection': fields.selection([('past','Past'),
|
||||||
('future','Future')],
|
('future','Future')],
|
||||||
'Analysis Direction', required=True),
|
'Analysis Direction', required=True),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_aged_trial_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'period_length': 30,
|
'period_length': 30,
|
||||||
|
|
|
@ -40,11 +40,9 @@ class account_bs_report(osv.osv_memory):
|
||||||
_columns = {
|
_columns = {
|
||||||
'display_type': fields.boolean("Landscape Mode"),
|
'display_type': fields.boolean("Landscape Mode"),
|
||||||
'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account',
|
'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account',
|
||||||
required=True,
|
help='This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report',
|
||||||
help='This Account is used for transfering Profit/Loss ' \
|
|
||||||
'(Profit: Amount will be added, Loss: Amount will be duducted), ' \
|
|
||||||
'which is calculated from Profilt & Loss Report',
|
|
||||||
domain = [('type','=','other')]),
|
domain = [('type','=','other')]),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_bs_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults={
|
_defaults={
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='target_move']" position="after">
|
<xpath expr="//field[@name='target_move']" position="after">
|
||||||
<field name="display_account"/>
|
<field name="display_account"/>
|
||||||
<field name="reserve_account_id" required="1"/>
|
<field name="reserve_account_id"/>
|
||||||
<field name="display_type"/>
|
<field name="display_type"/>
|
||||||
<newline/>
|
<newline/>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
|
|
@ -19,13 +19,17 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from osv import osv
|
from osv import osv, fields
|
||||||
|
|
||||||
class account_central_journal(osv.osv_memory):
|
class account_central_journal(osv.osv_memory):
|
||||||
_name = 'account.central.journal'
|
_name = 'account.central.journal'
|
||||||
_description = 'Account Central Journal'
|
_description = 'Account Central Journal'
|
||||||
_inherit = "account.common.journal.report"
|
_inherit = "account.common.journal.report"
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_central_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
|
}
|
||||||
|
|
||||||
def _print_report(self, cr, uid, ids, data, context=None):
|
def _print_report(self, cr, uid, ids, data, context=None):
|
||||||
data = self.pre_print_report(cr, uid, ids, data, context=context)
|
data = self.pre_print_report(cr, uid, ids, data, context=context)
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -35,7 +35,7 @@ class account_common_report(osv.osv_memory):
|
||||||
'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods')], "Filter by", required=True),
|
'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods')], "Filter by", required=True),
|
||||||
'period_from': fields.many2one('account.period', 'Start Period'),
|
'period_from': fields.many2one('account.period', 'Start Period'),
|
||||||
'period_to': fields.many2one('account.period', 'End Period'),
|
'period_to': fields.many2one('account.period', 'End Period'),
|
||||||
'journal_ids': fields.many2many('account.journal', 'account_common_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
'journal_ids': fields.many2many('account.journal', string='Journals', required=True),
|
||||||
'date_from': fields.date("Start Date"),
|
'date_from': fields.date("Start Date"),
|
||||||
'date_to': fields.date("End Date"),
|
'date_to': fields.date("End Date"),
|
||||||
'target_move': fields.selection([('posted', 'All Posted Entries'),
|
'target_move': fields.selection([('posted', 'All Posted Entries'),
|
||||||
|
|
|
@ -19,17 +19,21 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from osv import osv
|
from osv import osv, fields
|
||||||
|
|
||||||
class account_general_journal(osv.osv_memory):
|
class account_general_journal(osv.osv_memory):
|
||||||
_inherit = "account.common.journal.report"
|
_inherit = "account.common.journal.report"
|
||||||
_name = 'account.general.journal'
|
_name = 'account.general.journal'
|
||||||
_description = 'Account General Journal'
|
_description = 'Account General Journal'
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_general_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
|
}
|
||||||
|
|
||||||
def _print_report(self, cr, uid, ids, data, context=None):
|
def _print_report(self, cr, uid, ids, data, context=None):
|
||||||
data = self.pre_print_report(cr, uid, ids, data, context=context)
|
data = self.pre_print_report(cr, uid, ids, data, context=context)
|
||||||
return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data}
|
return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data}
|
||||||
|
|
||||||
account_general_journal()
|
account_general_journal()
|
||||||
|
|
||||||
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -32,6 +32,7 @@ class account_report_general_ledger(osv.osv_memory):
|
||||||
help='If you selected to filter by date or period, this field allow you to add a row to display the amount of debit/credit/balance that precedes the filter you\'ve set.'),
|
help='If you selected to filter by date or period, this field allow you to add a row to display the amount of debit/credit/balance that precedes the filter you\'ve set.'),
|
||||||
'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"),
|
'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"),
|
||||||
'sortby': fields.selection([('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')], 'Sort by', required=True),
|
'sortby': fields.selection([('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')], 'Sort by', required=True),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_report_general_ledger_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'landscape': True,
|
'landscape': True,
|
||||||
|
|
|
@ -31,6 +31,7 @@ class account_partner_balance(osv.osv_memory):
|
||||||
_columns = {
|
_columns = {
|
||||||
'display_partner': fields.selection([('non-zero_balance', 'With balance is not equal to 0'), ('all', 'All Partners')]
|
'display_partner': fields.selection([('non-zero_balance', 'With balance is not equal to 0'), ('all', 'All Partners')]
|
||||||
,'Display Partners'),
|
,'Display Partners'),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_partner_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
|
@ -51,4 +52,4 @@ class account_partner_balance(osv.osv_memory):
|
||||||
|
|
||||||
account_partner_balance()
|
account_partner_balance()
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -35,6 +35,7 @@ class account_partner_ledger(osv.osv_memory):
|
||||||
'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods'), ('unreconciled', 'Unreconciled Entries')], "Filter by", required=True),
|
'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods'), ('unreconciled', 'Unreconciled Entries')], "Filter by", required=True),
|
||||||
'page_split': fields.boolean('One Partner Per Page', help='Display Ledger Report with One partner per page'),
|
'page_split': fields.boolean('One Partner Per Page', help='Display Ledger Report with One partner per page'),
|
||||||
'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"),
|
'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_partner_ledger_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'initial_balance': False,
|
'initial_balance': False,
|
||||||
|
|
|
@ -30,6 +30,7 @@ class account_print_journal(osv.osv_memory):
|
||||||
'sort_selection': fields.selection([('date', 'Date'),
|
'sort_selection': fields.selection([('date', 'Date'),
|
||||||
('ref', 'Reference Number'),],
|
('ref', 'Reference Number'),],
|
||||||
'Entries Sorted by', required=True),
|
'Entries Sorted by', required=True),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_print_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'sort_selection': 'date',
|
'sort_selection': 'date',
|
||||||
|
@ -44,4 +45,4 @@ class account_print_journal(osv.osv_memory):
|
||||||
|
|
||||||
account_print_journal()
|
account_print_journal()
|
||||||
|
|
||||||
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -28,14 +28,15 @@ class account_pl_report(osv.osv_memory):
|
||||||
_inherit = "account.common.account.report"
|
_inherit = "account.common.account.report"
|
||||||
_name = "account.pl.report"
|
_name = "account.pl.report"
|
||||||
_description = "Account Profit And Loss Report"
|
_description = "Account Profit And Loss Report"
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'display_type': fields.boolean("Landscape Mode"),
|
'display_type': fields.boolean("Landscape Mode"),
|
||||||
|
'journal_ids': fields.many2many('account.journal', 'account_pl_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'display_type': False,
|
'display_type': False,
|
||||||
'journal_ids': [],
|
'journal_ids': [],
|
||||||
'target_move': False
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def _print_report(self, cr, uid, ids, data, context=None):
|
def _print_report(self, cr, uid, ids, data, context=None):
|
||||||
|
|
|
@ -9,9 +9,6 @@
|
||||||
<field name="inherit_id" ref="account.account_common_report_view" />
|
<field name="inherit_id" ref="account.account_common_report_view" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<data>
|
<data>
|
||||||
<xpath expr="//field[@name='target_move']" position="replace">
|
|
||||||
<field name="target_move" required="0" readonly="1"/>
|
|
||||||
</xpath>
|
|
||||||
<xpath expr="//field[@name='journal_ids']" position="replace">
|
<xpath expr="//field[@name='journal_ids']" position="replace">
|
||||||
<field name="journal_ids" required="0" colspan="4" nolabel="1" readonly="1"/>
|
<field name="journal_ids" required="0" colspan="4" nolabel="1" readonly="1"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
|
|
@ -366,7 +366,7 @@ class account_move_line(osv.osv):
|
||||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
result = super(osv.osv, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
|
result = super(account_move_line, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
account_move_line()
|
account_move_line()
|
||||||
|
@ -496,4 +496,4 @@ class account_bank_statement_line(osv.osv):
|
||||||
}
|
}
|
||||||
account_bank_statement_line()
|
account_bank_statement_line()
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -239,7 +239,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char(size='64', string='File Name'),
|
'name': fields.char(size=64, string='File Name'),
|
||||||
'summary': fields.function(_get_summary, type='text', string='Summary'),
|
'summary': fields.function(_get_summary, type='text', string='Summary'),
|
||||||
'file_export': fields.binary(string='Export'),
|
'file_export': fields.binary(string='Export'),
|
||||||
'file_import': fields.binary(string='Import'),
|
'file_import': fields.binary(string='Import'),
|
||||||
|
|
|
@ -381,7 +381,7 @@ class crm_case(crm_base):
|
||||||
default.update({ 'date_closed': False, })
|
default.update({ 'date_closed': False, })
|
||||||
if self._columns.get('date_open'):
|
if self._columns.get('date_open'):
|
||||||
default.update({ 'date_open': False })
|
default.update({ 'date_open': False })
|
||||||
return super(osv.osv, self).copy(cr, uid, id, default, context=context)
|
return super(crm_case, self).copy(cr, uid, id, default, context=context)
|
||||||
|
|
||||||
|
|
||||||
def case_open(self, cr, uid, ids, *args):
|
def case_open(self, cr, uid, ids, *args):
|
||||||
|
|
|
@ -92,7 +92,6 @@
|
||||||
-
|
-
|
||||||
!record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_1}:
|
!record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_1}:
|
||||||
action: 'exist'
|
action: 'exist'
|
||||||
name: 'existing partner'
|
|
||||||
-
|
-
|
||||||
Then, Click on "Create Opportunity" button.
|
Then, Click on "Create Opportunity" button.
|
||||||
-
|
-
|
||||||
|
@ -104,7 +103,6 @@
|
||||||
-
|
-
|
||||||
!record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_2}:
|
!record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_2}:
|
||||||
action: 'nothing'
|
action: 'nothing'
|
||||||
name: 'Do not link to a partner'
|
|
||||||
-
|
-
|
||||||
Then, Click on "Create Opportunity" button.
|
Then, Click on "Create Opportunity" button.
|
||||||
-
|
-
|
||||||
|
|
|
@ -37,7 +37,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
|
||||||
('nothing', 'Do not link to a partner')], \
|
('nothing', 'Do not link to a partner')], \
|
||||||
'Action', required=True),
|
'Action', required=True),
|
||||||
'name': fields.selection([('convert', 'Convert to Opportunity'), ('merge', 'Merge with existing Opportunity')],'Select Action', required=True),
|
'name': fields.selection([('convert', 'Convert to Opportunity'), ('merge', 'Merge with existing Opportunity')],'Select Action', required=True),
|
||||||
'opportunity_ids': fields.many2many('crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id', 'Opportunities', domain=[('type', '=', 'opportunity')]),
|
'opportunity_ids': fields.many2many('crm.lead', string='Opportunities', domain=[('type', '=', 'opportunity')]),
|
||||||
}
|
}
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
def default_get(self, cr, uid, fields, context=None):
|
||||||
|
@ -236,7 +236,7 @@ class crm_lead2opportunity_mass_convert(osv.osv_memory):
|
||||||
|
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'user_ids': fields.many2many('res.users', 'mass_convert_rel', 'user_id', 'wizard_id', 'Salesmans'),
|
'user_ids': fields.many2many('res.users', string='Salesmans'),
|
||||||
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,7 @@
|
||||||
'email_to': 'info@axelor.com',
|
'email_to': 'info@axelor.com',
|
||||||
'email_from': 'Administrator <admin@openerp.com>',
|
'email_from': 'Administrator <admin@openerp.com>',
|
||||||
'reply_to': 'sales_openerp@openerp.com',
|
'reply_to': 'sales_openerp@openerp.com',
|
||||||
|
'state': 'draft',
|
||||||
'history': 'latest',
|
'history': 'latest',
|
||||||
}
|
}
|
||||||
ids = self.create(cr, uid, vals, context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'})
|
ids = self.create(cr, uid, vals, context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'})
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
</group>
|
</group>
|
||||||
<separator string="" colspan="4" />
|
<separator string="" colspan="4" />
|
||||||
<group col="6" colspan="4">
|
<group col="6" colspan="4">
|
||||||
<field name="smtp_server_id" widget="selection" colspan="4"/>
|
|
||||||
<field name="email_from" colspan="4" required="1"/>
|
<field name="email_from" colspan="4" required="1"/>
|
||||||
<field name="email_to" colspan="4" required="1"/>
|
<field name="email_to" colspan="4" required="1"/>
|
||||||
<field name="email_cc" colspan="4"/>
|
<field name="email_cc" colspan="4"/>
|
||||||
|
|
|
@ -264,7 +264,7 @@ class crm_segmentation(osv.osv):
|
||||||
}
|
}
|
||||||
|
|
||||||
_constraints = [
|
_constraints = [
|
||||||
(orm.orm._check_recursion, 'Error ! You can not create recursive profiles.', ['parent_id'])
|
(osv.osv._check_recursion, 'Error ! You can not create recursive profiles.', ['parent_id'])
|
||||||
]
|
]
|
||||||
|
|
||||||
def process_continue(self, cr, uid, ids, start=False):
|
def process_continue(self, cr, uid, ids, start=False):
|
||||||
|
|
|
@ -65,7 +65,9 @@ class mail_compose_message(osv.osv_memory):
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'use_template': fields.boolean('Use Template'),
|
'use_template': fields.boolean('Use Template'),
|
||||||
'template_id': fields.selection(_get_templates, 'Template'),
|
'template_id': fields.selection(_get_templates, 'Template',
|
||||||
|
size=-1 # means we want an int db column
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
def on_change_template(self, cr, uid, ids, use_template, template_id, email_from=None, email_to=None, context=None):
|
def on_change_template(self, cr, uid, ids, use_template, template_id, email_from=None, email_to=None, context=None):
|
||||||
|
|
|
@ -29,7 +29,7 @@ class hr_si_so_ask(osv.osv_memory):
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Employees name', size=32, required=True, readonly=True),
|
'name': fields.char('Employees name', size=32, required=True, readonly=True),
|
||||||
'last_time': fields.datetime('Your last sign out', required=True),
|
'last_time': fields.datetime('Your last sign out', required=True),
|
||||||
'emp_id': fields.char('Empoyee ID', size=32, required=True, readonly=True),
|
'emp_id': fields.many2one('hr.employee', 'Empoyee ID', readonly=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_empname(self, cr, uid, context=None):
|
def _get_empname(self, cr, uid, context=None):
|
||||||
|
@ -52,10 +52,12 @@ class hr_si_so_ask(osv.osv_memory):
|
||||||
|
|
||||||
def sign_in(self, cr, uid, ids, context=None):
|
def sign_in(self, cr, uid, ids, context=None):
|
||||||
data = self.read(cr, uid, ids, [], context=context)[0]
|
data = self.read(cr, uid, ids, [], context=context)[0]
|
||||||
|
data['emp_id'] = data['emp_id'] and data['emp_id'][0]
|
||||||
return self.pool.get('hr.sign.in.out').sign_in(cr, uid, data, context)
|
return self.pool.get('hr.sign.in.out').sign_in(cr, uid, data, context)
|
||||||
|
|
||||||
def sign_out(self, cr, uid, ids, context=None):
|
def sign_out(self, cr, uid, ids, context=None):
|
||||||
data = self.read(cr, uid, ids, [], context=context)[0]
|
data = self.read(cr, uid, ids, [], context=context)[0]
|
||||||
|
data['emp_id'] = data['emp_id'] and data['emp_id'][0]
|
||||||
return self.pool.get('hr.sign.in.out').sign_out(cr, uid, data, context)
|
return self.pool.get('hr.sign.in.out').sign_out(cr, uid, data, context)
|
||||||
|
|
||||||
hr_si_so_ask()
|
hr_si_so_ask()
|
||||||
|
@ -68,7 +70,7 @@ class hr_sign_in_out(osv.osv_memory):
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Employees name', size=32, required=True, readonly=True),
|
'name': fields.char('Employees name', size=32, required=True, readonly=True),
|
||||||
'state': fields.char('Current state', size=32, required=True, readonly=True),
|
'state': fields.char('Current state', size=32, required=True, readonly=True),
|
||||||
'emp_id': fields.char('Employee ID', size=32, required=True, readonly=True),
|
'emp_id': fields.many2one('hr.employee', 'Empoyee ID', readonly=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_empid(self, cr, uid, context=None):
|
def _get_empid(self, cr, uid, context=None):
|
||||||
|
@ -88,6 +90,7 @@ class hr_sign_in_out(osv.osv_memory):
|
||||||
obj_model = self.pool.get('ir.model.data')
|
obj_model = self.pool.get('ir.model.data')
|
||||||
att_obj = self.pool.get('hr.attendance')
|
att_obj = self.pool.get('hr.attendance')
|
||||||
data = self.read(cr, uid, ids, [], context=context)[0]
|
data = self.read(cr, uid, ids, [], context=context)[0]
|
||||||
|
data['emp_id'] = data['emp_id'] and data['emp_id'][0]
|
||||||
emp_id = data['emp_id']
|
emp_id = data['emp_id']
|
||||||
att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id)], limit=1, order='name desc')
|
att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id)], limit=1, order='name desc')
|
||||||
last_att = att_obj.browse(cr, uid, att_id, context=context)
|
last_att = att_obj.browse(cr, uid, att_id, context=context)
|
||||||
|
@ -113,6 +116,7 @@ class hr_sign_in_out(osv.osv_memory):
|
||||||
obj_model = self.pool.get('ir.model.data')
|
obj_model = self.pool.get('ir.model.data')
|
||||||
att_obj = self.pool.get('hr.attendance')
|
att_obj = self.pool.get('hr.attendance')
|
||||||
data = self.read(cr, uid, ids, [], context=context)[0]
|
data = self.read(cr, uid, ids, [], context=context)[0]
|
||||||
|
data['emp_id'] = data['emp_id'] and data['emp_id'][0]
|
||||||
emp_id = data['emp_id']
|
emp_id = data['emp_id']
|
||||||
att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id),('action', '!=', 'action')], limit=1, order='name desc')
|
att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id),('action', '!=', 'action')], limit=1, order='name desc')
|
||||||
last_att = att_obj.browse(cr, uid, att_id, context=context)
|
last_att = att_obj.browse(cr, uid, att_id, context=context)
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
-
|
-
|
||||||
!python {model: idea.post.vote}: |
|
!python {model: idea.post.vote}: |
|
||||||
uid2 = ref('test_idea_user1')
|
uid2 = ref('test_idea_user1')
|
||||||
new_id = self.create(cr, uid2, {'vote': 50}, {"active_ids": [ref("idea_idea_0")]})
|
new_id = self.create(cr, uid2, {'vote': "50"}, {"active_ids": [ref("idea_idea_0")]})
|
||||||
self.do_vote(cr, uid2, [new_id], {"active_ids": [ref("idea_idea_0")]})
|
self.do_vote(cr, uid2, [new_id], {"active_ids": [ref("idea_idea_0")]})
|
||||||
|
|
||||||
- |
|
- |
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
-
|
-
|
||||||
!python {model: idea.post.vote}: |
|
!python {model: idea.post.vote}: |
|
||||||
uid2 = ref('test_idea_user2')
|
uid2 = ref('test_idea_user2')
|
||||||
new_id = self.create(cr, uid2, {'vote': 100, 'note': 'We can learn many things from technical presentation'}, {"active_ids": [ref("idea_idea_0")]})
|
new_id = self.create(cr, uid2, {'vote': "100", 'note': 'We can learn many things from technical presentation'}, {"active_ids": [ref("idea_idea_0")]})
|
||||||
self.do_vote(cr, uid2, [new_id], {'active_ids': [ref('idea_idea_0')]})
|
self.do_vote(cr, uid2, [new_id], {'active_ids': [ref('idea_idea_0')]})
|
||||||
|
|
||||||
- |
|
- |
|
||||||
|
|
|
@ -117,7 +117,8 @@ class partner_vat_list_13(osv.osv_memory):
|
||||||
""" Partner Vat Listing """
|
""" Partner Vat Listing """
|
||||||
_name = "partner.vat.list_13"
|
_name = "partner.vat.list_13"
|
||||||
_columns = {
|
_columns = {
|
||||||
'partner_ids': fields.many2many('vat.listing.clients', 'vat_partner_rel', 'vat_id', 'partner_id', 'Clients', required=False, help='You can remove clients/partners which you do not want to show in xml file'),
|
# TODO the referenced model has been deleted at revno 4672.1.2.
|
||||||
|
#'partner_ids': fields.many2many('vat.listing.clients', 'vat_partner_rel', 'vat_id', 'partner_id', 'Clients', required=False, help='You can remove clients/partners which you do not want to show in xml file'),
|
||||||
'name': fields.char('File Name', size=32),
|
'name': fields.char('File Name', size=32),
|
||||||
'msg': fields.text('File created', size=64, readonly=True),
|
'msg': fields.text('File created', size=64, readonly=True),
|
||||||
'file_save' : fields.binary('Save File', readonly=True),
|
'file_save' : fields.binary('Save File', readonly=True),
|
||||||
|
@ -127,7 +128,8 @@ class partner_vat_list_13(osv.osv_memory):
|
||||||
return context.get('partner_ids', [])
|
return context.get('partner_ids', [])
|
||||||
|
|
||||||
_defaults={
|
_defaults={
|
||||||
'partner_ids': _get_partners
|
# TODO the referenced model has been deleted at revno 4672.1.2.
|
||||||
|
# 'partner_ids': _get_partners
|
||||||
}
|
}
|
||||||
|
|
||||||
def create_xml(self, cursor, user, ids, context=None):
|
def create_xml(self, cursor, user, ids, context=None):
|
||||||
|
|
|
@ -83,9 +83,10 @@ class partner_vat_intra(osv.osv_memory):
|
||||||
else:
|
else:
|
||||||
data_cmpny = obj_user.browse(cursor, user, user).company_id
|
data_cmpny = obj_user.browse(cursor, user, user).company_id
|
||||||
data = self.read(cursor, user, ids)[0]
|
data = self.read(cursor, user, ids)[0]
|
||||||
company_vat = data_cmpny.partner_id.vat.replace(' ','').upper()
|
company_vat = data_cmpny.partner_id.vat
|
||||||
if not company_vat:
|
if not company_vat:
|
||||||
raise osv.except_osv(_('Data Insufficient'),_('No VAT Number Associated with Main Company!'))
|
raise osv.except_osv(_('Data Insufficient'),_('No VAT Number Associated with Main Company!'))
|
||||||
|
company_vat = company_vat.replace(' ','').upper()
|
||||||
|
|
||||||
seq_controlref = obj_sequence.get(cursor, user, 'controlref')
|
seq_controlref = obj_sequence.get(cursor, user, 'controlref')
|
||||||
seq_declarantnum = obj_sequence.get(cursor, user, 'declarantnum')
|
seq_declarantnum = obj_sequence.get(cursor, user, 'declarantnum')
|
||||||
|
|
|
@ -82,9 +82,9 @@ class mail_compose_message(osv.osv_memory):
|
||||||
else:
|
else:
|
||||||
# default mode
|
# default mode
|
||||||
result['model'] = context.get('active_model', False)
|
result['model'] = context.get('active_model', False)
|
||||||
if vals:
|
for field in vals:
|
||||||
for field in fields:
|
if field in fields:
|
||||||
result.update({field : vals.get(field, False)})
|
result.update({field : vals[field]})
|
||||||
|
|
||||||
# link to model and record if not done yet
|
# link to model and record if not done yet
|
||||||
if not result.get('model') or not result.get('res_id'):
|
if not result.get('model') or not result.get('res_id'):
|
||||||
|
|
|
@ -205,9 +205,8 @@
|
||||||
I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water.
|
I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water.
|
||||||
-
|
-
|
||||||
!python {model: procurement.order}: |
|
!python {model: procurement.order}: |
|
||||||
from tools.translate import _
|
|
||||||
proc_ids = self.search(cr, uid, [('product_id','in',[ref('product_product_orange0'),ref('product_product_sugar0'),ref('product_product_water0')])])
|
proc_ids = self.search(cr, uid, [('product_id','in',[ref('product_product_orange0'),ref('product_product_sugar0'),ref('product_product_water0')])])
|
||||||
assert proc_ids, _('No Procurements!')
|
assert proc_ids, 'No Procurements!'
|
||||||
-
|
-
|
||||||
The scheduler runs.
|
The scheduler runs.
|
||||||
-
|
-
|
||||||
|
@ -219,9 +218,8 @@
|
||||||
stock moves for Oranges, Sugar and Water made correctly.
|
stock moves for Oranges, Sugar and Water made correctly.
|
||||||
-
|
-
|
||||||
!python {model: stock.picking}: |
|
!python {model: stock.picking}: |
|
||||||
from tools.translate import _
|
|
||||||
pick_ids = self.search(cr, uid, [('type','=','internal')])
|
pick_ids = self.search(cr, uid, [('type','=','internal')])
|
||||||
assert pick_ids, _('No Internal Pickings!')
|
assert pick_ids, 'No Internal Pickings!'
|
||||||
-
|
-
|
||||||
According to minimum stock rules. I have 2 purchase orders for
|
According to minimum stock rules. I have 2 purchase orders for
|
||||||
Sugar with 6 Kg from Axelor and Orange 60 Kg from ASUStek.
|
Sugar with 6 Kg from Axelor and Orange 60 Kg from ASUStek.
|
||||||
|
@ -229,50 +227,24 @@
|
||||||
I confirm the purchase order of Sugar and Orange.
|
I confirm the purchase order of Sugar and Orange.
|
||||||
-
|
-
|
||||||
!python {model: purchase.order}: |
|
!python {model: purchase.order}: |
|
||||||
from tools.translate import _
|
|
||||||
import netsvc
|
import netsvc
|
||||||
purch_ids = self.search(cr, uid, [('state','=','draft')])
|
purch_ids = self.search(cr, uid, [('state','=','draft')])
|
||||||
assert purch_ids, _('No Purchase Orders were made!')
|
assert purch_ids, 'No Purchase Orders were made!'
|
||||||
wf_service = netsvc.LocalService("workflow")
|
wf_service = netsvc.LocalService("workflow")
|
||||||
for p_id in purch_ids:
|
for p_id in purch_ids:
|
||||||
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr)
|
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr)
|
||||||
-
|
-
|
||||||
I see two incoming pickings for Orange and Sugar.
|
I see two incoming pickings for Orange and Sugar, and receive them.
|
||||||
-
|
-
|
||||||
!python {model: stock.picking}: |
|
!python {model: stock.picking}: |
|
||||||
from tools.translate import _
|
|
||||||
pick_ids = self.search(cr, uid, [('type','=','in')])
|
pick_ids = self.search(cr, uid, [('type','=','in')])
|
||||||
assert pick_ids, _('No Incoming Shipments found!')
|
assert pick_ids, 'No Incoming Shipments found!'
|
||||||
-
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
I receive both the products. My incoming pickings are done.
|
for pick_id in pick_ids:
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
I create record for the incoming picking wizard.
|
context={'active_model': 'stock.picking',
|
||||||
-
|
'active_ids': [pick_id]})
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking0}:
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
-
|
|
||||||
I make my pickings done.
|
|
||||||
-
|
|
||||||
!python {model: stock.partial.picking}: |
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
picking_ids = pick_obj.search(cr, uid, [('type','=','in'),('state','=','assigned')])
|
|
||||||
partial = self.browse(cr, uid, 1, context)
|
|
||||||
partial_datas = {
|
|
||||||
'delivery_date': partial.date
|
|
||||||
}
|
|
||||||
for pick in pick_obj.browse(cr, uid, picking_ids):
|
|
||||||
for m in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(m.id)] = {
|
|
||||||
'product_id': m.product_id.id,
|
|
||||||
'product_qty': m.product_qty,
|
|
||||||
'product_uom': m.product_uom.id
|
|
||||||
}
|
|
||||||
if (pick.type == 'in') and (m.product_id.cost_method == 'average'):
|
|
||||||
partial_datas['move%s'%(m.id)].update({
|
|
||||||
'product_price': m.product_price,
|
|
||||||
'product_currency': m.product_currency
|
|
||||||
})
|
|
||||||
pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context)
|
|
||||||
-
|
-
|
||||||
Again the scheduler runs.
|
Again the scheduler runs.
|
||||||
-
|
-
|
||||||
|
@ -283,19 +255,15 @@
|
||||||
I check my internal picking of "Orange Juice" is done.
|
I check my internal picking of "Orange Juice" is done.
|
||||||
-
|
-
|
||||||
!python {model: stock.picking}: |
|
!python {model: stock.picking}: |
|
||||||
from tools.translate import _
|
|
||||||
pick_ids = self.search(cr, uid, [('type','=','internal'),('state','=','done')])
|
pick_ids = self.search(cr, uid, [('type','=','internal'),('state','=','done')])
|
||||||
assert pick_ids, _('Internal Picking is not done yet!')
|
assert pick_ids, 'Internal Picking is not done yet!'
|
||||||
-
|
-
|
||||||
I check my manufacturing order for "Orange Juice" is ready or not.
|
I check my manufacturing order for "Orange Juice" is ready or not.
|
||||||
-
|
-
|
||||||
!python {model: mrp.production}: |
|
!python {model: mrp.production}: |
|
||||||
from tools.translate import _
|
prod_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))])
|
||||||
pick_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))])
|
assert prod_ids, 'Manufacturing order is not ready!'
|
||||||
assert pick_ids, _('Manufacturing order is not ready!')
|
|
||||||
-
|
-
|
||||||
I start the production order.
|
I start the production order.
|
||||||
-
|
-
|
||||||
!workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0}
|
!workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -195,74 +195,26 @@
|
||||||
I Check incoming shipments for cloth. And receive products.
|
I Check incoming shipments for cloth. And receive products.
|
||||||
-
|
-
|
||||||
!python {model: stock.picking}: |
|
!python {model: stock.picking}: |
|
||||||
from tools.translate import _
|
|
||||||
pick_ids = self.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')])
|
pick_ids = self.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')])
|
||||||
assert pick_ids, _('No Incoming Shipments found!')
|
assert pick_ids, 'No Incoming Shipments found!'
|
||||||
-
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
I create record for partial picking.
|
for pick_id in pick_ids:
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
|
'active_ids': [pick_id]})
|
||||||
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
-
|
|
||||||
I make my picking done.
|
|
||||||
-
|
|
||||||
!python {model: stock.partial.picking}: |
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
picking_ids = pick_obj.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')])
|
|
||||||
partial = self.browse(cr, uid, 1, context)
|
|
||||||
partial_datas = {
|
|
||||||
'delivery_date' : partial.date
|
|
||||||
}
|
|
||||||
for pick in pick_obj.browse(cr, uid, picking_ids):
|
|
||||||
for m in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(m.id)] = {
|
|
||||||
'product_id' : m.product_id.id,
|
|
||||||
'product_qty' : m.product_qty,
|
|
||||||
'product_uom' : m.product_uom.id
|
|
||||||
}
|
|
||||||
if (pick.type == 'in') and (m.product_id.cost_method == 'average'):
|
|
||||||
partial_datas['move%s'%(m.id)].update({
|
|
||||||
'product_price' : m.product_price,
|
|
||||||
'product_currency': m.product_currency
|
|
||||||
})
|
|
||||||
pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context)
|
|
||||||
-
|
-
|
||||||
I Check incoming shipments for buttons and receive products.
|
I Check incoming shipments for buttons and receive products.
|
||||||
-
|
-
|
||||||
!python {model: stock.picking}: |
|
!python {model: stock.picking}: |
|
||||||
from tools.translate import _
|
|
||||||
pick_ids = self.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')])
|
pick_ids = self.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')])
|
||||||
assert pick_ids, _('No Incoming Shipments found!')
|
assert pick_ids, 'No Incoming Shipments found!'
|
||||||
-
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
I create record for partial picking.
|
for pick_id in pick_ids:
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
|
'active_ids': [pick_id]})
|
||||||
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
-
|
|
||||||
I make my picking done.
|
|
||||||
-
|
|
||||||
!python {model: stock.partial.picking}: |
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
picking_ids = pick_obj.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')])
|
|
||||||
partial = self.browse(cr, uid, 1, context)
|
|
||||||
partial_datas = {
|
|
||||||
'delivery_date': partial.date
|
|
||||||
}
|
|
||||||
for pick in pick_obj.browse(cr, uid, picking_ids):
|
|
||||||
for m in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(m.id)] = {
|
|
||||||
'product_id': m.product_id.id,
|
|
||||||
'product_qty': m.product_qty,
|
|
||||||
'product_uom': m.product_uom.id
|
|
||||||
}
|
|
||||||
if (pick.type == 'in') and (m.product_id.cost_method == 'average'):
|
|
||||||
partial_datas['move%s'%(m.id)].update({
|
|
||||||
'product_price': m.product_price,
|
|
||||||
'product_currency': m.product_currency
|
|
||||||
})
|
|
||||||
pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context)
|
|
||||||
-
|
-
|
||||||
Run scheduler again.
|
Run scheduler again.
|
||||||
-
|
-
|
||||||
|
@ -297,7 +249,6 @@
|
||||||
I produce 2 products with 5.00 quantities each.
|
I produce 2 products with 5.00 quantities each.
|
||||||
-
|
-
|
||||||
!python {model: mrp.product.produce}: |
|
!python {model: mrp.product.produce}: |
|
||||||
from tools.translate import _
|
|
||||||
prod_obj = self.pool.get('mrp.production')
|
prod_obj = self.pool.get('mrp.production')
|
||||||
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')])
|
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')])
|
||||||
self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids})
|
self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids})
|
||||||
|
@ -321,8 +272,7 @@
|
||||||
And finally production order is done.
|
And finally production order is done.
|
||||||
-
|
-
|
||||||
!python {model: mrp.product.produce}: |
|
!python {model: mrp.product.produce}: |
|
||||||
from tools.translate import _
|
|
||||||
prod_obj = self.pool.get('mrp.production')
|
prod_obj = self.pool.get('mrp.production')
|
||||||
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')])
|
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')])
|
||||||
self.do_produce(cr, uid, [1], context={'active_ids': prod_ids})
|
self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids})
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ class outlook_installer(osv.osv_memory):
|
||||||
'doc_name':fields.char('File name', size=64),
|
'doc_name':fields.char('File name', size=64),
|
||||||
'outlook':fields.boolean('Outlook Plug-in ', help="Allows you to select an object that you would like to add to your email and its attachments."),
|
'outlook':fields.boolean('Outlook Plug-in ', help="Allows you to select an object that you would like to add to your email and its attachments."),
|
||||||
'plugin_file':fields.binary('Outlook Plug-in', readonly=True, help="outlook plug-in file. Save as this file and install this plug-in in outlook."),
|
'plugin_file':fields.binary('Outlook Plug-in', readonly=True, help="outlook plug-in file. Save as this file and install this plug-in in outlook."),
|
||||||
'doc_file':fields.char('Installation Manual',size="264",help="The documentation file :- how to install Outlook Plug-in.", readonly=True),
|
'doc_file':fields.char('Installation Manual',size=264,help="The documentation file :- how to install Outlook Plug-in.", readonly=True),
|
||||||
'description':fields.text('Description', readonly=True)
|
'description':fields.text('Description', readonly=True)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -264,7 +264,7 @@ class pos_order(osv.osv):
|
||||||
args['partner_id'] = order.partner_id and order.partner_id.id or None
|
args['partner_id'] = order.partner_id and order.partner_id.id or None
|
||||||
|
|
||||||
statement_id = statement_obj.search(cr,uid, [
|
statement_id = statement_obj.search(cr,uid, [
|
||||||
('journal_id', '=', data['journal']),
|
('journal_id', '=', int(data['journal'])),
|
||||||
('company_id', '=', curr_company),
|
('company_id', '=', curr_company),
|
||||||
('user_id', '=', uid),
|
('user_id', '=', uid),
|
||||||
('state', '=', 'open')], context=context)
|
('state', '=', 'open')], context=context)
|
||||||
|
@ -274,7 +274,7 @@ class pos_order(osv.osv):
|
||||||
statement_id = statement_id[0]
|
statement_id = statement_id[0]
|
||||||
args['statement_id'] = statement_id
|
args['statement_id'] = statement_id
|
||||||
args['pos_statement_id'] = order_id
|
args['pos_statement_id'] = order_id
|
||||||
args['journal_id'] = data['journal']
|
args['journal_id'] = int(data['journal'])
|
||||||
args['type'] = 'customer'
|
args['type'] = 'customer'
|
||||||
args['ref'] = order.name
|
args['ref'] = order.name
|
||||||
statement_line_obj.create(cr, uid, args, context=context)
|
statement_line_obj.create(cr, uid, args, context=context)
|
||||||
|
|
|
@ -34,6 +34,11 @@
|
||||||
if tools.config['test_report_directory']:
|
if tools.config['test_report_directory']:
|
||||||
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-receipt report'+format), 'wb+').write(data)
|
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-receipt report'+format), 'wb+').write(data)
|
||||||
|
|
||||||
|
-
|
||||||
|
Create a record for the root user in pos.payment.report.user (used by the next python block).
|
||||||
|
-
|
||||||
|
!record {model: pos.payment.report.user, id: pos_payment_report_user_1}:
|
||||||
|
user_id: []
|
||||||
-
|
-
|
||||||
Print the POS Payment Report through the wizard
|
Print the POS Payment Report through the wizard
|
||||||
-
|
-
|
||||||
|
|
|
@ -124,68 +124,15 @@ class stock_picking(osv.osv):
|
||||||
purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_id': invoice_id,})
|
purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_id': invoice_id,})
|
||||||
return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
|
return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
|
||||||
|
|
||||||
stock_picking()
|
|
||||||
|
|
||||||
class stock_partial_picking(osv.osv_memory):
|
class stock_partial_picking(osv.osv_memory):
|
||||||
_inherit = 'stock.partial.picking'
|
_inherit = 'stock.partial.picking'
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
# Overridden to inject the purchase price as true 'cost price' when processing
|
||||||
""" To get default values for the object.
|
# incoming pickings.
|
||||||
@param self: The object pointer.
|
def _product_cost_for_average_update(self, cr, uid, move):
|
||||||
@param cr: A database cursor
|
if move.picking_id.purchase_id:
|
||||||
@param uid: ID of the user currently logged in
|
return {'cost': move.purchase_line_id.price_unit,
|
||||||
@param fields: List of fields for which we want default values
|
'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id}
|
||||||
@param context: A standard dictionary
|
return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move)
|
||||||
@return: A dictionary which of fields with values.
|
|
||||||
"""
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
|
|
||||||
for pick in pick_obj.browse(cr, uid, context.get('active_ids', []), context=context):
|
|
||||||
has_product_cost = (pick.type == 'in' and pick.purchase_id)
|
|
||||||
for m in pick.move_lines:
|
|
||||||
if m.state in ('done','cancel') :
|
|
||||||
continue
|
|
||||||
if has_product_cost and m.product_id.cost_method == 'average' and m.purchase_line_id:
|
|
||||||
# We use the original PO unit purchase price as the basis for the cost, expressed
|
|
||||||
# in the currency of the PO (i.e the PO's pricelist currency)
|
|
||||||
list_index = 0
|
|
||||||
for item in res['product_moves_in']:
|
|
||||||
if item['move_id'] == m.id:
|
|
||||||
res['product_moves_in'][list_index]['cost'] = m.purchase_line_id.price_unit
|
|
||||||
res['product_moves_in'][list_index]['currency'] = m.picking_id.purchase_id.pricelist_id.currency_id.id
|
|
||||||
list_index += 1
|
|
||||||
return res
|
|
||||||
stock_partial_picking()
|
|
||||||
|
|
||||||
class stock_partial_move(osv.osv_memory):
|
|
||||||
_inherit = "stock.partial.move"
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
|
||||||
""" To get default values for the object.
|
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param fields: List of fields for which we want default values
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return: A dictionary which of fields with values.
|
|
||||||
"""
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
res = super(stock_partial_move, self).default_get(cr, uid, fields, context=context)
|
|
||||||
move_obj = self.pool.get('stock.move')
|
|
||||||
for m in move_obj.browse(cr, uid, context.get('active_ids', []), context=context):
|
|
||||||
if m.picking_id.type == 'in' and m.product_id.cost_method == 'average' \
|
|
||||||
and m.purchase_line_id and m.picking_id.purchase_id:
|
|
||||||
# We use the original PO unit purchase price as the basis for the cost, expressed
|
|
||||||
# in the currency of the PO (i.e the PO's pricelist currency)
|
|
||||||
list_index = 0
|
|
||||||
for item in res['product_moves_in']:
|
|
||||||
if item['move_id'] == m.id:
|
|
||||||
res['product_moves_in'][list_index]['cost'] = m.purchase_line_id.price_unit
|
|
||||||
res['product_moves_in'][list_index]['currency'] = m.picking_id.purchase_id.pricelist_id.currency_id.id
|
|
||||||
list_index += 1
|
|
||||||
return res
|
|
||||||
stock_partial_move()
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@
|
||||||
pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2"))
|
pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2"))
|
||||||
pick_ids = [x.id for x in pur_id1.picking_ids]
|
pick_ids = [x.id for x in pur_id1.picking_ids]
|
||||||
id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.expenses_journal')},
|
id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.expenses_journal')},
|
||||||
{'active_ids': pick_ids})
|
{'active_ids': pick_ids, 'active_model': 'stock.picking'})
|
||||||
self.create_invoice(cr, uid, [id], {"active_ids": pick_ids, "active_id": pick_ids[0]})
|
self.create_invoice(cr, uid, [id], {"active_ids": pick_ids, "active_id": pick_ids[0]})
|
||||||
-
|
-
|
||||||
I check that an invoice_ids field of Delivery&Invoices gets bind with the value.
|
I check that an invoice_ids field of Delivery&Invoices gets bind with the value.
|
||||||
|
|
|
@ -31,39 +31,17 @@
|
||||||
-
|
-
|
||||||
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so9}
|
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so9}
|
||||||
-
|
-
|
||||||
I verify that the picking has been generated for the sale order
|
I verify that the picking has been generated for the sale order and I process it
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
so = self.browse(cr, uid, ref("sale_order_so9"))
|
so = self.browse(cr, uid, ref("sale_order_so9"))
|
||||||
assert so.picking_ids,"Picking has not been generated for sale_order_so9"
|
assert so.picking_ids,"Picking has not been generated for sale_order_so9"
|
||||||
-
|
picking, = so.picking_ids
|
||||||
Then I confirm the picking
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
'active_ids': [picking.id]})
|
||||||
-
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
Then I done the picking
|
|
||||||
-
|
|
||||||
!python {model: stock.picking }: |
|
|
||||||
import time
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so9"))
|
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
|
|
||||||
if picking_id:
|
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
|
||||||
pick.force_assign(cr, uid)
|
|
||||||
partial_datas = {
|
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
|
||||||
'address_id': pick.address_id.id,
|
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
|
||||||
}
|
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': '100',
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
I click on Create Invoice button to create the invoice.
|
I click on Create Invoice button to create the invoice.
|
||||||
-
|
-
|
||||||
|
|
|
@ -30,41 +30,21 @@
|
||||||
-
|
-
|
||||||
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so6}
|
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so6}
|
||||||
-
|
-
|
||||||
I verify that the picking has been generated for the sale order
|
I verify that the picking has been generated for the sale order and I process it
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
so = self.browse(cr, uid, ref("sale_order_so6"))
|
so = self.browse(cr, uid, ref("sale_order_so6"))
|
||||||
assert so.picking_ids,"Picking has not been generated for sale_order_so6"
|
assert so.picking_ids,"Picking has not been generated for sale_order_so6"
|
||||||
-
|
picking, = so.picking_ids
|
||||||
Then I click on the "Product Sent" button of Outgoing Shipments
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
'active_ids': [picking.id]})
|
||||||
-
|
# I change the qty to 100 for a partial delivery
|
||||||
I change the quantity on the picking to 199, and confirm partially 100 PCE.
|
partial = stock_partial_picking.browse(cr,uid,partial_id)
|
||||||
-
|
line_id = partial.move_ids[0].id
|
||||||
!python {model: stock.picking }: |
|
partial.write({'move_ids': [(1,line_id,{'quantity':100})]})
|
||||||
import time
|
partial.do_partial()
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so6"))
|
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
|
|
||||||
if picking_id:
|
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
|
||||||
self.pool.get('stock.move').write(cr, uid, [pick.move_lines[0].id], {'product_qty': 199, 'product_uos_qty': 199})
|
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
|
||||||
pick.force_assign(cr, uid)
|
|
||||||
partial_datas = {
|
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
|
||||||
'address_id': pick.address_id.id,
|
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
|
||||||
}
|
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': '100',
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
Then I click on 'Create Invoices' button
|
Then I click on 'Create Invoices' button
|
||||||
-
|
-
|
||||||
|
@ -72,9 +52,9 @@
|
||||||
import time
|
import time
|
||||||
sale_obj = self.pool.get('sale.order')
|
sale_obj = self.pool.get('sale.order')
|
||||||
sale_id = sale_obj.browse(cr, uid, ref("sale_order_so6"))
|
sale_id = sale_obj.browse(cr, uid, ref("sale_order_so6"))
|
||||||
ids = [x.id for x in sale_id.picking_ids]
|
ids = [x.id for x in sale_id.picking_ids if x.state == 'done']
|
||||||
wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')},
|
wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')},
|
||||||
{'active_ids': ids})
|
{'active_ids': ids, 'active_model': 'stock.picking'})
|
||||||
self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
|
self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
|
||||||
-
|
-
|
||||||
I verify whether the invoice has been generated for SO
|
I verify whether the invoice has been generated for SO
|
||||||
|
@ -98,7 +78,7 @@
|
||||||
inv_brw = self.browse(cr,uid,inv_id)[0]
|
inv_brw = self.browse(cr,uid,inv_id)[0]
|
||||||
for inv_lines in inv_brw.invoice_line:
|
for inv_lines in inv_brw.invoice_line:
|
||||||
qty1=inv_lines.quantity
|
qty1=inv_lines.quantity
|
||||||
assert (qty1 == qty), "Quantities are not the same"
|
assert (qty1 == qty), "Quantities are not the same: invoiced: %s, shipped: %s" % (qty1,qty)
|
||||||
-
|
-
|
||||||
I open the Invoice for the SO.
|
I open the Invoice for the SO.
|
||||||
-
|
-
|
||||||
|
|
|
@ -136,15 +136,11 @@
|
||||||
I verify that a procurement state is "running"
|
I verify that a procurement state is "running"
|
||||||
-
|
-
|
||||||
!python {model: procurement.order}: |
|
!python {model: procurement.order}: |
|
||||||
from tools.translate import _
|
sale_order_obj = self.pool.get('sale.order')
|
||||||
modules = self.pool.get('ir.module.module')
|
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
|
||||||
mod_pur = modules.search(cr, uid, [('name','=','purchase')])
|
proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','in',['running','ready'])])
|
||||||
mod_brw = modules.browse(cr,uid,mod_pur)[0]
|
# should be running is 'purchase' is installed, else 'ready'
|
||||||
if (mod_brw.state == 'installed'):
|
assert(proc_ids),"Procurement is not in running/ready state!"
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
|
|
||||||
proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','=','running')])
|
|
||||||
assert(proc_ids),"Procurement is not in the running state!"
|
|
||||||
-
|
-
|
||||||
I verify that a purchase order has been generated
|
I verify that a purchase order has been generated
|
||||||
-
|
-
|
||||||
|
@ -192,7 +188,7 @@
|
||||||
for pur in pur_ids:
|
for pur in pur_ids:
|
||||||
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
||||||
-
|
-
|
||||||
I verify that a picking related to purchase order has been generated.
|
I verify that a picking related to purchase order has been generated and I process it
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
modules = self.pool.get('ir.module.module')
|
modules = self.pool.get('ir.module.module')
|
||||||
|
@ -204,29 +200,12 @@
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
po = pur_obj.browse(cr, uid, pur_id)[0]
|
||||||
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
||||||
-
|
picking, = po.picking_ids
|
||||||
Then I click on the "Products Received" button of Incoming Shipments
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
'active_ids': [picking.id]})
|
||||||
-
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
I click on the "Validate" button
|
|
||||||
-
|
|
||||||
!python {model: stock.picking}: |
|
|
||||||
modules = self.pool.get('ir.module.module')
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
pur_obj = self.pool.get('purchase.order')
|
|
||||||
mod_pur = modules.search(cr, uid, [('name','=','purchase')])
|
|
||||||
mod_brw = modules.browse(cr,uid,mod_pur)[0]
|
|
||||||
if (mod_brw.state == 'installed'):
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
|
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
|
||||||
pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
|
|
||||||
import netsvc
|
|
||||||
wf_service = netsvc.LocalService("workflow")
|
|
||||||
for pick in pick_ser_id:
|
|
||||||
wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
|
|
||||||
-
|
-
|
||||||
I verify that picking for purchase order has been done.
|
I verify that picking for purchase order has been done.
|
||||||
-
|
-
|
||||||
|
@ -244,7 +223,7 @@
|
||||||
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
||||||
assert(ids),"Picking is not in the done state!"
|
assert(ids),"Picking is not in the done state!"
|
||||||
-
|
-
|
||||||
Then I done the picking
|
Then I process the picking
|
||||||
-
|
-
|
||||||
!python {model: stock.picking }: |
|
!python {model: stock.picking }: |
|
||||||
import time
|
import time
|
||||||
|
@ -254,18 +233,11 @@
|
||||||
if picking_id:
|
if picking_id:
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
pick=self.browse(cr,uid,picking_id[0])
|
||||||
pick.force_assign(cr, uid)
|
pick.force_assign(cr, uid)
|
||||||
partial_datas = {
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
'address_id': pick.address_id.id,
|
context={'active_model': 'stock.picking',
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
'active_ids': [pick.id]})
|
||||||
}
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
I verify that picking for sale order is in done state.
|
I verify that picking for sale order is in done state.
|
||||||
-
|
-
|
||||||
|
@ -275,38 +247,6 @@
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
|
picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
|
||||||
pick = self.browse(cr,uid,picking_id[0])
|
pick = self.browse(cr,uid,picking_id[0])
|
||||||
assert (pick.state) =='done', "Picking for SO is not in done state."
|
assert (pick.state) =='done', "Picking for SO is not in done state."
|
||||||
-
|
|
||||||
Then I done the delivery order
|
|
||||||
-
|
|
||||||
!python {model: stock.picking }: |
|
|
||||||
import time
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
|
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
if picking_id:
|
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
|
||||||
pick.force_assign(cr, uid)
|
|
||||||
partial_datas = {
|
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
|
||||||
'address_id': pick.address_id.id,
|
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
|
||||||
}
|
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
|
||||||
I verify that delivery state is done
|
|
||||||
-
|
|
||||||
!python {model: stock.picking }: |
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
|
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
pick = self.browse(cr,uid,picking_id[0])
|
|
||||||
assert (pick.state) =='done', "Picking for SO is not in done state."
|
|
||||||
-
|
-
|
||||||
I verify that a "Picked" has been set to true
|
I verify that a "Picked" has been set to true
|
||||||
-
|
-
|
||||||
|
|
|
@ -46,18 +46,11 @@
|
||||||
if picking_id:
|
if picking_id:
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
pick=self.browse(cr,uid,picking_id[0])
|
||||||
pick.force_assign(cr, uid)
|
pick.force_assign(cr, uid)
|
||||||
partial_datas = {
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
'address_id': pick.address_id.id,
|
context={'active_model': 'stock.picking',
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
'active_ids': [pick.id]})
|
||||||
}
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
Then I click on 'Create Invoices' button
|
Then I click on 'Create Invoices' button
|
||||||
-
|
-
|
||||||
|
@ -67,7 +60,7 @@
|
||||||
sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7"))
|
sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7"))
|
||||||
ids = [x.id for x in sale_id.picking_ids]
|
ids = [x.id for x in sale_id.picking_ids]
|
||||||
wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')},
|
wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')},
|
||||||
{'active_ids': ids})
|
{'active_ids': ids, 'active_model': 'stock.picking'})
|
||||||
self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
|
self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
|
||||||
-
|
-
|
||||||
I check that an invoice has been created.
|
I check that an invoice has been created.
|
||||||
|
@ -197,7 +190,7 @@
|
||||||
for pur in pur_ids:
|
for pur in pur_ids:
|
||||||
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
||||||
-
|
-
|
||||||
I verify that a picking related to purchase order has been generated.
|
I verify that a picking related to purchase order has been generated and I process it
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
modules = self.pool.get('ir.module.module')
|
modules = self.pool.get('ir.module.module')
|
||||||
|
@ -209,29 +202,12 @@
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
po = pur_obj.browse(cr, uid, pur_id)[0]
|
||||||
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
||||||
-
|
picking, = po.picking_ids
|
||||||
Then I click on the "Products Received" button of Incoming Shipments
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
'active_ids': [picking.id]})
|
||||||
-
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
I click on the "Validate" button
|
|
||||||
-
|
|
||||||
!python {model: stock.picking}: |
|
|
||||||
modules = self.pool.get('ir.module.module')
|
|
||||||
mod_pur = modules.search(cr, uid, [('name','=','purchase')])
|
|
||||||
mod_brw = modules.browse(cr,uid,mod_pur)[0]
|
|
||||||
if (mod_brw.state == 'installed'):
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
pur_obj = self.pool.get('purchase.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
|
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
|
||||||
pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
|
|
||||||
import netsvc
|
|
||||||
wf_service = netsvc.LocalService("workflow")
|
|
||||||
for pick in pick_ser_id:
|
|
||||||
wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
|
|
||||||
-
|
-
|
||||||
I verify that picking for purchase order has been done.
|
I verify that picking for purchase order has been done.
|
||||||
-
|
-
|
||||||
|
@ -249,36 +225,20 @@
|
||||||
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
||||||
assert ids, _('Picking is not in the done state!')
|
assert ids, _('Picking is not in the done state!')
|
||||||
-
|
-
|
||||||
I verify that delivery order has been generated for sale order
|
I verify that delivery order has been generated for sale order, and process it
|
||||||
-
|
-
|
||||||
!python {model: stock.picking }: |
|
!python {model: stock.picking }: |
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
sale_order_obj = self.pool.get('sale.order')
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
|
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
||||||
assert (picking_id),"Delivery order has not been generated"
|
assert (picking_id),"Delivery order has not been generated"
|
||||||
-
|
pick=self.browse(cr,uid,picking_id[0])
|
||||||
I verify that delivery has been done
|
pick.force_assign(cr, uid)
|
||||||
-
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
!python {model: stock.picking }: |
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
import time
|
context={'active_model': 'stock.picking',
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
'active_ids': [pick.id]})
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
if picking_id:
|
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
|
||||||
pick.force_assign(cr, uid)
|
|
||||||
partial_datas = {
|
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
|
||||||
'address_id': pick.address_id.id,
|
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
|
||||||
}
|
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
I verify that delivery state is done
|
I verify that delivery state is done
|
||||||
-
|
-
|
||||||
|
@ -290,7 +250,7 @@
|
||||||
pick = self.browse(cr,uid,picking_id[0])
|
pick = self.browse(cr,uid,picking_id[0])
|
||||||
assert (pick.state) =='done', "Picking for SO is not in done state."
|
assert (pick.state) =='done', "Picking for SO is not in done state."
|
||||||
-
|
-
|
||||||
I verify that a "Picked" has been set to true
|
I verify that the sale order is marked as delivered
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
so = self.browse(cr, uid, ref("sale_order_so7"))
|
so = self.browse(cr, uid, ref("sale_order_so7"))
|
||||||
|
|
|
@ -45,18 +45,11 @@
|
||||||
if picking_id:
|
if picking_id:
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
pick=self.browse(cr,uid,picking_id[0])
|
||||||
pick.force_assign(cr, uid)
|
pick.force_assign(cr, uid)
|
||||||
partial_datas = {
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
'address_id': pick.address_id.id,
|
context={'active_model': 'stock.picking',
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
'active_ids': [pick.id]})
|
||||||
}
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
I verify that picking order is in done state.
|
I verify that picking order is in done state.
|
||||||
-
|
-
|
||||||
|
@ -76,7 +69,7 @@
|
||||||
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
picking_id = self.search(cr, uid, [('origin','=',so.name)])
|
||||||
assert (picking_id),"Delivery order has not been generated"
|
assert (picking_id),"Delivery order has not been generated"
|
||||||
-
|
-
|
||||||
I click on the Products Sent button and then on the Validate button
|
I process the delivery order
|
||||||
-
|
-
|
||||||
!python {model: stock.picking }: |
|
!python {model: stock.picking }: |
|
||||||
import time
|
import time
|
||||||
|
@ -86,20 +79,13 @@
|
||||||
if picking_id:
|
if picking_id:
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
pick=self.browse(cr,uid,picking_id[0])
|
||||||
pick.force_assign(cr, uid)
|
pick.force_assign(cr, uid)
|
||||||
partial_datas = {
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
'address_id': pick.address_id.id,
|
context={'active_model': 'stock.picking',
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
'active_ids': [pick.id]})
|
||||||
}
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
I verify that delivery state is done
|
I verify that delivery order is marked done
|
||||||
-
|
-
|
||||||
!python {model: stock.picking }: |
|
!python {model: stock.picking }: |
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
sale_order_obj = self.pool.get('sale.order')
|
||||||
|
@ -187,7 +173,7 @@
|
||||||
for pur in pur_ids:
|
for pur in pur_ids:
|
||||||
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
||||||
-
|
-
|
||||||
I verify that a picking related to purchase order has been generated.
|
I verify that a picking related to purchase order has been generated and I process it
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
modules = self.pool.get('ir.module.module')
|
modules = self.pool.get('ir.module.module')
|
||||||
|
@ -199,31 +185,14 @@
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
po = pur_obj.browse(cr, uid, pur_id)[0]
|
||||||
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
||||||
|
picking, = po.picking_ids
|
||||||
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
|
context={'active_model': 'stock.picking',
|
||||||
|
'active_ids': [picking.id]})
|
||||||
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
-
|
-
|
||||||
Then I click on the "Products Received" button of Incoming Shipments
|
I verify that picking for purchase order has been marked done.
|
||||||
-
|
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
-
|
|
||||||
I click on the "Validate" button
|
|
||||||
-
|
|
||||||
!python {model: stock.picking}: |
|
|
||||||
modules = self.pool.get('ir.module.module')
|
|
||||||
mod_pur = modules.search(cr, uid, [('name','=','purchase')])
|
|
||||||
mod_brw = modules.browse(cr,uid,mod_pur)[0]
|
|
||||||
if (mod_brw.state == 'installed'):
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
pur_obj = self.pool.get('purchase.order')
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so8"))
|
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
|
||||||
pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
|
|
||||||
import netsvc
|
|
||||||
wf_service = netsvc.LocalService("workflow")
|
|
||||||
for pick in pick_ser_id:
|
|
||||||
wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
|
|
||||||
-
|
|
||||||
I verify that picking for purchase order has been done.
|
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
from tools.translate import _
|
from tools.translate import _
|
||||||
|
@ -239,7 +208,7 @@
|
||||||
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
||||||
assert ids, _('Picking is not in the done state!')
|
assert ids, _('Picking is not in the done state!')
|
||||||
-
|
-
|
||||||
I verify that a "Picked" has been set to true
|
I verify that the sale order is marked as delivered
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
so = self.browse(cr, uid, ref("sale_order_so8"))
|
so = self.browse(cr, uid, ref("sale_order_so8"))
|
||||||
|
|
|
@ -101,18 +101,11 @@
|
||||||
if picking_id:
|
if picking_id:
|
||||||
pick=self.browse(cr,uid,picking_id[0])
|
pick=self.browse(cr,uid,picking_id[0])
|
||||||
pick.force_assign(cr, uid)
|
pick.force_assign(cr, uid)
|
||||||
partial_datas = {
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
'partner_id':pick.address_id.partner_id.id,
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
'address_id': pick.address_id.id,
|
context={'active_model': 'stock.picking',
|
||||||
'delivery_date' : time.strftime('%Y-%m-%d'),
|
'active_ids': [pick.id]})
|
||||||
}
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
move = pick.move_lines[0]
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
-
|
-
|
||||||
I verify that picking order is in done state.
|
I verify that picking order is in done state.
|
||||||
-
|
-
|
||||||
|
@ -201,7 +194,7 @@
|
||||||
for pur in pur_ids:
|
for pur in pur_ids:
|
||||||
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr)
|
||||||
-
|
-
|
||||||
I verify that a picking related to purchase order has been generated.
|
I verify that a picking related to purchase order has been generated and I process it
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
modules = self.pool.get('ir.module.module')
|
modules = self.pool.get('ir.module.module')
|
||||||
|
@ -213,51 +206,21 @@
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
po = pur_obj.browse(cr, uid, pur_id)[0]
|
||||||
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
assert(po.picking_ids),"Picking for purchase order has not been generated"
|
||||||
-
|
picking, = po.picking_ids
|
||||||
Then I click on the "Products Received" button of Incoming Shipments
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
-
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
context={'active_model': 'stock.picking',
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
'active_ids': [picking.id]})
|
||||||
-
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
I click on the "Validate" button
|
|
||||||
-
|
|
||||||
!python {model: stock.picking}: |
|
|
||||||
modules = self.pool.get('ir.module.module')
|
|
||||||
sale_order_obj = self.pool.get('sale.order')
|
|
||||||
pur_obj = self.pool.get('purchase.order')
|
|
||||||
mod_pur = modules.search(cr, uid, [('name','=','purchase')])
|
|
||||||
mod_brw = modules.browse(cr,uid,mod_pur)[0]
|
|
||||||
if (mod_brw.state == 'installed'):
|
|
||||||
so = sale_order_obj.browse(cr, uid, ref("sale_order_so1"))
|
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
|
||||||
pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )])
|
|
||||||
import netsvc
|
|
||||||
wf_service = netsvc.LocalService("workflow")
|
|
||||||
for pick in pick_ser_id:
|
|
||||||
wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr)
|
|
||||||
-
|
|
||||||
I verify that picking for purchase order has been done.
|
|
||||||
-
|
|
||||||
!python {model: sale.order}: |
|
|
||||||
from tools.translate import _
|
|
||||||
modules = self.pool.get('ir.module.module')
|
|
||||||
mod_pur = modules.search(cr, uid, [('name','=','purchase')])
|
|
||||||
mod_brw = modules.browse(cr,uid,mod_pur)[0]
|
|
||||||
if(mod_brw.state == 'installed'):
|
|
||||||
pur_obj = self.pool.get('purchase.order')
|
|
||||||
so = self.browse(cr, uid, ref("sale_order_so1"))
|
|
||||||
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
|
|
||||||
po = pur_obj.browse(cr, uid, pur_id)[0]
|
|
||||||
picking_obj = self.pool.get('stock.picking')
|
picking_obj = self.pool.get('stock.picking')
|
||||||
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
|
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id),('state', '=', 'done')])
|
||||||
assert ids, _('Picking is not in the done state!')
|
assert ids, 'Picking should be marked done!'
|
||||||
-
|
-
|
||||||
I verify that a "Picked" has been set to true
|
I verify that the sale order is marked as delivered
|
||||||
-
|
-
|
||||||
!python {model: sale.order}: |
|
!python {model: sale.order}: |
|
||||||
so = self.browse(cr, uid, ref("sale_order_so1"))
|
so = self.browse(cr, uid, ref("sale_order_so1"))
|
||||||
assert (so.shipped == True), "Picking is not done."
|
assert (so.shipped == True), "Sale order is not marked as delivered"
|
||||||
-
|
-
|
||||||
I verify that a sale order is in done state
|
I verify that a sale order is in done state
|
||||||
-
|
-
|
||||||
|
|
|
@ -27,8 +27,8 @@ class sale_advance_payment_inv(osv.osv_memory):
|
||||||
_columns = {
|
_columns = {
|
||||||
'product_id': fields.many2one('product.product', 'Advance Product', required=True,
|
'product_id': fields.many2one('product.product', 'Advance Product', required=True,
|
||||||
help="Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field."),
|
help="Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field."),
|
||||||
'amount': fields.float('Advance Amount', size=(16, 2), required=True, help="The amount to be invoiced in advance."),
|
'amount': fields.float('Advance Amount', digits=(16, 2), required=True, help="The amount to be invoiced in advance."),
|
||||||
'qtty': fields.float('Quantity', size=(16, 2), required=True),
|
'qtty': fields.float('Quantity', digits=(16, 2), required=True),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'qtty': 1.0
|
'qtty': 1.0
|
||||||
|
@ -173,4 +173,4 @@ class sale_open_invoice(osv.osv_memory):
|
||||||
|
|
||||||
sale_open_invoice()
|
sale_open_invoice()
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -664,8 +664,8 @@ class stock_picking(osv.osv):
|
||||||
|
|
||||||
def action_process(self, cr, uid, ids, context=None):
|
def action_process(self, cr, uid, ids, context=None):
|
||||||
if context is None: context = {}
|
if context is None: context = {}
|
||||||
partial_id = self.pool.get("stock.partial.picking").create(
|
context = dict(context, active_ids=ids, active_model=self._name)
|
||||||
cr, uid, {}, context=dict(context, active_ids=ids))
|
partial_id = self.pool.get("stock.partial.picking").create(cr, uid, {}, context=context)
|
||||||
return {
|
return {
|
||||||
'name':_("Products to Process"),
|
'name':_("Products to Process"),
|
||||||
'view_mode': 'form',
|
'view_mode': 'form',
|
||||||
|
@ -677,7 +677,7 @@ class stock_picking(osv.osv):
|
||||||
'nodestroy': True,
|
'nodestroy': True,
|
||||||
'target': 'new',
|
'target': 'new',
|
||||||
'domain': '[]',
|
'domain': '[]',
|
||||||
'context': dict(context, active_ids=ids)
|
'context': context,
|
||||||
}
|
}
|
||||||
|
|
||||||
def copy(self, cr, uid, id, default=None, context=None):
|
def copy(self, cr, uid, id, default=None, context=None):
|
||||||
|
@ -1474,6 +1474,8 @@ class stock_move(osv.osv):
|
||||||
|
|
||||||
def action_partial_move(self, cr, uid, ids, context=None):
|
def action_partial_move(self, cr, uid, ids, context=None):
|
||||||
if context is None: context = {}
|
if context is None: context = {}
|
||||||
|
if context.get('active_model') != self._name:
|
||||||
|
context.update(active_ids=ids, active_model=self._name)
|
||||||
partial_id = self.pool.get("stock.partial.move").create(
|
partial_id = self.pool.get("stock.partial.move").create(
|
||||||
cr, uid, {}, context=context)
|
cr, uid, {}, context=context)
|
||||||
return {
|
return {
|
||||||
|
@ -2127,14 +2129,9 @@ class stock_move(osv.osv):
|
||||||
""" Makes the move done and if all moves are done, it will finish the picking.
|
""" Makes the move done and if all moves are done, it will finish the picking.
|
||||||
@return:
|
@return:
|
||||||
"""
|
"""
|
||||||
partial_datas=''
|
|
||||||
picking_ids = []
|
picking_ids = []
|
||||||
move_ids = []
|
move_ids = []
|
||||||
partial_obj=self.pool.get('stock.partial.picking')
|
|
||||||
wf_service = netsvc.LocalService("workflow")
|
wf_service = netsvc.LocalService("workflow")
|
||||||
partial_id=partial_obj.search(cr,uid,[])
|
|
||||||
if partial_id:
|
|
||||||
partial_datas = partial_obj.read(cr, uid, partial_id, context=context)[0]
|
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
|
||||||
|
@ -2164,9 +2161,6 @@ class stock_move(osv.osv):
|
||||||
self.action_done(cr, uid, [move.move_dest_id.id], context=context)
|
self.action_done(cr, uid, [move.move_dest_id.id], context=context)
|
||||||
|
|
||||||
self._create_product_valuation_moves(cr, uid, move, context=context)
|
self._create_product_valuation_moves(cr, uid, move, context=context)
|
||||||
prodlot_id = partial_datas and partial_datas.get('move%s_prodlot_id' % (move.id), False)
|
|
||||||
if prodlot_id:
|
|
||||||
self.write(cr, uid, [move.id], {'prodlot_id': prodlot_id}, context=context)
|
|
||||||
if move.state not in ('confirmed','done','assigned'):
|
if move.state not in ('confirmed','done','assigned'):
|
||||||
todo.append(move.id)
|
todo.append(move.id)
|
||||||
|
|
||||||
|
|
|
@ -184,37 +184,32 @@
|
||||||
self.fill_inventory(cr, uid, [ref("stock_fill_inventory_0")], context)
|
self.fill_inventory(cr, uid, [ref("stock_fill_inventory_0")], context)
|
||||||
|
|
||||||
-
|
-
|
||||||
I create stock.inventory.line.split record.
|
I split the PC3 inventory line to create 5 PC3 with production lot 00002-stock-test
|
||||||
-
|
-
|
||||||
!record {model: stock.inventory.line.split, id: stock_inventory_line_0}:
|
!record {model: stock.inventory.line.split, id: stock_inventory_line_0}:
|
||||||
line_ids:
|
line_ids:
|
||||||
- name: '00002-stock-test'
|
- name: '00002-stock-test'
|
||||||
quantity: 5
|
quantity: 5
|
||||||
line_exist_ids:
|
|
||||||
- name: '00003-stock-test'
|
|
||||||
quantity: 5
|
|
||||||
product_id: product.product_product_pc1
|
product_id: product.product_product_pc1
|
||||||
product_uom: product.product_uom_unit
|
product_uom: product.product_uom_unit
|
||||||
use_exist: False
|
use_exist: False
|
||||||
qty: 10
|
qty: 10
|
||||||
|
|
||||||
-
|
-
|
||||||
I Split stock.inventory.line into production line.
|
I confirm the split operation
|
||||||
-
|
-
|
||||||
!python {model: stock.inventory.line.split}: |
|
!python {model: stock.inventory.line}: |
|
||||||
context = {"lang": 'en_US', "active_model": "stock.inventory.line",
|
line_ids = self.search(cr, uid, [('inventory_id','=',ref('stock_inventory_physicalinventoy0')),
|
||||||
"active_ids": [ref("stock_inventory_line_0")], "tz": False, "active_id": ref("stock_inventory_line_0")}
|
('product_id','=',ref('product.product_product_pc1'))])
|
||||||
self.default_get(cr, uid, ["product_id", "product_uom", "line_exist_ids", "qty",
|
assert line_ids, 'Inventory lines are missing'
|
||||||
"line_ids", "use_exist"], context)
|
self.pool.get('stock.inventory.line.split').split_lot(cr, uid, [ref("stock_inventory_line_0")],
|
||||||
self.split_lot(cr, uid, [ref("stock_inventory_line_0")], context)
|
{'active_model': 'stock.inventory.line',
|
||||||
|
'active_ids': [line_ids[0]]})
|
||||||
-
|
-
|
||||||
I confirm the Inventory for PC3.
|
I confirm the Inventory for PC3.
|
||||||
-
|
-
|
||||||
!python {model: stock.inventory}: |
|
!python {model: stock.inventory}: |
|
||||||
self.action_confirm(cr,uid,[ref('stock_inventory_physicalinventoy0')])
|
self.action_confirm(cr,uid,[ref('stock_inventory_physicalinventoy0')])
|
||||||
self.action_done(cr,uid,[ref('stock_inventory_physicalinventoy0')])
|
self.action_done(cr,uid,[ref('stock_inventory_physicalinventoy0')])
|
||||||
|
|
||||||
-
|
-
|
||||||
I cancel the Inventory for PC3.
|
I cancel the Inventory for PC3.
|
||||||
-
|
-
|
||||||
|
@ -251,7 +246,7 @@
|
||||||
type: out
|
type: out
|
||||||
|
|
||||||
-
|
-
|
||||||
I Performing an osv_memory action split on module stock.split.into
|
I split the picking with a first batch of 20 PCs
|
||||||
-
|
-
|
||||||
!python {model: stock.picking }: |
|
!python {model: stock.picking }: |
|
||||||
pick=self.browse(cr,uid,ref('stock_picking_0'))
|
pick=self.browse(cr,uid,ref('stock_picking_0'))
|
||||||
|
@ -285,31 +280,15 @@
|
||||||
ref("stock.menu_action_picking_tree6"), })
|
ref("stock.menu_action_picking_tree6"), })
|
||||||
|
|
||||||
-
|
-
|
||||||
I create a record for stock.partial.move.
|
I process the partial picking with 20 PCE
|
||||||
-
|
-
|
||||||
!record {model: stock.partial.move, id: stock_partial_move_0}:
|
!python {model: stock.picking }: |
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
pick = self.browse(cr,uid,ref('stock_picking_0'))
|
||||||
|
stock_partial_move = self.pool.get('stock.partial.move')
|
||||||
-
|
partial_id = stock_partial_move.create(cr, uid, {},
|
||||||
I done stock.partial.move record.
|
context={'active_model': 'stock.move',
|
||||||
-
|
'active_ids': [x.id for x in pick.move_lines]})
|
||||||
!python {model: stock.partial.move }: |
|
stock_partial_move.do_partial(cr, uid, [partial_id])
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
move_obj = self.pool.get('stock.move')
|
|
||||||
pick=pick_obj.browse(cr,uid,ref('stock_picking_0'))
|
|
||||||
search_id = move_obj.search(cr, uid, [('picking_id', '=', pick.id)])
|
|
||||||
partial_datas={}
|
|
||||||
for move in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'quantity': 20,
|
|
||||||
'product_uom': move.product_uom.id,
|
|
||||||
'prodlot_id': move.prodlot_id and move.prodlot_id.id or False,
|
|
||||||
'wizard_id': ref('stock_partial_move_0'),
|
|
||||||
}
|
|
||||||
context = {"lang": 'en_US', "active_model": "stock.move", "active_ids": search_id, "tz": False, "active_id":search_id[0]}
|
|
||||||
self.fields_view_get(cr, uid, False,"form", context)
|
|
||||||
self.do_partial(cr, uid, [ref('stock_partial_move_0')], context)
|
|
||||||
|
|
||||||
-
|
-
|
||||||
I Performing an osv_memory action split_lot on module stock.move.split
|
I Performing an osv_memory action split_lot on module stock.move.split
|
||||||
-
|
-
|
||||||
|
@ -384,34 +363,14 @@
|
||||||
consume_obj.do_move_consume(cr, uid, [consume_id], context)
|
consume_obj.do_move_consume(cr, uid, [consume_id], context)
|
||||||
|
|
||||||
-
|
-
|
||||||
I create a record for stock partial picking.
|
I process the picking with the 80 remaining PCs
|
||||||
-
|
-
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
!python {model: stock.picking}: |
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
|
partial_id = stock_partial_picking.create(cr, uid, {},
|
||||||
-
|
context={'active_model': 'stock.picking',
|
||||||
I make stock partial picking order Done.
|
'active_ids': [ref('stock_picking_0')]})
|
||||||
-
|
stock_partial_picking.do_partial(cr, uid, [partial_id])
|
||||||
!python {model: stock.partial.picking}: |
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
partial = self.browse(cr, uid, ref('stock_partial_picking_0'), context)
|
|
||||||
partial_datas = {
|
|
||||||
'delivery_date' : partial.date
|
|
||||||
}
|
|
||||||
for pick in pick_obj.browse(cr, uid, [ref('stock_picking_0')]):
|
|
||||||
for m in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(m.id)] = {
|
|
||||||
'product_id' : m.product_id.id,
|
|
||||||
'product_qty' : 80,
|
|
||||||
'product_uom' : m.product_uom.id
|
|
||||||
}
|
|
||||||
context = {"lang": "en_US", "search_default_available":
|
|
||||||
1, "tz": False, "active_model": "ir.ui.menu",
|
|
||||||
"active_ids": [ref('stock_picking_0')], "active_id": ref("stock_picking_0"),
|
|
||||||
}
|
|
||||||
self.fields_view_get(cr, uid, False,"form", context)
|
|
||||||
self.do_partial(cr, uid, [ref('stock_partial_picking_0')], context)
|
|
||||||
|
|
||||||
-
|
-
|
||||||
I Performing an osv_memory action create_invoice on module stock.invoice.onshipping
|
I Performing an osv_memory action create_invoice on module stock.invoice.onshipping
|
||||||
-
|
-
|
||||||
|
@ -447,35 +406,20 @@
|
||||||
1, "tz": False, "active_model": "ir.ui.menu", "contact_display": "partner_address",
|
1, "tz": False, "active_model": "ir.ui.menu", "contact_display": "partner_address",
|
||||||
"active_ids": [ref("stock.menu_action_picking_tree4")], "active_id": ref("stock.menu_action_picking_tree4"),
|
"active_ids": [ref("stock.menu_action_picking_tree4")], "active_id": ref("stock.menu_action_picking_tree4"),
|
||||||
})
|
})
|
||||||
pick=self.browse(cr,uid,copy_id)
|
|
||||||
self.allow_cancel(cr, uid, [copy_id], context= None)
|
self.allow_cancel(cr, uid, [copy_id], context= None)
|
||||||
|
|
||||||
-
|
-
|
||||||
I create a record of stock.picking and I reaturn the picking
|
I process a copy of the picking and I return it
|
||||||
-
|
-
|
||||||
!python {model: stock.picking}: |
|
!python {model: stock.picking}: |
|
||||||
copy_id = self.copy(cr, uid, (ref("stock_picking_0")))
|
copy_id = self.copy(cr, uid, (ref("stock_picking_0")))
|
||||||
ctx = {"lang": "en_US", "active_model":
|
self.draft_force_assign(cr, uid, [copy_id])
|
||||||
"ir.ui.menu", "tz": False, "search_default_confirmed": 1, "contact_display":
|
self.force_assign(cr, uid, [copy_id])
|
||||||
"partner", "active_ids": [ref("stock.menu_action_picking_tree6")], "active_id":
|
stock_partial_picking = self.pool.get('stock.partial.picking')
|
||||||
ref("stock.menu_action_picking_tree6")}
|
context = {'active_model': 'stock.picking',
|
||||||
self.draft_force_assign(cr, uid, [copy_id], ctx)
|
'active_ids': [copy_id],
|
||||||
self.force_assign(cr, uid, [copy_id], ctx)
|
'active_id': copy_id}
|
||||||
pick=self.browse(cr,uid,copy_id)
|
partial_id = stock_partial_picking.create(cr, uid, {}, context=context)
|
||||||
partial_datas={}
|
stock_partial_picking.do_partial(cr, uid, [partial_id], context)
|
||||||
for move in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(move.id)]= {
|
|
||||||
'product_id': move.product_id,
|
|
||||||
'product_qty': move.product_qty,
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [pick.id],partial_datas)
|
|
||||||
reurn_datas={}
|
|
||||||
context = {"lang": 'en_US', "active_model":
|
|
||||||
"stock.picking", "active_ids": [pick.id], "tz": False, "active_id":pick.id}
|
|
||||||
return_pick_id = self.pool.get('stock.return.picking').create(cr, uid,{}, context)
|
return_pick_id = self.pool.get('stock.return.picking').create(cr, uid,{}, context)
|
||||||
for move in pick.move_lines:
|
|
||||||
reurn_datas= {
|
|
||||||
'product_id': move.product_id.id,
|
|
||||||
'quantity': move.product_qty,
|
|
||||||
}
|
|
||||||
self.pool.get('stock.return.picking').create_returns(cr, uid, [return_pick_id], context)
|
self.pool.get('stock.return.picking').create_returns(cr, uid, [return_pick_id], context)
|
||||||
|
|
|
@ -21,24 +21,17 @@
|
||||||
|
|
||||||
from osv import fields, osv
|
from osv import fields, osv
|
||||||
|
|
||||||
from tools.translate import _
|
|
||||||
import time
|
|
||||||
|
|
||||||
class stock_inventory_line_split(osv.osv_memory):
|
class stock_inventory_line_split(osv.osv_memory):
|
||||||
_inherit = "stock.move.split"
|
_inherit = "stock.move.split"
|
||||||
_name = "stock.inventory.line.split"
|
_name = "stock.inventory.line.split"
|
||||||
_description = "Split inventory lines"
|
_description = "Split inventory lines"
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'line_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_id', 'Production Lots'),
|
||||||
|
'line_exist_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_exist_id', 'Production Lots'),
|
||||||
|
}
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
def default_get(self, cr, uid, fields, context=None):
|
||||||
""" To check the availability of production lot.
|
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param fields: List of fields for which we want default values
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return: A dictionary which of fields with values.
|
|
||||||
"""
|
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
record_id = context and context.get('active_id',False)
|
record_id = context and context.get('active_id',False)
|
||||||
|
@ -54,14 +47,13 @@ class stock_inventory_line_split(osv.osv_memory):
|
||||||
|
|
||||||
def split(self, cr, uid, ids, line_ids, context=None):
|
def split(self, cr, uid, ids, line_ids, context=None):
|
||||||
""" To split stock inventory lines according to production lot.
|
""" To split stock inventory lines according to production lot.
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
:param line_ids: the ID or list of IDs of inventory lines we want to split
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param ids: the ID or list of IDs if we want more than one
|
|
||||||
@param line_ids: the ID or list of IDs of inventory lines we want to split
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return:
|
|
||||||
"""
|
"""
|
||||||
|
if context is None:
|
||||||
|
context = {}
|
||||||
|
assert context.get('active_model') == 'stock.inventory.line',\
|
||||||
|
'Incorrect use of the inventory line split wizard'
|
||||||
prodlot_obj = self.pool.get('stock.production.lot')
|
prodlot_obj = self.pool.get('stock.production.lot')
|
||||||
ir_sequence_obj = self.pool.get('ir.sequence')
|
ir_sequence_obj = self.pool.get('ir.sequence')
|
||||||
line_obj = self.pool.get('stock.inventory.line')
|
line_obj = self.pool.get('stock.inventory.line')
|
||||||
|
@ -108,7 +100,14 @@ class stock_inventory_line_split(osv.osv_memory):
|
||||||
line_obj.write(cr, uid, [inv_line.id], update_val)
|
line_obj.write(cr, uid, [inv_line.id], update_val)
|
||||||
|
|
||||||
return new_line
|
return new_line
|
||||||
stock_inventory_line_split()
|
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
class stock_inventory_split_lines(osv.osv_memory):
|
||||||
|
_inherit = "stock.move.split.lines"
|
||||||
|
_name = "stock.inventory.line.split.lines"
|
||||||
|
_description = "Inventory Split lines"
|
||||||
|
_columns = {
|
||||||
|
'wizard_id': fields.many2one('stock.inventory.line.split', 'Parent Wizard'),
|
||||||
|
'wizard_exist_id': fields.many2one('stock.inventory.line.split', 'Parent Wizard'),
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -28,7 +28,7 @@ class stock_invoice_onshipping(osv.osv_memory):
|
||||||
def _get_journal(self, cr, uid, context=None):
|
def _get_journal(self, cr, uid, context=None):
|
||||||
res = self._get_journal_id(cr, uid, context=context)
|
res = self._get_journal_id(cr, uid, context=context)
|
||||||
if res:
|
if res:
|
||||||
return res[0]
|
return res[0][0]
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _get_journal_id(self, cr, uid, context=None):
|
def _get_journal_id(self, cr, uid, context=None):
|
||||||
|
|
|
@ -146,14 +146,6 @@ class split_in_production_lot(osv.osv_memory):
|
||||||
_description = "Split in Production lots"
|
_description = "Split in Production lots"
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
def default_get(self, cr, uid, fields, context=None):
|
||||||
""" Get default values
|
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param fields: List of fields for default value
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return: Default values of fields
|
|
||||||
"""
|
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
res = super(split_in_production_lot, self).default_get(cr, uid, fields, context=context)
|
res = super(split_in_production_lot, self).default_get(cr, uid, fields, context=context)
|
||||||
|
@ -175,21 +167,14 @@ class split_in_production_lot(osv.osv_memory):
|
||||||
'qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
|
'qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
|
||||||
'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
|
'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
|
||||||
'product_uom': fields.many2one('product.uom', 'UoM'),
|
'product_uom': fields.many2one('product.uom', 'UoM'),
|
||||||
'line_ids': fields.one2many('stock.move.split.lines', 'lot_id', 'Production Lots'),
|
'line_ids': fields.one2many('stock.move.split.lines', 'wizard_id', 'Production Lots'),
|
||||||
'line_exist_ids': fields.one2many('stock.move.split.lines.exist', 'lot_id', 'Production Lots'),
|
'line_exist_ids': fields.one2many('stock.move.split.lines', 'wizard_exist_id', 'Production Lots'),
|
||||||
'use_exist' : fields.boolean('Existing Lots', help="Check this option to select existing lots in the list below, otherwise you should enter new ones line by line."),
|
'use_exist' : fields.boolean('Existing Lots', help="Check this option to select existing lots in the list below, otherwise you should enter new ones line by line."),
|
||||||
'location_id': fields.many2one('stock.location', 'Source Location')
|
'location_id': fields.many2one('stock.location', 'Source Location')
|
||||||
}
|
}
|
||||||
|
|
||||||
def split_lot(self, cr, uid, ids, context=None):
|
def split_lot(self, cr, uid, ids, context=None):
|
||||||
""" To split a lot
|
""" To split a lot"""
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param ids: An ID or list of IDs if we want more than one
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return:
|
|
||||||
"""
|
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
res = self.split(cr, uid, ids, context.get('active_ids'), context=context)
|
res = self.split(cr, uid, ids, context.get('active_ids'), context=context)
|
||||||
|
@ -197,16 +182,13 @@ class split_in_production_lot(osv.osv_memory):
|
||||||
|
|
||||||
def split(self, cr, uid, ids, move_ids, context=None):
|
def split(self, cr, uid, ids, move_ids, context=None):
|
||||||
""" To split stock moves into production lot
|
""" To split stock moves into production lot
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
:param move_ids: the ID or list of IDs of stock move we want to split
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param ids: the ID or list of IDs if we want more than one
|
|
||||||
@param move_ids: the ID or list of IDs of stock move we want to split
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return:
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
assert context.get('active_model') == 'stock.move',\
|
||||||
|
'Incorrect use of the stock move split wizard'
|
||||||
inventory_id = context.get('inventory_id', False)
|
inventory_id = context.get('inventory_id', False)
|
||||||
prodlot_obj = self.pool.get('stock.production.lot')
|
prodlot_obj = self.pool.get('stock.production.lot')
|
||||||
inventory_obj = self.pool.get('stock.inventory')
|
inventory_obj = self.pool.get('stock.inventory')
|
||||||
|
@ -269,12 +251,13 @@ class split_in_production_lot(osv.osv_memory):
|
||||||
split_in_production_lot()
|
split_in_production_lot()
|
||||||
|
|
||||||
class stock_move_split_lines_exist(osv.osv_memory):
|
class stock_move_split_lines_exist(osv.osv_memory):
|
||||||
_name = "stock.move.split.lines.exist"
|
_name = "stock.move.split.lines"
|
||||||
_description = "Exist Split lines"
|
_description = "Stock move Split lines"
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Tracking serial', size=64),
|
'name': fields.char('Tracking serial', size=64),
|
||||||
'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
|
'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
|
||||||
'lot_id': fields.many2one('stock.move.split', 'Lot'),
|
'wizard_id': fields.many2one('stock.move.split', 'Parent Wizard'),
|
||||||
|
'wizard_exist_id': fields.many2one('stock.move.split', 'Parent Wizard (for existing lines)'),
|
||||||
'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot'),
|
'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot'),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
|
@ -285,21 +268,3 @@ class stock_move_split_lines_exist(osv.osv_memory):
|
||||||
loc_id=False, product_id=False, uom_id=False):
|
loc_id=False, product_id=False, uom_id=False):
|
||||||
return self.pool.get('stock.move').onchange_lot_id(cr, uid, [], prodlot_id, product_qty,
|
return self.pool.get('stock.move').onchange_lot_id(cr, uid, [], prodlot_id, product_qty,
|
||||||
loc_id, product_id, uom_id)
|
loc_id, product_id, uom_id)
|
||||||
|
|
||||||
stock_move_split_lines_exist()
|
|
||||||
|
|
||||||
class stock_move_split_lines(osv.osv_memory):
|
|
||||||
_name = "stock.move.split.lines"
|
|
||||||
_description = "Split lines"
|
|
||||||
_columns = {
|
|
||||||
'name': fields.char('Tracking serial', size=64),
|
|
||||||
'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
|
|
||||||
'use_exist' : fields.boolean('Existing Lot'),
|
|
||||||
'lot_id': fields.many2one('stock.move.split', 'Lot'),
|
|
||||||
'action': fields.selection([('split','Split'),('keepinone','Keep in one lot')],'Action'),
|
|
||||||
}
|
|
||||||
_defaults = {
|
|
||||||
'quantity': 1.00,
|
|
||||||
'action' : 'split',
|
|
||||||
}
|
|
||||||
stock_move_split_lines()
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
# OpenERP, Open Source Management Solution
|
# OpenERP, Open Source Management Solution
|
||||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
# Copyright (C) 2004-TODAY OpenERP SA (<http://openerp.com>).
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU Affero General Public License as
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -20,210 +20,65 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from osv import fields, osv
|
from osv import fields, osv
|
||||||
from tools.translate import _
|
from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
|
||||||
import time
|
import time
|
||||||
import decimal_precision as dp
|
|
||||||
|
|
||||||
|
class stock_partial_move_line(osv.osv_memory):
|
||||||
class stock_partial_move_memory_out(osv.osv_memory):
|
_inherit = "stock.partial.picking.line"
|
||||||
_name = "stock.move.memory.out"
|
_name = "stock.partial.move.line"
|
||||||
_rec_name = 'product_id'
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'product_id' : fields.many2one('product.product', string="Product", required=True),
|
'wizard_id' : fields.many2one('stock.partial.move', string="Wizard", ondelete='CASCADE'),
|
||||||
'quantity' : fields.float("Quantity", required=True),
|
|
||||||
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True),
|
|
||||||
'prodlot_id' : fields.many2one('stock.production.lot', 'Production Lot'),
|
|
||||||
'location_id': fields.many2one('stock.location', 'Location', required=True),
|
|
||||||
'location_dest_id': fields.many2one('stock.location', 'Dest. Location', required=True),
|
|
||||||
'move_id' : fields.many2one('stock.move', "Move"),
|
|
||||||
'wizard_id' : fields.many2one('stock.partial.move', string="Wizard"),
|
|
||||||
'cost' : fields.float('Cost', digits_compute = dp.get_precision('Purchase Price'),help="Unit Cost for this product line"),
|
|
||||||
'currency' : fields.many2one('res.currency', string="Currency", help="Currency in which Unit cost is expressed"),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class stock_partial_move_memory_in(osv.osv_memory):
|
|
||||||
_inherit = "stock.move.memory.out"
|
|
||||||
_name = "stock.move.memory.in"
|
|
||||||
|
|
||||||
class stock_partial_move(osv.osv_memory):
|
class stock_partial_move(osv.osv_memory):
|
||||||
_name = "stock.partial.move"
|
_name = "stock.partial.move"
|
||||||
_description = "Partial Move"
|
_inherit = 'stock.partial.picking'
|
||||||
|
_description = "Partial Move Processing Wizard"
|
||||||
_columns = {
|
_columns = {
|
||||||
'date': fields.datetime('Date', required=True),
|
'date': fields.datetime('Date', required=True),
|
||||||
'type': fields.char("Type", size=3),
|
'move_ids' : fields.one2many('stock.partial.move.line', 'wizard_id', 'Moves'),
|
||||||
'product_moves_out' : fields.one2many('stock.move.memory.out', 'wizard_id', 'Moves'),
|
|
||||||
'product_moves_in' : fields.one2many('stock.move.memory.in', 'wizard_id', 'Moves'),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def __is_in(self,cr, uid, move_ids):
|
|
||||||
"""
|
|
||||||
@return: True if one of the moves has as picking type 'in'
|
|
||||||
"""
|
|
||||||
if not move_ids:
|
|
||||||
return False
|
|
||||||
|
|
||||||
move_obj = self.pool.get('stock.move')
|
|
||||||
move_ids = move_obj.search(cr, uid, [('id','in',move_ids)])
|
|
||||||
|
|
||||||
for move in move_obj.browse(cr, uid, move_ids):
|
|
||||||
if move.picking_id.type == 'in' and move.product_id.cost_method == 'average':
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def __get_picking_type(self, cr, uid, move_ids):
|
|
||||||
if self.__is_in(cr, uid, move_ids):
|
|
||||||
return "product_moves_in"
|
|
||||||
else:
|
|
||||||
return "product_moves_out"
|
|
||||||
|
|
||||||
def view_init(self, cr, uid, fields_list, context=None):
|
|
||||||
res = super(stock_partial_move, self).view_init(cr, uid, fields_list, context=context)
|
|
||||||
move_obj = self.pool.get('stock.move')
|
|
||||||
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
for move in move_obj.browse(cr, uid, context.get('active_ids', []), context=context):
|
|
||||||
if move.state in ('done', 'cancel'):
|
|
||||||
raise osv.except_osv(_('Invalid action !'), _('Cannot deliver products which are already delivered !'))
|
|
||||||
|
|
||||||
return res
|
|
||||||
|
|
||||||
|
|
||||||
def __create_partial_move_memory(self, move):
|
|
||||||
move_memory = {
|
|
||||||
'product_id' : move.product_id.id,
|
|
||||||
'quantity' : move.product_qty,
|
|
||||||
'product_uom' : move.product_uom.id,
|
|
||||||
'prodlot_id' : move.prodlot_id.id,
|
|
||||||
'move_id' : move.id,
|
|
||||||
}
|
|
||||||
|
|
||||||
if move.picking_id.type == 'in':
|
|
||||||
move_memory.update({
|
|
||||||
'cost' : move.product_id.standard_price,
|
|
||||||
'currency' : move.product_id.company_id and move.product_id.company_id.currency_id and move.product_id.company_id.currency_id.id or False,
|
|
||||||
})
|
|
||||||
return move_memory
|
|
||||||
|
|
||||||
def __get_active_stock_moves(self, cr, uid, context=None):
|
# picking_id is not used for move processing, so we remove the required attribute
|
||||||
move_obj = self.pool.get('stock.move')
|
# from the inherited column, and ignore it
|
||||||
if context is None:
|
'picking_id': fields.many2one('stock.picking', 'Picking'),
|
||||||
context = {}
|
}
|
||||||
|
|
||||||
res = []
|
def default_get(self, cr, uid, fields, context=None):
|
||||||
for move in move_obj.browse(cr, uid, context.get('active_ids', []), context=context):
|
if context is None: context = {}
|
||||||
if move.state in ('done', 'cancel'):
|
# no call to super!
|
||||||
continue
|
res = {}
|
||||||
res.append(self.__create_partial_move_memory(move))
|
move_ids = context.get('active_ids', [])
|
||||||
|
if not move_ids or not context.get('active_model') == 'stock.move':
|
||||||
|
return res
|
||||||
|
if 'move_ids' in fields:
|
||||||
|
move_ids = self.pool.get('stock.move').browse(cr, uid, move_ids, context=context)
|
||||||
|
moves = [self._partial_move_for(cr, uid, m) for m in move_ids if m.state not in ('done','cancel')]
|
||||||
|
res.update(move_ids=moves)
|
||||||
|
if 'date' in fields:
|
||||||
|
res.update(date=time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
_defaults = {
|
|
||||||
'product_moves_in' : __get_active_stock_moves,
|
|
||||||
'product_moves_out' : __get_active_stock_moves,
|
|
||||||
'date' : lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
|
||||||
if not context:
|
|
||||||
context = {}
|
|
||||||
|
|
||||||
message = {
|
|
||||||
'title' : _('Deliver Products'),
|
|
||||||
'info' : _('Delivery Information'),
|
|
||||||
'button' : _('Deliver'),
|
|
||||||
}
|
|
||||||
if context:
|
|
||||||
if context.get('product_receive', False):
|
|
||||||
message = {
|
|
||||||
'title' : _('Receive Products'),
|
|
||||||
'info' : _('Receive Information'),
|
|
||||||
'button' : _('Receive'),
|
|
||||||
}
|
|
||||||
|
|
||||||
move_ids = context.get('active_ids', False)
|
|
||||||
message['picking_type'] = self.__get_picking_type(cr, uid, move_ids)
|
|
||||||
result = super(stock_partial_move, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
|
|
||||||
_moves_fields = result['fields']
|
|
||||||
_moves_fields.update({
|
|
||||||
'product_moves_in' : {'relation': 'stock.move.memory.in', 'type' : 'one2many', 'string' : 'Product Moves'},
|
|
||||||
'product_moves_out' : {'relation': 'stock.move.memory.out', 'type' : 'one2many', 'string' : 'Product Moves'}
|
|
||||||
})
|
|
||||||
|
|
||||||
_moves_arch_lst = """
|
|
||||||
<form string="%(title)s">
|
|
||||||
<separator colspan="4" string="%(info)s"/>
|
|
||||||
<field name="date" colspan="2"/>
|
|
||||||
<separator colspan="4" string="Move Detail"/>
|
|
||||||
<field name="%(picking_type)s" colspan="4" nolabel="1" mode="tree,form" width="550" height="200" ></field>
|
|
||||||
<separator string="" colspan="4" />
|
|
||||||
<label string="" colspan="2"/>
|
|
||||||
<group col="2" colspan="2">
|
|
||||||
<button icon='gtk-cancel' special="cancel" string="_Cancel" />
|
|
||||||
<button name="do_partial" string="%(button)s"
|
|
||||||
colspan="1" type="object" icon="gtk-apply" />
|
|
||||||
</group>
|
|
||||||
</form> """ % message
|
|
||||||
|
|
||||||
result['arch'] = _moves_arch_lst
|
|
||||||
result['fields'] = _moves_fields
|
|
||||||
return result
|
|
||||||
|
|
||||||
def do_partial(self, cr, uid, ids, context=None):
|
def do_partial(self, cr, uid, ids, context=None):
|
||||||
""" Makes partial moves and pickings done.
|
# no call to super!
|
||||||
@param self: The object pointer.
|
assert len(ids) == 1, 'Partial move processing may only be done one form at a time'
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param fields: List of fields for which we want default values
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return: A dictionary which of fields with values.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
move_obj = self.pool.get('stock.move')
|
|
||||||
|
|
||||||
move_ids = context.get('active_ids', False)
|
|
||||||
partial = self.browse(cr, uid, ids[0], context=context)
|
partial = self.browse(cr, uid, ids[0], context=context)
|
||||||
partial_datas = {
|
partial_data = {
|
||||||
'delivery_date' : partial.date
|
'delivery_date' : partial.date
|
||||||
}
|
}
|
||||||
|
moves_ids = []
|
||||||
p_moves = {}
|
for move in partial.move_ids:
|
||||||
picking_type = self.__get_picking_type(cr, uid, move_ids)
|
move_id = move.move_id.id
|
||||||
|
partial_data['move%s' % (move_id)] = {
|
||||||
moves_list = picking_type == 'product_moves_in' and partial.product_moves_in or partial.product_moves_out
|
'product_id': move.product_id.id,
|
||||||
for product_move in moves_list:
|
'product_qty': move.quantity,
|
||||||
p_moves[product_move.move_id.id] = product_move
|
'product_uom': move.product_uom.id,
|
||||||
|
'prodlot_id': move.prodlot_id.id,
|
||||||
moves_ids_final = []
|
|
||||||
for move in move_obj.browse(cr, uid, move_ids, context=context):
|
|
||||||
if move.state in ('done', 'cancel'):
|
|
||||||
continue
|
|
||||||
if not p_moves.get(move.id):
|
|
||||||
continue
|
|
||||||
partial_datas['move%s' % (move.id)] = {
|
|
||||||
'product_id' : p_moves[move.id].product_id.id,
|
|
||||||
'product_qty' : p_moves[move.id].quantity,
|
|
||||||
'product_uom' :p_moves[move.id].product_uom.id,
|
|
||||||
'prodlot_id' : p_moves[move.id].prodlot_id.id,
|
|
||||||
}
|
}
|
||||||
|
moves_ids.append(move_id)
|
||||||
moves_ids_final.append(move.id)
|
if (move.move_id.picking_id.type == 'in') and (move.product_id.cost_method == 'average'):
|
||||||
if (move.picking_id.type == 'in') and (move.product_id.cost_method == 'average'):
|
partial_data['move%s' % (move_id)].update(product_price=move.cost,
|
||||||
partial_datas['move%s' % (move.id)].update({
|
product_currency=move.currency.id)
|
||||||
'product_price' : p_moves[move.id].cost,
|
self.pool.get('stock.move').do_partial(cr, uid, moves_ids, partial_data, context=context)
|
||||||
'product_currency': p_moves[move.id].currency.id,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
move_obj.do_partial(cr, uid, moves_ids_final, partial_datas, context=context)
|
|
||||||
return {'type': 'ir.actions.act_window_close'}
|
return {'type': 'ir.actions.act_window_close'}
|
||||||
|
|
||||||
stock_partial_move()
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
stock_partial_move_memory_out()
|
|
||||||
stock_partial_move_memory_in()
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
||||||
|
|
|
@ -1,16 +1,13 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<openerp>
|
<openerp>
|
||||||
<data>
|
<data>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<record id="action_partial_move_server" model="ir.actions.server">
|
<record id="action_partial_move_server" model="ir.actions.server">
|
||||||
<field name="name">Deliver/Receive Products</field>
|
<field name="name">Deliver/Receive Products</field>
|
||||||
<field name="model_id" ref="model_stock_move"/>
|
<field name="model_id" ref="model_stock_move"/>
|
||||||
<field name="state">code</field>
|
<field name="state">code</field>
|
||||||
<field name="code">action = obj.action_partial_move(context=context)</field>
|
<field name="code">action = obj.action_partial_move(context=context)</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="ir_open_partial_move_wizard" model="ir.values">
|
<record id="ir_open_partial_move_wizard" model="ir.values">
|
||||||
<field eval="'client_action_multi'" name="key2"/>
|
<field eval="'client_action_multi'" name="key2"/>
|
||||||
<field eval="'stock.move'" name="model"/>
|
<field eval="'stock.move'" name="model"/>
|
||||||
|
@ -19,75 +16,60 @@
|
||||||
<field eval="True" name="object"/>
|
<field eval="True" name="object"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="stock_partial_move_form" model="ir.ui.view">
|
||||||
|
<field name="name">stock.partial.move.form</field>
|
||||||
<record id="stock_move_memory_tree_in" model="ir.ui.view">
|
<field name="model">stock.partial.move</field>
|
||||||
<field name="name">stock.move.memory.tree</field>
|
|
||||||
<field name="model">stock.move.memory.in</field>
|
|
||||||
<field name="type">tree</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree editable="bottom" string="Product Moves">
|
|
||||||
<field name="product_id" />
|
|
||||||
<field name="quantity" />
|
|
||||||
<field name="product_uom" />
|
|
||||||
<field name="location_id" />
|
|
||||||
<field name="location_dest_id" />
|
|
||||||
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
|
||||||
<field name="cost" />
|
|
||||||
<field name="currency" />
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="stock_move_memory_form_in" model="ir.ui.view">
|
|
||||||
<field name="name">stock.move.memory.form</field>
|
|
||||||
<field name="model">stock.move.memory.in</field>
|
|
||||||
<field name="type">form</field>
|
<field name="type">form</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<field name="product_id" />
|
<separator colspan="4" string="Products"/>
|
||||||
<field name="quantity" />
|
<field name="move_ids" colspan="4" nolabel="1" mode="tree,form" width="550" height="200"/>
|
||||||
<field name="product_uom" />
|
<separator string="" colspan="4" />
|
||||||
<field name="location_id" />
|
<label string="" colspan="2"/>
|
||||||
<field name="location_dest_id" />
|
<group col="2" colspan="2">
|
||||||
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
<button icon='gtk-cancel' special="cancel" string="_Cancel" />
|
||||||
<field name="cost" />
|
<button name="do_partial" string="_Validate" colspan="1" type="object" icon="gtk-go-forward" />
|
||||||
<field name="currency" />
|
</group>
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="stock_move_memory_tree_out" model="ir.ui.view">
|
|
||||||
<field name="name">stock.move.memory.tree</field>
|
|
||||||
<field name="model">stock.move.memory.out</field>
|
|
||||||
<field name="type">tree</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree editable="bottom" string="Product Moves">
|
|
||||||
<field name="product_id" />
|
|
||||||
<field name="quantity" />
|
|
||||||
<field name="product_uom" />
|
|
||||||
<field name="location_id" />
|
|
||||||
<field name="location_dest_id" />
|
|
||||||
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="stock_move_memory_form_out" model="ir.ui.view">
|
|
||||||
<field name="name">stock.move.memory.form</field>
|
|
||||||
<field name="model">stock.move.memory.out</field>
|
|
||||||
<field name="type">form</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form>
|
|
||||||
<field name="product_id" />
|
|
||||||
<field name="quantity" />
|
|
||||||
<field name="product_uom" />
|
|
||||||
<field name="location_id" />
|
|
||||||
<field name="location_dest_id" />
|
|
||||||
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="stock_partial_move_line_list" model="ir.ui.view">
|
||||||
|
<field name="name">stock.partial.move.line.list</field>
|
||||||
|
<field name="model">stock.partial.move.line</field>
|
||||||
|
<field name="type">tree</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree editable="bottom" string="Product Moves">
|
||||||
|
<field name="product_id" />
|
||||||
|
<field name="quantity" />
|
||||||
|
<field name="product_uom" />
|
||||||
|
<field name="location_id" />
|
||||||
|
<field name="location_dest_id" />
|
||||||
|
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
||||||
|
<field name="update_cost" invisible="1"/>
|
||||||
|
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="stock_partial_move_line_form" model="ir.ui.view">
|
||||||
|
<field name="name">stock.partial.move.line.form</field>
|
||||||
|
<field name="model">stock.partial.move.line</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<field name="product_id" />
|
||||||
|
<field name="quantity" />
|
||||||
|
<field name="product_uom" />
|
||||||
|
<field name="location_id" />
|
||||||
|
<field name="location_dest_id" />
|
||||||
|
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
||||||
|
<field name="update_cost" invisible="1"/>
|
||||||
|
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
# OpenERP, Open Source Management Solution
|
# OpenERP, Open Source Management Solution
|
||||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
# Copyright (C) 2004-TODAY OpenERP SA (<http://openerp.com>).
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU Affero General Public License as
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -20,169 +19,119 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from osv import fields, osv
|
|
||||||
from tools.translate import _
|
|
||||||
import time
|
import time
|
||||||
|
from osv import fields, osv
|
||||||
|
from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
|
||||||
|
|
||||||
|
class stock_partial_picking_line(osv.TransientModel):
|
||||||
|
_name = "stock.partial.picking.line"
|
||||||
|
_rec_name = 'product_id'
|
||||||
|
_columns = {
|
||||||
|
'product_id' : fields.many2one('product.product', string="Product", required=True, ondelete='CASCADE'),
|
||||||
|
'quantity' : fields.float("Quantity", required=True),
|
||||||
|
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True, ondelete='CASCADE'),
|
||||||
|
'prodlot_id' : fields.many2one('stock.production.lot', 'Production Lot', ondelete='CASCADE'),
|
||||||
|
'location_id': fields.many2one('stock.location', 'Location', required=True, ondelete='CASCADE'),
|
||||||
|
'location_dest_id': fields.many2one('stock.location', 'Dest. Location', required=True, ondelete='CASCADE'),
|
||||||
|
'move_id' : fields.many2one('stock.move', "Move", ondelete='CASCADE'),
|
||||||
|
'wizard_id' : fields.many2one('stock.partial.picking', string="Wizard", ondelete='CASCADE'),
|
||||||
|
'update_cost': fields.boolean('Need cost update'),
|
||||||
|
'cost' : fields.float("Cost", help="Unit Cost for this product line"),
|
||||||
|
'currency' : fields.many2one('res.currency', string="Currency", help="Currency in which Unit cost is expressed", ondelete='CASCADE'),
|
||||||
|
}
|
||||||
|
|
||||||
class stock_partial_picking(osv.osv_memory):
|
class stock_partial_picking(osv.osv_memory):
|
||||||
_name = "stock.partial.picking"
|
_name = "stock.partial.picking"
|
||||||
_description = "Partial Picking"
|
_description = "Partial Picking Processing Wizard"
|
||||||
_columns = {
|
_columns = {
|
||||||
'date': fields.datetime('Date', required=True),
|
'date': fields.datetime('Date', required=True),
|
||||||
'product_moves_out' : fields.one2many('stock.move.memory.out', 'wizard_id', 'Moves'),
|
'move_ids' : fields.one2many('stock.partial.picking.line', 'wizard_id', 'Product Moves'),
|
||||||
'product_moves_in' : fields.one2many('stock.move.memory.in', 'wizard_id', 'Moves'),
|
'picking_id': fields.many2one('stock.picking', 'Picking', required=True, ondelete='CASCADE'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_picking_type(self, cr, uid, picking, context=None):
|
|
||||||
picking_type = picking.type
|
|
||||||
for move in picking.move_lines:
|
|
||||||
if picking.type == 'in' and move.product_id.cost_method == 'average':
|
|
||||||
picking_type = 'in'
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
picking_type = 'out'
|
|
||||||
return picking_type
|
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
def default_get(self, cr, uid, fields, context=None):
|
||||||
""" To get default values for the object.
|
if context is None: context = {}
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param fields: List of fields for which we want default values
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return: A dictionary which of fields with values.
|
|
||||||
"""
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
|
res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
|
||||||
picking_ids = context.get('active_ids', [])
|
picking_ids = context.get('active_ids', [])
|
||||||
if not picking_ids:
|
if not picking_ids or (not context.get('active_model') == 'stock.picking') \
|
||||||
|
or len(picking_ids) != 1:
|
||||||
|
# Partial Picking Processing may only be done for one picking at a time
|
||||||
return res
|
return res
|
||||||
|
picking_id, = picking_ids
|
||||||
result = []
|
if 'picking_id' in fields:
|
||||||
for pick in pick_obj.browse(cr, uid, picking_ids, context=context):
|
res.update(picking_id=picking_id)
|
||||||
pick_type = self.get_picking_type(cr, uid, pick, context=context)
|
if 'move_ids' in fields:
|
||||||
for m in pick.move_lines:
|
picking = self.pool.get('stock.picking').browse(cr, uid, picking_id, context=context)
|
||||||
if m.state in ('done', 'cancel'):
|
moves = [self._partial_move_for(cr, uid, m) for m in picking.move_lines if m.state not in ('done','cancel')]
|
||||||
continue
|
res.update(move_ids=moves)
|
||||||
result.append(self.__create_partial_picking_memory(m, pick_type))
|
|
||||||
|
|
||||||
if 'product_moves_in' in fields:
|
|
||||||
res.update({'product_moves_in': result})
|
|
||||||
if 'product_moves_out' in fields:
|
|
||||||
res.update({'product_moves_out': result})
|
|
||||||
if 'date' in fields:
|
if 'date' in fields:
|
||||||
res.update({'date': time.strftime('%Y-%m-%d %H:%M:%S')})
|
res.update(date=time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
|
||||||
result = super(stock_partial_picking, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
|
|
||||||
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
picking_ids = context.get('active_ids', False)
|
|
||||||
|
|
||||||
if not picking_ids:
|
def _product_cost_for_average_update(self, cr, uid, move):
|
||||||
# not called through an action (e.g. buildbot), return the default.
|
"""Returns product cost and currency ID for the given move, suited for re-computing
|
||||||
return result
|
the average product cost.
|
||||||
|
|
||||||
for pick in pick_obj.browse(cr, uid, picking_ids, context=context):
|
|
||||||
picking_type = self.get_picking_type(cr, uid, pick, context=context)
|
|
||||||
|
|
||||||
_moves_arch_lst = """<form string="%s">
|
:return: map of the form::
|
||||||
<field name="date" invisible="1"/>
|
|
||||||
<separator colspan="4" string="%s"/>
|
|
||||||
<field name="%s" colspan="4" nolabel="1" mode="tree,form" width="550" height="200" ></field>
|
|
||||||
""" % (_('Process Document'), _('Products'), "product_moves_" + picking_type)
|
|
||||||
_moves_fields = result['fields']
|
|
||||||
|
|
||||||
# add field related to picking type only
|
{'cost': 123.34,
|
||||||
_moves_fields.update({
|
'currency': 42}
|
||||||
'product_moves_' + picking_type: {'relation': 'stock.move.memory.'+picking_type, 'type' : 'one2many', 'string' : 'Product Moves'},
|
"""
|
||||||
})
|
# Currently, the cost on the product form is supposed to be expressed in the currency
|
||||||
|
# of the company owning the product. If not set, we fall back to the picking's company,
|
||||||
|
# which should work in simple cases.
|
||||||
|
return {'cost': move.product_id.standard_price,
|
||||||
|
'currency': move.product_id.company_id.currency_id.id \
|
||||||
|
or move.picking_id.company_id.currency_id.id \
|
||||||
|
or False}
|
||||||
|
|
||||||
_moves_arch_lst += """
|
def _partial_move_for(self, cr, uid, move):
|
||||||
<separator string="" colspan="4" />
|
partial_move = {
|
||||||
<label string="" colspan="2"/>
|
'product_id' : move.product_id.id,
|
||||||
<group col="2" colspan="2">
|
'quantity' : move.product_qty,
|
||||||
<button icon='gtk-cancel' special="cancel"
|
'product_uom' : move.product_uom.id,
|
||||||
string="_Cancel" />
|
'prodlot_id' : move.prodlot_id.id,
|
||||||
<button name="do_partial" string="_Validate"
|
'move_id' : move.id,
|
||||||
colspan="1" type="object" icon="gtk-go-forward" />
|
'location_id' : move.location_id.id,
|
||||||
</group>
|
'location_dest_id' : move.location_dest_id.id,
|
||||||
</form>"""
|
|
||||||
result['arch'] = _moves_arch_lst
|
|
||||||
result['fields'] = _moves_fields
|
|
||||||
return result
|
|
||||||
|
|
||||||
def __create_partial_picking_memory(self, picking, pick_type):
|
|
||||||
move_memory = {
|
|
||||||
'product_id' : picking.product_id.id,
|
|
||||||
'quantity' : picking.product_qty,
|
|
||||||
'product_uom' : picking.product_uom.id,
|
|
||||||
'prodlot_id' : picking.prodlot_id.id,
|
|
||||||
'move_id' : picking.id,
|
|
||||||
'location_id' : picking.location_id.id,
|
|
||||||
'location_dest_id' : picking.location_dest_id.id,
|
|
||||||
}
|
}
|
||||||
|
if move.picking_id.type == 'in' and move.product_id.cost_method == 'average':
|
||||||
if pick_type == 'in':
|
partial_move.update(update_cost=True, **self._product_cost_for_average_update(cr, uid, move))
|
||||||
move_memory.update({
|
return partial_move
|
||||||
'cost' : picking.product_id.standard_price,
|
|
||||||
'currency' : picking.product_id.company_id and picking.product_id.company_id.currency_id and picking.product_id.company_id.currency_id.id or False,
|
|
||||||
})
|
|
||||||
return move_memory
|
|
||||||
|
|
||||||
def do_partial(self, cr, uid, ids, context=None):
|
def do_partial(self, cr, uid, ids, context=None):
|
||||||
""" Makes partial moves and pickings done.
|
assert len(ids) == 1, 'Partial picking processing may only be done one at a time'
|
||||||
@param self: The object pointer.
|
stock_picking = self.pool.get('stock.picking')
|
||||||
@param cr: A database cursor
|
stock_move = self.pool.get('stock.move')
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param fields: List of fields for which we want default values
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return: A dictionary which of fields with values.
|
|
||||||
"""
|
|
||||||
pick_obj = self.pool.get('stock.picking')
|
|
||||||
stock_move_obj = self.pool.get('stock.move')
|
|
||||||
picking_ids = context.get('active_ids', False)
|
|
||||||
partial = self.browse(cr, uid, ids[0], context=context)
|
partial = self.browse(cr, uid, ids[0], context=context)
|
||||||
partial_datas = {
|
partial_data = {
|
||||||
'delivery_date' : partial.date
|
'delivery_date' : partial.date
|
||||||
}
|
}
|
||||||
for pick in pick_obj.browse(cr, uid, picking_ids, context=context):
|
picking_type = partial.picking_id.type
|
||||||
picking_type = self.get_picking_type(cr, uid, pick, context=context)
|
for move in partial.move_ids:
|
||||||
moves_list = picking_type == 'in' and partial.product_moves_in or partial.product_moves_out
|
move_id = move.move_id.id
|
||||||
for move in moves_list:
|
if not move_id:
|
||||||
if not move.move_id.id:
|
seq_obj_name = 'stock.picking.' + picking_type
|
||||||
seq_obj_name = 'stock.picking.' + picking_type
|
move_id = stock_move.create(cr,uid,{'name' : self.pool.get('ir.sequence').get(cr, uid, seq_obj_name),
|
||||||
move_id = stock_move_obj.create(cr,uid,{'name' : self.pool.get('ir.sequence').get(cr, uid, seq_obj_name),
|
'product_id': move.product_id.id,
|
||||||
'product_id': move.product_id.id,
|
'product_qty': move.quantity,
|
||||||
'product_qty': move.quantity,
|
'product_uom': move.product_uom.id,
|
||||||
'product_uom': move.product_uom.id,
|
'prodlot_id': move.prodlot_id.id,
|
||||||
'prodlot_id': move.prodlot_id.id,
|
'location_id' : move.location_id.id,
|
||||||
'location_id' : move.location_id.id,
|
'location_dest_id' : move.location_dest_id.id,
|
||||||
'location_dest_id' : move.location_dest_id.id,
|
'picking_id': partial.picking_id.id
|
||||||
'picking_id': pick.id
|
},context=context)
|
||||||
},context=context)
|
stock_move.action_done(cr, uid, [move_id], context)
|
||||||
stock_move_obj.action_done(cr, uid, [move_id], context)
|
partial_data['move%s' % (move_id)] = {
|
||||||
else:
|
'product_id': move.product_id.id,
|
||||||
move_id = move.move_id.id
|
'product_qty': move.quantity,
|
||||||
|
'product_uom': move.product_uom.id,
|
||||||
partial_datas['move%s' % (move_id)] = {
|
'prodlot_id': move.prodlot_id.id,
|
||||||
'product_id': move.product_id.id,
|
}
|
||||||
'product_qty': move.quantity,
|
if (picking_type == 'in') and (move.product_id.cost_method == 'average'):
|
||||||
'product_uom': move.product_uom.id,
|
partial_data['move%s' % (move.move_id.id)].update(product_price=move.cost,
|
||||||
'prodlot_id': move.prodlot_id.id,
|
product_currency=move.currency.id)
|
||||||
}
|
stock_picking.do_partial(cr, uid, [partial.picking_id.id], partial_data, context=context)
|
||||||
if (picking_type == 'in') and (move.product_id.cost_method == 'average'):
|
|
||||||
partial_datas['move%s' % (move.move_id.id)].update({
|
|
||||||
'product_price' : move.cost,
|
|
||||||
'product_currency': move.currency.id,
|
|
||||||
})
|
|
||||||
pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context)
|
|
||||||
return {'type': 'ir.actions.act_window_close'}
|
return {'type': 'ir.actions.act_window_close'}
|
||||||
|
|
||||||
stock_partial_picking()
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
|
@ -9,5 +9,59 @@
|
||||||
<field name="target">new</field>
|
<field name="target">new</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="stock_partial_picking_form" model="ir.ui.view">
|
||||||
|
<field name="name">stock.partial.picking.form</field>
|
||||||
|
<field name="model">stock.partial.picking</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<separator colspan="4" string="Products"/>
|
||||||
|
<field name="move_ids" colspan="4" nolabel="1" mode="tree,form" width="550" height="200"/>
|
||||||
|
<separator string="" colspan="4" />
|
||||||
|
<label string="" colspan="2"/>
|
||||||
|
<group col="2" colspan="2">
|
||||||
|
<button icon='gtk-cancel' special="cancel" string="_Cancel" />
|
||||||
|
<button name="do_partial" string="_Validate" colspan="1" type="object" icon="gtk-go-forward" />
|
||||||
|
</group>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="stock_partial_picking_line_list" model="ir.ui.view">
|
||||||
|
<field name="name">stock.partial.picking.line.list</field>
|
||||||
|
<field name="model">stock.partial.picking.line</field>
|
||||||
|
<field name="type">tree</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree editable="bottom" string="Product Moves">
|
||||||
|
<field name="product_id" />
|
||||||
|
<field name="quantity" />
|
||||||
|
<field name="product_uom" />
|
||||||
|
<field name="location_id" />
|
||||||
|
<field name="location_dest_id" />
|
||||||
|
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
||||||
|
<field name="update_cost" invisible="1"/>
|
||||||
|
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<record id="stock_partial_picking_line_form" model="ir.ui.view">
|
||||||
|
<field name="name">stock.partial.picking.line.form</field>
|
||||||
|
<field name="model">stock.partial.picking.line</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<field name="product_id" />
|
||||||
|
<field name="quantity" />
|
||||||
|
<field name="product_uom" />
|
||||||
|
<field name="location_id" />
|
||||||
|
<field name="location_dest_id" />
|
||||||
|
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
|
||||||
|
<field name="update_cost" invisible="1"/>
|
||||||
|
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -38,36 +38,19 @@
|
||||||
"active_ids": [ref("stock.menu_action_picking_tree")], "active_id": ref("stock.menu_action_picking_tree"),
|
"active_ids": [ref("stock.menu_action_picking_tree")], "active_id": ref("stock.menu_action_picking_tree"),
|
||||||
})
|
})
|
||||||
-
|
-
|
||||||
I create a record for partial picking.
|
I process the delivery
|
||||||
-
|
|
||||||
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
|
|
||||||
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
-
|
|
||||||
I make picking order Done.
|
|
||||||
-
|
-
|
||||||
!python {model: stock.partial.picking}: |
|
!python {model: stock.partial.picking}: |
|
||||||
pick_obj = self.pool.get('stock.picking')
|
partial_id = self.create(cr, uid, {}, context={'active_model':'stock.picking',
|
||||||
partial = self.browse(cr, uid, ref('stock_partial_picking_0'), context)
|
'active_ids':[ref('stock_picking_out0')]})
|
||||||
partial_datas = {
|
self.do_partial(cr, uid, [partial_id])
|
||||||
'delivery_date' : partial.date
|
|
||||||
}
|
|
||||||
for pick in pick_obj.browse(cr, uid, [ref('stock_picking_out0')]):
|
|
||||||
for m in pick.move_lines:
|
|
||||||
partial_datas['move%s'%(m.id)] = {
|
|
||||||
'product_id' : m.product_id.id,
|
|
||||||
'product_qty' : m.product_qty,
|
|
||||||
'product_uom' : m.product_uom.id
|
|
||||||
}
|
|
||||||
self.do_partial(cr, uid, [ref('stock_partial_picking_0')], {"lang": "en_US", "search_default_available":
|
|
||||||
1, "tz": False, "active_model": "ir.ui.menu", "contact_display": "partner",
|
|
||||||
"active_ids": [ref('stock_picking_out0')], "active_id": ref("stock_picking_out0"),
|
|
||||||
})
|
|
||||||
-
|
-
|
||||||
As the Invoice state of the picking order is To be invoiced. I create invoice for my outgoing picking order.
|
As the Invoice state of the picking order is To be invoiced. I create invoice for my outgoing picking order.
|
||||||
-
|
-
|
||||||
!python {model: stock.invoice.onshipping}: |
|
!python {model: stock.invoice.onshipping}: |
|
||||||
wiz_id = self.create(cr, uid, {'invoice_date': '2010-08-04', 'journal_id': ref('account.bank_journal')},
|
wiz_id = self.create(cr, uid, {'invoice_date': '2010-08-04', 'journal_id': ref('account.sales_journal')},
|
||||||
{'active_ids': [ref("stock_picking_out0")]})
|
{'active_ids': [ref("stock_picking_out0")], "active_model": "stock.picking"})
|
||||||
self.create_invoice(cr, uid, [wiz_id], {"lang": "en_US",
|
self.create_invoice(cr, uid, [wiz_id], {"lang": "en_US",
|
||||||
"search_default_available": 1, "tz": False, "active_model": "stock.picking",
|
"search_default_available": 1, "tz": False, "active_model": "stock.picking",
|
||||||
"contact_display": "partner", "active_ids": [ref("stock_picking_out0")], "active_id": ref("stock_picking_out0")})
|
"contact_display": "partner", "active_ids": [ref("stock_picking_out0")], "active_id": ref("stock_picking_out0")})
|
||||||
|
|
|
@ -25,24 +25,15 @@ class invoice_directly(osv.osv_memory):
|
||||||
_inherit = 'stock.partial.picking'
|
_inherit = 'stock.partial.picking'
|
||||||
|
|
||||||
def do_partial(self, cr, uid, ids, context=None):
|
def do_partial(self, cr, uid, ids, context=None):
|
||||||
""" Makes partial moves and pickings done and
|
"""Launch Create invoice wizard if invoice state is To be Invoiced,
|
||||||
launches Create invoice wizard if invoice state is To be Invoiced.
|
after processing the partial picking.
|
||||||
@param self: The object pointer.
|
|
||||||
@param cr: A database cursor
|
|
||||||
@param uid: ID of the user currently logged in
|
|
||||||
@param context: A standard dictionary
|
|
||||||
@return:
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None: context = {}
|
||||||
context = {}
|
|
||||||
result = super(invoice_directly, self).do_partial(cr, uid, ids, context)
|
result = super(invoice_directly, self).do_partial(cr, uid, ids, context)
|
||||||
pick_obj = self.pool.get('stock.picking')
|
partial = self.browse(cr, uid, ids[0], context)
|
||||||
context.update({'active_model':'stock.picking'})
|
context.update(active_model='stock.picking',
|
||||||
picking_ids = context.get('active_ids', False)
|
active_ids=[partial.picking_id.id])
|
||||||
if picking_ids:
|
if partial.picking_id.invoice_state == '2binvoiced':
|
||||||
context.update({'active_id':picking_ids[0]})
|
|
||||||
pick = pick_obj.browse(cr, uid, picking_ids, context=context)[0]
|
|
||||||
if pick.invoice_state == '2binvoiced':
|
|
||||||
return {
|
return {
|
||||||
'name': 'Create Invoice',
|
'name': 'Create Invoice',
|
||||||
'view_type': 'form',
|
'view_type': 'form',
|
||||||
|
@ -55,5 +46,5 @@ class invoice_directly(osv.osv_memory):
|
||||||
return {'type': 'ir.actions.act_window_close'}
|
return {'type': 'ir.actions.act_window_close'}
|
||||||
|
|
||||||
invoice_directly()
|
invoice_directly()
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -46,7 +46,7 @@ class stock_period(osv.osv):
|
||||||
'name': fields.char('Period Name', size=64, required=True),
|
'name': fields.char('Period Name', size=64, required=True),
|
||||||
'date_start': fields.datetime('Start Date', required=True),
|
'date_start': fields.datetime('Start Date', required=True),
|
||||||
'date_stop': fields.datetime('End Date', required=True),
|
'date_stop': fields.datetime('End Date', required=True),
|
||||||
'state': fields.selection([('draft','Draft'), ('open','Open'),('close','Close')], 'State')
|
'state': fields.selection([('draft','Draft'), ('open','Open'),('close','Close')], 'State'),
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'state': 'draft'
|
'state': 'draft'
|
||||||
|
|
|
@ -46,6 +46,7 @@ class stock_period_createlines(osv.osv_memory):
|
||||||
'date_start': fields.date('Start Date', required=True, help="Starting date for planning period."),
|
'date_start': fields.date('Start Date', required=True, help="Starting date for planning period."),
|
||||||
'date_stop': fields.date('End Date', required=True, help="Ending date for planning period."),
|
'date_stop': fields.date('End Date', required=True, help="Ending date for planning period."),
|
||||||
'period_ids': fields.one2many('stock.period', 'planning_id', 'Periods'),
|
'period_ids': fields.one2many('stock.period', 'planning_id', 'Periods'),
|
||||||
|
'period_ids': fields.many2many('stock.period', 'stock_period_createlines_stock_period_rel', 'wizard_id', 'period_id', 'Periods'),
|
||||||
}
|
}
|
||||||
_defaults={
|
_defaults={
|
||||||
'date_start': _get_new_period_start,
|
'date_start': _get_new_period_start,
|
||||||
|
|
|
@ -1281,6 +1281,7 @@
|
||||||
<field name="responsible_id" ref="base.user_demo"/>
|
<field name="responsible_id" ref="base.user_demo"/>
|
||||||
<field name="max_response_limit">20</field>
|
<field name="max_response_limit">20</field>
|
||||||
<field name="type" ref="survey_type2"/>
|
<field name="type" ref="survey_type2"/>
|
||||||
|
<field name="state">open</field>
|
||||||
<field name="response_user">5</field>
|
<field name="response_user">5</field>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -144,8 +144,8 @@
|
||||||
Give answer of the survey, Run "Answer a Survey" wizard and select the survey and press on start button then run the selected survey.
|
Give answer of the survey, Run "Answer a Survey" wizard and select the survey and press on start button then run the selected survey.
|
||||||
-
|
-
|
||||||
!python {model: survey.name.wiz}: |
|
!python {model: survey.name.wiz}: |
|
||||||
ids = self.create(cr, uid, {'survey_id': ref("survey_partner_0")})
|
id = self.create(cr, uid, {'survey_id': ref("survey_partner_0")})
|
||||||
self.action_next(cr, uid, [ids], context)
|
self.action_next(cr, uid, [id], context)
|
||||||
-
|
-
|
||||||
Give answer of the first and second page in "Partner Feedback" suvey.
|
Give answer of the first and second page in "Partner Feedback" suvey.
|
||||||
-
|
-
|
||||||
|
|
|
@ -40,14 +40,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
||||||
"""
|
"""
|
||||||
Fields View Get method :- generate the new view and display the survey pages of selected survey.
|
Fields View Get method :- generate the new view and display the survey pages of selected survey.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param view_id : view id of the current object.
|
|
||||||
@param view_type : which type of view is create. like :- form, tree ,search etc...
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for created view of particular survey pages.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
result = super(survey_question_wiz, self).fields_view_get(cr, uid, view_id, \
|
result = super(survey_question_wiz, self).fields_view_get(cr, uid, view_id, \
|
||||||
|
@ -88,7 +80,7 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
if not survey_id:
|
if not survey_id:
|
||||||
# Try one more time to find it
|
# Try one more time to find it
|
||||||
if sur_name_rec and sur_name_rec.survey_id:
|
if sur_name_rec and sur_name_rec.survey_id:
|
||||||
survey_id = sur_name_rec.survey_id[0]
|
survey_id = sur_name_rec.survey_id.id
|
||||||
else:
|
else:
|
||||||
# raise osv.except_osv(_('Error!'), _("Cannot locate survey for the question wizard!"))
|
# raise osv.except_osv(_('Error!'), _("Cannot locate survey for the question wizard!"))
|
||||||
# If this function is called without a survey_id in
|
# If this function is called without a survey_id in
|
||||||
|
@ -398,10 +390,10 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
sur_response_obj.write(cr, uid, [sur_name_read.response], {'state' : 'done'})
|
sur_response_obj.write(cr, uid, [sur_name_read.response], {'state' : 'done'})
|
||||||
|
|
||||||
if sur_rec.send_response:
|
if sur_rec.send_response:
|
||||||
survey_data = survey_obj.browse(cr, uid, int(survey_id))
|
survey_data = survey_obj.browse(cr, uid, survey_id)
|
||||||
response_id = surv_name_wiz.read(cr, uid, context.get('sur_name_id',False))['response']
|
response_id = surv_name_wiz.read(cr, uid, context.get('sur_name_id',False))['response']
|
||||||
context.update({'response_id':response_id})
|
context.update({'response_id':response_id})
|
||||||
report = self.create_report(cr, uid, [int(survey_id)], 'report.survey.browse.response', survey_data.title,context)
|
report = self.create_report(cr, uid, [survey_id], 'report.survey.browse.response', survey_data.title,context)
|
||||||
attachments = {}
|
attachments = {}
|
||||||
file = open(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf")
|
file = open(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf")
|
||||||
file_data = ""
|
file_data = ""
|
||||||
|
@ -445,15 +437,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def create_report(self, cr, uid, res_ids, report_name=False, file_name=False, context=None):
|
def create_report(self, cr, uid, res_ids, report_name=False, file_name=False, context=None):
|
||||||
"""
|
"""
|
||||||
If any user give answer of survey then last create report of this answer and if 'E-mail Notification on Answer' set True in survey then send mail on responsible person of this survey and attach survey answer report in pdf format.
|
If any user give answer of survey then last create report of this answer and if 'E-mail Notification on Answer' set True in survey then send mail on responsible person of this survey and attach survey answer report in pdf format.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param res_ids: List of survey answer IDs,
|
|
||||||
@param report_name: name of the report,
|
|
||||||
@param file_name: To give file name of the report,
|
|
||||||
@param context: A standard dictionary for contextual values,
|
|
||||||
@return : Dictionary value for created report with file nameself.
|
|
||||||
"""
|
"""
|
||||||
if not report_name or not res_ids:
|
if not report_name or not res_ids:
|
||||||
return (False, Exception('Report name and Resources ids are required !!!'))
|
return (False, Exception('Report name and Resources ids are required !!!'))
|
||||||
|
@ -474,13 +457,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def default_get(self, cr, uid, fields_list, context=None):
|
def default_get(self, cr, uid, fields_list, context=None):
|
||||||
"""
|
"""
|
||||||
Assign Default value in particular field. If Browse Answers wizard run then read the value into database and Assigne to a particular fields.
|
Assign Default value in particular field. If Browse Answers wizard run then read the value into database and Assigne to a particular fields.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param fields_list: List of fields of current view,
|
|
||||||
@param context: A standard dictionary for contextual values,
|
|
||||||
@return : Dictionary value for fields list with value.
|
|
||||||
"""
|
"""
|
||||||
value = {}
|
value = {}
|
||||||
if context is None:
|
if context is None:
|
||||||
|
@ -556,13 +532,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def create(self, cr, uid, vals, context=None):
|
def create(self, cr, uid, vals, context=None):
|
||||||
"""
|
"""
|
||||||
Create the Answer of survey and store in survey.response object, and if set validation of question then check the value of question if value is wrong then raise the exception.
|
Create the Answer of survey and store in survey.response object, and if set validation of question then check the value of question if value is wrong then raise the exception.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param vals: Values,
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : True.
|
|
||||||
"""
|
"""
|
||||||
if context is None: context = {}
|
if context is None: context = {}
|
||||||
if context.has_key('active') and context.get('active',False):
|
if context.has_key('active') and context.get('active',False):
|
||||||
|
@ -600,9 +569,10 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
#click first time on next button then increemnet on total start suvey
|
#click first time on next button then increemnet on total start suvey
|
||||||
if not sur_name_read['store_ans']:
|
if not sur_name_read['store_ans']:
|
||||||
his_id = self.pool.get('survey.history').create(cr, uid, {'user_id': uid, \
|
his_id = self.pool.get('survey.history').create(cr, uid, {'user_id': uid, \
|
||||||
'date': strftime('%Y-%m-%d %H:%M:%S'), 'survey_id': sur_name_read['survey_id']})
|
'date': strftime('%Y-%m-%d %H:%M:%S'), 'survey_id': sur_name_read['survey_id'][0]})
|
||||||
sur_rec = survey_obj.read(cr, uid, sur_name_read['survey_id'])
|
survey_id = sur_name_read['survey_id'][0]
|
||||||
survey_obj.write(cr, uid, sur_name_read['survey_id'], {'tot_start_survey' : sur_rec['tot_start_survey'] + 1})
|
sur_rec = survey_obj.read(cr, uid, survey_id)
|
||||||
|
survey_obj.write(cr, uid, survey_id, {'tot_start_survey' : sur_rec['tot_start_survey'] + 1})
|
||||||
if context.has_key('cur_id'):
|
if context.has_key('cur_id'):
|
||||||
if context.has_key('request') and context.get('request',False):
|
if context.has_key('request') and context.get('request',False):
|
||||||
self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
|
self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
|
||||||
|
@ -1016,13 +986,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_new_question(self,cr, uid, ids, context=None):
|
def action_new_question(self,cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
New survey.Question form.
|
New survey.Question form.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open new survey.Qestion form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1044,13 +1007,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_new_page(self, cr, uid, ids, context=None):
|
def action_new_page(self, cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
New survey.Page form.
|
New survey.Page form.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open new survey.page form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1072,13 +1028,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_edit_page(self,cr, uid, ids, context=None):
|
def action_edit_page(self,cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Edit survey.page.
|
Edit survey.page.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open Edit survey.page form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1101,13 +1050,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_delete_page(self,cr, uid, ids, context=None):
|
def action_delete_page(self,cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Delete survey.page.
|
Delete survey.page.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open next survey.page form, but delete the selected page.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1134,13 +1076,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_edit_question(self,cr, uid, ids, context=None):
|
def action_edit_question(self,cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Edit survey.question.
|
Edit survey.question.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open Edit survey.question form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1163,13 +1098,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_delete_question(self,cr, uid, ids, context=None):
|
def action_delete_question(self,cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Delete survey.question.
|
Delete survey.question.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open same survey.page form, but delete the selected survey.question in current survey.page.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1197,13 +1125,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_forward_previous(self, cr, uid, ids, context=None):
|
def action_forward_previous(self, cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Goes to previous Survey Answer.
|
Goes to previous Survey Answer.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open Previous Answer form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1229,13 +1150,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_forward_next(self, cr, uid, ids, context=None):
|
def action_forward_next(self, cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Goes to Next Survey Answer.
|
Goes to Next Survey Answer.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open Next Answer form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1261,13 +1175,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_next(self, cr, uid, ids, context=None):
|
def action_next(self, cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Goes to Next page.
|
Goes to Next page.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open Next survey.page form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
@ -1288,13 +1195,6 @@ class survey_question_wiz(osv.osv_memory):
|
||||||
def action_previous(self, cr, uid, ids, context=None):
|
def action_previous(self, cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Goes to previous page.
|
Goes to previous page.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.question.wiz IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for Open Previous survey.page form.
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
|
|
@ -24,26 +24,9 @@ from osv import fields
|
||||||
|
|
||||||
class survey_browse_answer(osv.osv_memory):
|
class survey_browse_answer(osv.osv_memory):
|
||||||
_name = 'survey.browse.answer'
|
_name = 'survey.browse.answer'
|
||||||
|
|
||||||
def _get_survey(self, cr, uid, context=None):
|
|
||||||
"""
|
|
||||||
Set the value in survey_id field,
|
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param context: A standard dictionary for contextual values,
|
|
||||||
@return : Tuple in list with values.
|
|
||||||
"""
|
|
||||||
surv_obj = self.pool.get("survey")
|
|
||||||
surv_resp_obj = self.pool.get("survey.response")
|
|
||||||
result = []
|
|
||||||
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
|
|
||||||
if surv_resp_obj.search(cr, uid, [('survey_id', '=', sur.id)]):
|
|
||||||
result.append((sur.id, sur.title))
|
|
||||||
return result
|
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'survey_id': fields.selection(_get_survey, "Survey", required="1"),
|
'survey_id': fields.many2one('survey', "Survey", required="1"),
|
||||||
'response_id': fields.many2one("survey.response", "Survey Answers", help="If this field is empty, all answers of the selected survey will be print."),
|
'response_id': fields.many2one("survey.response", "Survey Answers", help="If this field is empty, all answers of the selected survey will be print."),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,13 +34,6 @@ class survey_browse_answer(osv.osv_memory):
|
||||||
"""
|
"""
|
||||||
Open Browse Response wizard. if you select only survey_id then this wizard open with all response_ids and
|
Open Browse Response wizard. if you select only survey_id then this wizard open with all response_ids and
|
||||||
if you select survey_id and response_id then open the particular response of the survey.
|
if you select survey_id and response_id then open the particular response of the survey.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of survey.browse.answer IDs,
|
|
||||||
@param context: A standard dictionary for contextual values,
|
|
||||||
@return : Dictionary value for Open the browse answer wizard.
|
|
||||||
"""
|
"""
|
||||||
if context is None: context = {}
|
if context is None: context = {}
|
||||||
record = self.read(cr, uid, ids, [])
|
record = self.read(cr, uid, ids, [])
|
||||||
|
@ -66,8 +42,8 @@ class survey_browse_answer(osv.osv_memory):
|
||||||
res_id = [(record.get('response_id') and record['response_id'][0])]
|
res_id = [(record.get('response_id') and record['response_id'][0])]
|
||||||
else:
|
else:
|
||||||
sur_response_obj = self.pool.get('survey.response')
|
sur_response_obj = self.pool.get('survey.response')
|
||||||
res_id = sur_response_obj.search(cr, uid, [('survey_id', '=',int(record['survey_id']))])
|
res_id = sur_response_obj.search(cr, uid, [('survey_id', '=', record['survey_id'][0])])
|
||||||
context.update({'active' : True,'survey_id' : record['survey_id'], 'response_id' : res_id, 'response_no' : 0})
|
context.update({'active' : True,'survey_id' : record['survey_id'][0], 'response_id' : res_id, 'response_no' : 0})
|
||||||
search_obj = self.pool.get('ir.ui.view')
|
search_obj = self.pool.get('ir.ui.view')
|
||||||
search_id = search_obj.search(cr,uid,[('model','=','survey.question.wiz'),('name','=','Survey Search')])
|
search_id = search_obj.search(cr,uid,[('model','=','survey.question.wiz'),('name','=','Survey Search')])
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -27,8 +27,7 @@ from tools.translate import _
|
||||||
class survey_print(osv.osv_memory):
|
class survey_print(osv.osv_memory):
|
||||||
_name = 'survey.print'
|
_name = 'survey.print'
|
||||||
_columns = {
|
_columns = {
|
||||||
'survey_ids': fields.many2many('survey','survey_print',\
|
'survey_ids': fields.many2many('survey', string="Survey", required="1"),
|
||||||
'survey_id','print_id', "Survey", required="1"),
|
|
||||||
'orientation' : fields.selection([('vertical','Portrait(Vertical)'),\
|
'orientation' : fields.selection([('vertical','Portrait(Vertical)'),\
|
||||||
('horizontal','Landscape(Horizontal)')], 'Orientation'),
|
('horizontal','Landscape(Horizontal)')], 'Orientation'),
|
||||||
'paper_size' : fields.selection([('letter','Letter (8.5" x 11")'),\
|
'paper_size' : fields.selection([('letter','Letter (8.5" x 11")'),\
|
||||||
|
|
|
@ -26,20 +26,12 @@ from tools.translate import _
|
||||||
class survey_print_statistics(osv.osv_memory):
|
class survey_print_statistics(osv.osv_memory):
|
||||||
_name = 'survey.print.statistics'
|
_name = 'survey.print.statistics'
|
||||||
_columns = {
|
_columns = {
|
||||||
'survey_ids': fields.many2many('survey','survey_print_statistics','survey_id',\
|
'survey_ids': fields.many2many('survey', string="Survey", required="1"),
|
||||||
'print_id', "Survey", required="1"),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def action_next(self, cr, uid, ids, context=None):
|
def action_next(self, cr, uid, ids, context=None):
|
||||||
"""
|
"""
|
||||||
Print Survey Statistics in pdf format.
|
Print Survey Statistics in pdf format.
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of Survey statistics IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return: Dictionary value for created survey statistics report
|
|
||||||
"""
|
"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
|
|
@ -26,71 +26,8 @@ from tools.translate import _
|
||||||
class survey_name_wiz(osv.osv_memory):
|
class survey_name_wiz(osv.osv_memory):
|
||||||
_name = 'survey.name.wiz'
|
_name = 'survey.name.wiz'
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
|
||||||
"""
|
|
||||||
Set the default value in survey_id field. if open this wizard in survey form then set the default value in survey_id = active survey id.
|
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param fields: List of Survey statistics IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for created survey statistics report
|
|
||||||
"""
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
data = super(survey_name_wiz, self).default_get(cr, uid, fields, context)
|
|
||||||
if context.has_key('survey_id'):
|
|
||||||
data['survey_id'] = context.get('survey_id',False)
|
|
||||||
return data
|
|
||||||
|
|
||||||
def _get_survey(self, cr, uid, context=None):
|
|
||||||
"""
|
|
||||||
Set the value In survey_id field.
|
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of Survey statistics IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return: Dictionary value for created survey statistics report
|
|
||||||
"""
|
|
||||||
surv_obj = self.pool.get("survey")
|
|
||||||
result = []
|
|
||||||
if context.has_key('survey_id'):
|
|
||||||
for sur in surv_obj.browse(cr, uid, [context.get('survey_id',False)]):
|
|
||||||
result.append((sur.id, sur.title))
|
|
||||||
return result
|
|
||||||
survey_user_group_id = self.pool.get('res.groups').search(cr, uid, [('name', '=', 'Survey / User')])
|
|
||||||
group_id = self.pool.get('res.groups').search(cr, uid, [('name', 'in', ('Tools / Manager','Tools / User','Survey / User'))])
|
|
||||||
user_obj = self.pool.get('res.users')
|
|
||||||
user_rec = user_obj.read(cr, uid, uid, [])
|
|
||||||
if survey_user_group_id:
|
|
||||||
if survey_user_group_id == user_rec['groups_id']:
|
|
||||||
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
|
|
||||||
if sur.state == 'open':
|
|
||||||
u_list = []
|
|
||||||
for use in sur.invited_user_ids:
|
|
||||||
u_list.append(use.id)
|
|
||||||
if uid in u_list:
|
|
||||||
result.append((sur.id, sur.title))
|
|
||||||
return result
|
|
||||||
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
|
|
||||||
if sur.state == 'open':
|
|
||||||
res = False
|
|
||||||
for i in group_id:
|
|
||||||
if i in user_rec['groups_id']:
|
|
||||||
res = True
|
|
||||||
break
|
|
||||||
elif sur.id in user_rec['survey_id']:
|
|
||||||
res = True
|
|
||||||
break
|
|
||||||
if res:
|
|
||||||
result.append((sur.id, sur.title))
|
|
||||||
return result
|
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'survey_id': fields.selection(_get_survey, "Survey", required="1"),
|
'survey_id': fields.many2one('survey', 'Survey', required=True, ondelete='cascade'),
|
||||||
'page_no': fields.integer('Page Number'),
|
'page_no': fields.integer('Page Number'),
|
||||||
'note': fields.text("Description"),
|
'note': fields.text("Description"),
|
||||||
'page': fields.char('Page Position',size = 12),
|
'page': fields.char('Page Position',size = 12),
|
||||||
|
@ -99,10 +36,11 @@ class survey_name_wiz(osv.osv_memory):
|
||||||
'response': fields.char('Answer',size=16)
|
'response': fields.char('Answer',size=16)
|
||||||
}
|
}
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'page_no': lambda * a: - 1,
|
'page_no': -1,
|
||||||
'page': lambda * a: 'next',
|
'page': 'next',
|
||||||
'transfer': lambda * a: 1,
|
'transfer': 1,
|
||||||
'response': lambda * a: 0,
|
'response': 0,
|
||||||
|
'survey_id': lambda self,cr,uid,context:context.get('survey_id',False),
|
||||||
}
|
}
|
||||||
|
|
||||||
def action_next(self, cr, uid, ids, context=None):
|
def action_next(self, cr, uid, ids, context=None):
|
||||||
|
@ -110,30 +48,22 @@ class survey_name_wiz(osv.osv_memory):
|
||||||
Start the survey, Increment in started survey field but if set the max_response_limit of
|
Start the survey, Increment in started survey field but if set the max_response_limit of
|
||||||
survey then check the current user how many times start this survey. if current user max_response_limit
|
survey then check the current user how many times start this survey. if current user max_response_limit
|
||||||
is reach then this user can not start this survey(Raise Exception).
|
is reach then this user can not start this survey(Raise Exception).
|
||||||
|
|
||||||
@param self: The object pointer
|
|
||||||
@param cr: the current row, from the database cursor,
|
|
||||||
@param uid: the current user’s ID for security checks,
|
|
||||||
@param ids: List of Survey IDs
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary value for open survey question wizard.
|
|
||||||
"""
|
"""
|
||||||
survey_obj = self.pool.get('survey')
|
survey_obj = self.pool.get('survey')
|
||||||
search_obj = self.pool.get('ir.ui.view')
|
search_obj = self.pool.get('ir.ui.view')
|
||||||
if context is None: context = {}
|
if context is None: context = {}
|
||||||
|
|
||||||
this = self.browse(cr, uid, ids, context=context)[0]
|
this = self.browse(cr, uid, ids, context=context)[0]
|
||||||
survey_id = this.survey_id
|
survey_id = this.survey_id.id
|
||||||
context.update({'survey_id': survey_id, 'sur_name_id': this.id})
|
context.update({'survey_id': survey_id, 'sur_name_id': this.id})
|
||||||
cr.execute('select count(id) from survey_history where user_id=%s\
|
cr.execute('select count(id) from survey_history where user_id=%s\
|
||||||
and survey_id=%s' % (uid,survey_id))
|
and survey_id=%s' % (uid,survey_id))
|
||||||
|
|
||||||
res = cr.fetchone()[0]
|
res = cr.fetchone()[0]
|
||||||
user_limit = survey_obj.read(cr, uid, survey_id, ['response_user'])['response_user']
|
sur_rec = survey_obj.browse(cr,uid,survey_id,context=context)
|
||||||
if user_limit and res >= user_limit:
|
if sur_rec.response_user and res >= sur_rec.response_user:
|
||||||
raise osv.except_osv(_('Warning !'),_("You can not give response for this survey more than %s times") % (user_limit))
|
raise osv.except_osv(_('Warning !'),_("You can not give response for this survey more than %s times") % (user_limit))
|
||||||
|
|
||||||
sur_rec = survey_obj.browse(cr,uid,ids,context=context)[0]
|
|
||||||
if sur_rec.max_response_limit and sur_rec.max_response_limit <= sur_rec.tot_start_survey:
|
if sur_rec.max_response_limit and sur_rec.max_response_limit <= sur_rec.tot_start_survey:
|
||||||
raise osv.except_osv(_('Warning !'),_("You can not give more response. Please contact the author of this survey for further assistance."))
|
raise osv.except_osv(_('Warning !'),_("You can not give more response. Please contact the author of this survey for further assistance."))
|
||||||
|
|
||||||
|
@ -152,16 +82,10 @@ class survey_name_wiz(osv.osv_memory):
|
||||||
def on_change_survey(self, cr, uid, ids, survey_id, context=None):
|
def on_change_survey(self, cr, uid, ids, survey_id, context=None):
|
||||||
"""
|
"""
|
||||||
on change event of survey_id field, if note is available in selected survey then display this note in note fields.
|
on change event of survey_id field, if note is available in selected survey then display this note in note fields.
|
||||||
@param ids: List of Survey IDs
|
|
||||||
@param survey_id: Id of Survey
|
|
||||||
@param context: A standard dictionary for contextual values
|
|
||||||
@return : Dictionary values of notes fields.
|
|
||||||
"""
|
"""
|
||||||
if not survey_id:
|
if not survey_id:
|
||||||
return {}
|
return {}
|
||||||
notes = self.pool.get('survey').read(cr, uid, survey_id, ['note'])['note']
|
notes = self.pool.get('survey').read(cr, uid, survey_id, ['note'])['note']
|
||||||
return {'value': {'note': notes}}
|
return {'value': {'note': notes}}
|
||||||
|
|
||||||
survey_name_wiz()
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
|
@ -15,7 +15,8 @@
|
||||||
<separator colspan="4" string="Select Survey" />
|
<separator colspan="4" string="Select Survey" />
|
||||||
<newline />
|
<newline />
|
||||||
<field name="survey_id" colspan="4"
|
<field name="survey_id" colspan="4"
|
||||||
on_change="on_change_survey(survey_id)" width="250"/>
|
on_change="on_change_survey(survey_id)" width="250"
|
||||||
|
domain="[('state','=','open')]"/>
|
||||||
<group col="1" colspan="4"
|
<group col="1" colspan="4"
|
||||||
attrs="{'readonly': [('survey_id','=',False)]}">
|
attrs="{'readonly': [('survey_id','=',False)]}">
|
||||||
<separator colspan="4" string="Survey Details" />
|
<separator colspan="4" string="Survey Details" />
|
||||||
|
|
|
@ -41,7 +41,7 @@ class thunderbird_installer(osv.osv_memory):
|
||||||
'pdf_name':fields.char('File name', size=64),
|
'pdf_name':fields.char('File name', size=64),
|
||||||
'thunderbird':fields.boolean('Thunderbird Plug-in', help="Allows you to select an object that you would like to add to your email and its attachments."),
|
'thunderbird':fields.boolean('Thunderbird Plug-in', help="Allows you to select an object that you would like to add to your email and its attachments."),
|
||||||
'plugin_file':fields.binary('Thunderbird Plug-in', readonly=True, help="Thunderbird plug-in file. Save as this file and install this plug-in in thunderbird."),
|
'plugin_file':fields.binary('Thunderbird Plug-in', readonly=True, help="Thunderbird plug-in file. Save as this file and install this plug-in in thunderbird."),
|
||||||
'pdf_file':fields.char('Installation Manual', size="264", help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True),
|
'pdf_file':fields.char('Installation Manual', size=264, help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True),
|
||||||
'description':fields.text('Description', readonly=True)
|
'description':fields.text('Description', readonly=True)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue