bzr revid: nel@silver-20080909141933-0ulernirfc3vemya
This commit is contained in:
Najlaa 2008-09-09 16:19:33 +02:00
commit d3f2859eaa
70 changed files with 758 additions and 2178 deletions

View File

@ -1563,65 +1563,64 @@ class account_config_fiscalyear(osv.osv_memory):
account_config_fiscalyear()
class account_config_journal_bank_accounts(osv.osv_memory):
_name='account.config.journal.bank.account'
_columns = {
'name':fields.char('Journal Name', size=64),
'lines_id': fields.one2many('account.config.journal.bank.account.line', 'journal_id', 'Journal Lines'),
}
def action_cancel(self,cr,uid,ids,conect=None):
return {
'view_type': 'form',
"view_mode": 'form',
'res_model': 'ir.module.module.configuration.wizard',
'type': 'ir.actions.act_window',
'target':'new',
}
def action_create(self, cr, uid, ids, context=None):
config_res=self.read(cr,uid,ids)[0]
res_obj = self.pool.get('account.journal')
line_obj=self.pool.get('account.config.journal.bank.account.line')
if 'lines_id' in config_res and config_res['lines_id']:
lines=line_obj.read(cr,uid,config_res['lines_id'])
for res in lines:
sequence_ids=self.pool.get('ir.sequence').search(cr,uid,[('name','=','Account Journal')])
if 'name' in res and 'bank_account_id' in res and 'view_id' in res and sequence_ids and len(sequence_ids):
vals={
'name':res['name'],
'type':'cash',
'view_id':res['view_id'],
'default_credit_account_id':res['bank_account_id'],
'default_debit_account_id':res['bank_account_id'],
'sequence_id':sequence_ids[0]
}
res_obj.create(cr, uid, vals, context=context)
return {
'view_type': 'form',
"view_mode": 'form',
'res_model': 'ir.module.module.configuration.wizard',
'type': 'ir.actions.act_window',
'target':'new',
}
account_config_journal_bank_accounts()
class account_config_journal_bank_accounts_line(osv.osv_memory):
_name='account.config.journal.bank.account.line'
def _journal_view_get(self, cr, uid, context={}):
journal_obj = self.pool.get('account.journal.view')
ids = journal_obj.search(cr, uid, [])
res = journal_obj.read(cr, uid, ids, ['id', 'name'], context)
return [(r['id'], r['name']) for r in res]
_columns = {
'name':fields.char('Journal Name', size=64,required=True),
'bank_account_id':fields.many2one('account.account', 'Bank Account', required=True, domain=[('type','=','cash')]),
'view_id':fields.selection(_journal_view_get, 'Journal View', required=True),
'journal_id':fields.many2one('account.config.journal.bank.account', 'Journal', required=True),
}
account_config_journal_bank_accounts_line()
#class account_config_journal_bank_accounts(osv.osv_memory):
# _name='account.config.journal.bank.account'
# _columns = {
# 'name':fields.char('Journal Name', size=64),
# 'lines_id': fields.one2many('account.config.journal.bank.account.line', 'journal_id', 'Journal Lines'),
# }
#
# def action_cancel(self,cr,uid,ids,conect=None):
# return {
# 'view_type': 'form',
# "view_mode": 'form',
# 'res_model': 'ir.module.module.configuration.wizard',
# 'type': 'ir.actions.act_window',
# 'target':'new',
# }
#
# def action_create(self, cr, uid, ids, context=None):
# config_res=self.read(cr,uid,ids)[0]
# res_obj = self.pool.get('account.journal')
# line_obj=self.pool.get('account.config.journal.bank.account.line')
# if 'lines_id' in config_res and config_res['lines_id']:
# lines=line_obj.read(cr,uid,config_res['lines_id'])
# for res in lines:
# sequence_ids=self.pool.get('ir.sequence').search(cr,uid,[('name','=','Account Journal')])
# if 'name' in res and 'bank_account_id' in res and 'view_id' in res and sequence_ids and len(sequence_ids):
# vals={
# 'name':res['name'],
# 'type':'cash',
# 'view_id':res['view_id'],
# 'default_credit_account_id':res['bank_account_id'],
# 'default_debit_account_id':res['bank_account_id'],
# 'sequence_id':sequence_ids[0]
# }
# res_obj.create(cr, uid, vals, context=context)
# return {
# 'view_type': 'form',
# "view_mode": 'form',
# 'res_model': 'ir.module.module.configuration.wizard',
# 'type': 'ir.actions.act_window',
# 'target':'new',
# }
#
#account_config_journal_bank_accounts()
#
#class account_config_journal_bank_accounts_line(osv.osv_memory):
# _name='account.config.journal.bank.account.line'
# def _journal_view_get(self, cr, uid, context={}):
# journal_obj = self.pool.get('account.journal.view')
# ids = journal_obj.search(cr, uid, [])
# res = journal_obj.read(cr, uid, ids, ['id', 'name'], context)
# return [(r['id'], r['name']) for r in res]
# _columns = {
# 'name':fields.char('Journal Name', size=64,required=True),
# 'bank_account_id':fields.many2one('account.account', 'Bank Account', required=True, domain=[('type','=','cash')]),
# 'view_id':fields.selection(_journal_view_get, 'Journal View', required=True),
# 'journal_id':fields.many2one('account.config.journal.bank.account', 'Journal', required=True),
# }
#account_config_journal_bank_accounts_line()
# ----------------------------------------------
# Account Templates : Account, Tax and charts.
@ -1867,6 +1866,9 @@ class wizard_multi_charts_accounts(osv.osv_memory):
obj_journal = self.pool.get('account.journal')
obj_acc_template = self.pool.get('account.account.template')
if obj_multi.code_digits<=5:
raise osv.except_osv(_('User Error'), _('Account code should be of more than 5 digits.'))
# Creating Account
obj_acc_root = obj_multi.chart_template_id.account_root_id
tax_code_root_id = obj_multi.chart_template_id.tax_code_root_id.id
@ -1889,7 +1891,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
'name': (tax_code_root_id == tax_code_template.id) and obj_multi.company_id.name or tax_code_template.name,
'code': tax_code_template.code,
'info': tax_code_template.info,
'parent_id': tax_code_template.parent_id and tax_code_template_ref[tax_code_template.parent_id.id] or False,
'parent_id': tax_code_template.parent_id and ((tax_code_template.parent_id.id in tax_code_template_ref) and tax_code_template_ref[tax_code_template.parent_id.id]) or False,
'company_id': company_id,
'sign': tax_code_template.sign,
}
@ -1907,7 +1909,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
'type':tax.type,
'applicable_type': tax.applicable_type,
'domain':tax.domain,
'parent_id': tax.parent_id and tax_template_ref[tax.parent_id.id] or False,
'parent_id': tax.parent_id and ((tax.parent_id.id in tax_template_ref) and tax_template_ref[tax.parent_id.id]) or False,
'child_depend': tax.child_depend,
'python_compute': tax.python_compute,
'python_compute_inv': tax.python_compute_inv,
@ -1933,7 +1935,6 @@ class wizard_multi_charts_accounts(osv.osv_memory):
}
tax_template_ref[tax.id] = new_tax
#deactivate the parent_store functionnality on account_account for rapidity purpose
self.pool._init = True
children_acc_template = obj_acc_template.search(cr, uid, [('parent_id','child_of',[obj_acc_root.id])])
@ -1942,17 +1943,22 @@ class wizard_multi_charts_accounts(osv.osv_memory):
for tax in account_template.tax_ids:
tax_ids.append(tax_template_ref[tax.id])
#create the account_account
dig=obj_multi.code_digits
code_main=len(account_template.code)
code_acc=account_template.code
if code_main<=dig:
code_acc=str(code_acc) + (str('0'*(dig-code_main)))
vals={
'name': (obj_acc_root.id == account_template.id) and obj_multi.company_id.name or account_template.name,
#'sign': account_template.sign,
'currency_id': account_template.currency_id and account_template.currency_id.id or False,
'code': account_template.code,
'code': code_acc[:dig],
'type': account_template.type,
'user_type': account_template.user_type or False,
'reconcile': account_template.reconcile,
'shortcut': account_template.shortcut,
'note': account_template.note,
'parent_id': account_template.parent_id and acc_template_ref[account_template.parent_id.id] or False,
'parent_id': account_template.parent_id and ((account_template.parent_id.id in acc_template_ref) and acc_template_ref[account_template.parent_id.id]) or False,
'tax_ids': [(6,0,tax_ids)],
'company_id': company_id,
}
@ -2015,7 +2021,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
#'sign': ref_acc_bank.sign,
'currency_id': line.currency_id and line.currency_id.id or False,
'code': ref_acc_bank.code+str(current_num),
'type': 'cash',
'type': 'other',
'user_type': account_template.user_type or False,
'reconcile': True,
'parent_id': acc_template_ref[ref_acc_bank.id] or False,

View File

@ -17,6 +17,17 @@
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_invoice_graph">
<field name="name">account.invoice.graph</field>
<field name="model">account.invoice</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Invoices" type="bar">
<field name="partner_id"/>
<field name="amount_total" operator="+"/>
</graph>
</field>
</record>
<record id="view_invoice_line_tree" model="ir.ui.view">
<field name="name">account.invoice.line.tree</field>
<field name="model">account.invoice.line</field>
@ -274,7 +285,7 @@
<field name="name">Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="view_id" ref="invoice_tree"/>
<field name="context">{'type':'out_invoice'}</field>
</record>
@ -295,7 +306,7 @@
<field name="name">Customer Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','out_invoice')]</field>
<field name="context">{'type':'out_invoice'}</field>
@ -305,7 +316,7 @@
<field name="name">New Customer Invoice</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree,calendar</field>
<field name="view_mode">form,tree,calendar,graph</field>
<field eval="invoice_form" name="view_id"/>
<field name="domain">[('type','=','out_invoice')]</field>
<field name="context">{'type':'out_invoice'}</field>
@ -316,7 +327,7 @@
<field name="name">Supplier Invoices</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','in_invoice')]</field>
<field name="context">{'type':'in_invoice'}</field>
@ -326,7 +337,7 @@
<field name="name">New Supplier Invoice</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree,calendar</field>
<field name="view_mode">form,tree,calendar,graph</field>
<field eval="invoice_supplier_form" name="view_id"/>
<field name="domain">[('type','=','in_invoice')]</field>
<field name="context">{'type':'in_invoice'}</field>
@ -337,7 +348,7 @@
<field name="name">Customer Refunds</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','out_refund')]</field>
<field name="context">{'type':'out_refund'}</field>
@ -348,7 +359,7 @@
<field name="name">New Customer Refund</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree,calendar</field>
<field name="view_mode">form,tree,calendar,graph</field>
<field eval="invoice_form" name="view_id"/>
<field name="domain">[('type','=','out_refund')]</field>
<field name="context">{'type':'out_refund'}</field>
@ -359,7 +370,7 @@
<field name="name">Supplier Refunds</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field eval="False" name="view_id"/>
<field name="domain">[('type','=','in_refund')]</field>
<field name="context">{'type':'in_refund'}</field>
@ -370,7 +381,7 @@
<field name="name">New Supplier Refund</field>
<field name="res_model">account.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree,calendar</field>
<field name="view_mode">form,tree,calendar,graph</field>
<field eval="invoice_supplier_form" name="view_id"/>
<field name="domain">[('type','=','in_refund')]</field>
<field name="context">{'type':'in_refund'}</field>

View File

@ -1415,9 +1415,7 @@
<field name="target">new</field>
</record>
<record id="view_config_journal_bank_account" model="ir.ui.view">
<!-- <record id="view_config_journal_bank_account" model="ir.ui.view">
<field name="name">Configure Journal of Bank account</field>
<field name="model">account.config.journal.bank.account</field>
<field name="type">form</field>
@ -1452,7 +1450,7 @@
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</record>-->
<!-- register configuration wizard -->
@ -1463,12 +1461,12 @@
<field name="state">open</field>
</record>
<record id="config_journal_bank_account" model="ir.module.module.configuration.step">
<!--<record id="config_journal_bank_account" model="ir.module.module.configuration.step">
<field name="name">Define journal for bank accounts</field>
<field name="note">Define journal for bank accounts</field>
<field name="action_id" ref="action_config_journal_bank_account"/>
<field name="state">open</field>
</record>
</record>-->
<!-- Account Templates -->

View File

@ -22,7 +22,23 @@
<menuitem id="next_id_20" name="Reconciliation" parent="menu_finance_periodical_processing"/><menuitem action="wizard_automatic_reconcile" id="menu_automatic_reconcile" parent="next_id_20" type="wizard"/>
<!-- Import entry in statement -->
<wizard string="Import invoices" model="account.bank.statement" name="populate_payment_from_inv" menu="False" id="wizard_populate_payment_from_inv"/>
<record id="wizard_populate_payment_from_inv" model="ir.actions.act_window">
<field name="name">Entries by Statements</field>
<field name="res_model">account.move.line</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="target">new</field>
</record>
<!--
<wizard
string="Import invoices"
model="account.bank.statement"
name="populate_payment_from_inv"
menu="False"
id="wizard_populate_payment_from_inv"/>
-->
<!-- manual reconcile -->

View File

@ -13,54 +13,54 @@
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<notebook>
<page string="Accounting" position="inside">
<group col="2" colspan="2">
<separator string="Customer Accounting Properties" colspan="2"/>
<field name="property_account_receivable"/>
<field name="property_account_tax"/>
<field name="property_payment_term"/>
</group>
<group col="2" colspan="2">
<separator string="Supplier Accounting Properties" colspan="2"/>
<field name="property_account_payable"/>
<field name="property_account_supplier_tax"/>
</group>
<group col="2" colspan="2">
<separator string="Customer Credit" colspan="2"/>
<field name="credit" select="2"/>
<field name="credit_limit" select="2"/>
</group>
<group col="2" colspan="2">
<separator string="Supplier Debit" colspan="2"/>
<field name="debit" select="2"/>
</group>
<field colspan="4" context="address=address" name="bank_ids" nolabel="1">
<form string="Bank account">
<field name="state" select="2"/>
<newline/>
<field name="acc_number" select="1"/>
<newline/>
<field name="bank"/>
<newline/>
<field name="sequence"/>
<field colspan="4" name="name" select="2"/>
<separator colspan="4" string="Bank account owner"/>
<field colspan="4" name="owner_name"/>
<field colspan="4" name="street"/>
<newline/>
<field name="zip"/>
<field name="city"/>
<newline/>
<field completion="1" name="country_id"/>
<field name="state_id"/>
</form>
<tree string="Bank Details">
<field name="state"/>
<field name="owner_name"/>
<field name="acc_number"/>
</tree>
</field>
</page>
<page string="Accounting" position="inside">
<group col="2" colspan="2">
<separator string="Customer Accounting Properties" colspan="2"/>
<field name="property_account_receivable"/>
<field name="property_account_tax"/>
<field name="property_payment_term"/>
</group>
<group col="2" colspan="2">
<separator string="Supplier Accounting Properties" colspan="2"/>
<field name="property_account_payable"/>
<field name="property_account_supplier_tax"/>
</group>
<group col="2" colspan="2">
<separator string="Customer Credit" colspan="2"/>
<field name="credit" select="2"/>
<field name="credit_limit" select="2"/>
</group>
<group col="2" colspan="2">
<separator string="Supplier Debit" colspan="2"/>
<field name="debit" select="2"/>
</group>
<field colspan="4" context="address=address" name="bank_ids" nolabel="1">
<form string="Bank account">
<field name="state" select="2"/>
<newline/>
<field name="acc_number" select="1"/>
<newline/>
<field name="bank"/>
<newline/>
<field name="sequence"/>
<field colspan="4" name="name" select="2"/>
<separator colspan="4" string="Bank account owner"/>
<field colspan="4" name="owner_name"/>
<field colspan="4" name="street"/>
<newline/>
<field name="zip"/>
<field name="city"/>
<newline/>
<field completion="1" name="country_id"/>
<field name="state_id"/>
</form>
<tree string="Bank Details">
<field name="state"/>
<field name="owner_name"/>
<field name="acc_number"/>
</tree>
</field>
</page>
</notebook>
</field>
</record>

View File

@ -20,8 +20,6 @@ access_account_model_line,account.model.line,model_account_model_line,account.gr
access_account_subscription,account.subscription,model_account_subscription,account.group_account_user,1,1,1,1
access_account_subscription_line,account.subscription.line,model_account_subscription_line,account.group_account_user,1,1,1,1
access_account_config_fiscalyear,account.config.fiscalyear,model_account_config_fiscalyear,account.group_account_manager,1,1,1,1
access_account_config_journal_bank_account,account.config.journal.bank.account,model_account_config_journal_bank_account,account.group_account_manager,1,1,1,1
access_account_config_journal_bank_account_line,account.config.journal.bank.account.line,model_account_config_journal_bank_account_line,account.group_account_manager,1,1,1,1
access_account_tax_template,account.tax.template,model_account_tax_template,account.group_account_manager,1,1,1,1
access_account_account_template,account.account.template,model_account_account_template,account.group_account_manager,1,1,1,1
access_account_tax_code_template,account.tax.code.template,model_account_tax_code_template,account.group_account_manager,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
20 access_account_subscription account.subscription model_account_subscription account.group_account_user 1 1 1 1
21 access_account_subscription_line account.subscription.line model_account_subscription_line account.group_account_user 1 1 1 1
22 access_account_config_fiscalyear account.config.fiscalyear model_account_config_fiscalyear account.group_account_manager 1 1 1 1
access_account_config_journal_bank_account account.config.journal.bank.account model_account_config_journal_bank_account account.group_account_manager 1 1 1 1
access_account_config_journal_bank_account_line account.config.journal.bank.account.line model_account_config_journal_bank_account_line account.group_account_manager 1 1 1 1
23 access_account_tax_template account.tax.template model_account_tax_template account.group_account_manager 1 1 1 1
24 access_account_account_template account.account.template model_account_account_template account.group_account_manager 1 1 1 1
25 access_account_tax_code_template account.tax.code.template model_account_tax_code_template account.group_account_manager 1 1 1 1

View File

@ -209,7 +209,7 @@ def fnct_call(fnct):
pool = pooler.get_pool(args[0])
mod = pool.get('ir.module.record')
if mod and mod.recording:
if args[4] not in ('default_get','read','fields_view_get','fields_get','search','name_search','name_get','get','request_get', 'get_sc'):
if args[4] not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc'):
mod.recording_data.append(('query', args, argv,res))
return res
return execute

View File

@ -74,7 +74,7 @@ intro_save_form = '''<?xml version="1.0"?>
<separator string="Module successfully created !" colspan="4"/>
<field name="module_filename"/>
<newline/>
<field name="module_file"/>
<field name="module_file" filename="module_filename"/>
<separator string="Information" colspan="4"/>
<label string="If you think your module could interrest others people, we'd like you to publish it on TinyERP.com, in the 'Modules' section. You can do it through the website or using features of the 'base_module_publish' module." colspan="4" align="0.0"/>
<label string="Thanks in advance for your contribution." colspan="4" align="0.0"/>
@ -146,7 +146,6 @@ def _create_module(self, cr, uid, data, context):
info.external_attr = 2175008768
zip.writestr(info, datastr)
zip.close()
print data['form']
return {
'module_file': base64.encodestring(s.getvalue()),
'module_filename': data['form']['directory_name']+'-'+data['form']['version']+'.zip'

View File

@ -4,7 +4,7 @@
<!-- Create a transporter -->
<record id="delivery_partner" model="res.partner">
<field name="name">Default Transporter</field>
<field name="name">The Poste</field>
<field name="website">http://tinyerp.com</field>
</record>
<record id="delivery_partner_address" model="res.partner.address">
@ -16,7 +16,7 @@
<!-- Create a partner -->
<record id="delivery_product" model="product.product">
<field name="name">Default Delivery</field>
<field name="name">Delivery by Poste</field>
<field name="type">service</field>
<field model="product.category" name="categ_id" search="[]"/>
</record>
@ -24,7 +24,7 @@
<!-- Carrier -->
<record id="delivery_carrier" model="delivery.carrier">
<field name="name">Default Delivery</field>
<field name="name">The Poste - Express</field>
<field name="partner_id" ref="delivery_partner"/>
<field name="product_id" ref="delivery_product"/>
</record>
@ -32,7 +32,7 @@
<!-- Carrier Grids -->
<record id="delivery_grid" model="delivery.grid">
<field name="name">Default Delivery Grid</field>
<field name="name">The Poste Express - Pricelist</field>
<field name="carrier_id" ref="delivery_carrier"/>
</record>
<record id="delivery_grid_line3" model="delivery.grid.line">
@ -61,4 +61,4 @@
</record>
</data>
</terp>
</terp>

View File

@ -2,7 +2,7 @@
<terp>
<data>
<wizard id="wizard_deliver_line_add" keyword="client_action_multi" model="sale.order" name="delivery.sale.order" string="Add delivery line"/>
<wizard id="wizard_deliver_line_add" keyword="client_action_multi" model="sale.order" name="delivery.sale.order" string="Delivery Costs"/>
</data>
</terp>
</terp>

View File

@ -31,6 +31,5 @@
import mrp
import wizard
import report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
import company
import schedulers

View File

@ -69,6 +69,7 @@
"mrp_view.xml",
"mrp_wizard.xml",
"mrp_report.xml",
"company_view.xml"
],
"active": False,
"installable": True

View File

@ -1,8 +1,8 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
# Fabien Pinckaers <fp@tiny.Be>
# Copyright (c) 2005-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id:
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
@ -27,29 +27,29 @@
#
##############################################################################
from osv import fields,osv
import tools
import ir
import pooler
from osv import osv,fields
class stock_picking(osv.osv):
_name = "stock.picking"
_inherit ='stock.picking'
class company(osv.osv):
_inherit = 'res.company'
_columns = {
'back_order_id' : fields.many2one('stock.picking', 'Back Order', readonly=True),
'backorder':fields.boolean('Backorder',readonly=True),
'schedule_range': fields.float('Scheduler Range', required=True,
help="This is the time frame analysed by the scheduler when "\
"computing procurements. All procurement that are not between "\
"today and today+range are skipped for futur computation."),
'po_lead': fields.float('Purchase Lead Time', required=True,
help="This is the leads/security time for each purchase order."),
'security_lead': fields.float('Security Days', required=True,
help="This is the days added to what you promise to customers "\
"for security purpose"),
'manufacturing_lead': fields.float('Manufacturity Lead Time', required=True,
help="Security days for each manufacturing operation."),
}
_defaults = {
'type':lambda *a: 'internal',
'backorder':lambda *a: False,
}
'schedule_range': lambda *a: 80.0,
'po_lead': lambda *a: 1.0,
'security_lead': lambda *a: 5.0,
'manufacturing_lead': lambda *a: 1.0,
}
company()
stock_picking()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,23 @@
<?xml version="1.0" ?>
<terp>
<data>
<record id="mrp_company" model="ir.ui.view">
<field name="name">res.company.mrp.config</field>
<field name="model">res.company</field>
<field name="type">form</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<page string="Configuration" position="inside">
<separator string="MRP &amp; Logistic Scheduler" colspan="4"/>
<field name="schedule_range"/>
<field name="po_lead"/>
<field name="security_lead"/>
<field name="manufacturing_lead"/>
<newline/>
</page>
</field>
</record>
</data>
</terp>

View File

@ -868,10 +868,12 @@ class mrp_procurement(osv.osv):
def action_produce_assign_product(self, cr, uid, ids, context={}):
produce_id = False
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
for procurement in self.browse(cr, uid, ids):
res_id = procurement.move_id.id
loc_id = procurement.location_id.id
newdate = DateTime.strptime(procurement.date_planned, '%Y-%m-%d') - DateTime.RelativeDateTime(days=procurement.product_id.product_tmpl_id.produce_delay or 0.0)
newdate = newdate - DateTime.RelativeDateTime(days=company.manufacturing_lead)
produce_id = self.pool.get('mrp.production').create(cr, uid, {
'origin': procurement.origin,
'product_id': procurement.product_id.id,
@ -892,8 +894,9 @@ class mrp_procurement(osv.osv):
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
return produce_id
def action_po_assign(self, cr, uid, ids):
def action_po_assign(self, cr, uid, ids, context={}):
purchase_id = False
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
for procurement in self.browse(cr, uid, ids):
res_id = procurement.move_id.id
partner = procurement.product_id.seller_ids[0].name
@ -910,6 +913,7 @@ class mrp_procurement(osv.osv):
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist_id], procurement.product_id.id, qty, False, {'uom': uom_id})[pricelist_id]
newdate = DateTime.strptime(procurement.date_planned, '%Y-%m-%d') - DateTime.RelativeDateTime(days=procurement.product_id.product_tmpl_id.seller_delay or 0.0)
newdate = newdate - DateTime.RelativeDateTime(days=company.po_lead)
line = {
'name': procurement.product_id.name,
'product_qty': qty,
@ -969,45 +973,15 @@ class mrp_procurement(osv.osv):
for id in ids:
wf_service.trg_trigger(uid, 'mrp.procurement', id, cr)
return res
def run_scheduler(self, cr, uid, user_id=False, schedule_cycle=1.0,\
po_cycle=1.0, po_lead=1.0, security_lead=50.0, picking_lead=1.0,\
automatic=False, use_new_cursor=False, context=None):
def run_scheduler(self, cr, uid, automatic=False, use_new_cursor=False, context=None):
'''
use_new_cursor: False or the dbname
'''
if not context:
context={}
self.run_procure_confirm(cr, uid, schedule_cycle=schedule_cycle,\
po_cycle=po_cycle, po_lead=po_lead, security_lead=security_lead,\
picking_lead=picking_lead, user_id=user_id,\
self._procure_confirm(cr, uid, use_new_cursor=use_new_cursor, context=context)
self._procure_orderpoint_confirm(cr, uid, automatic=automatic,\
use_new_cursor=use_new_cursor, context=context)
self.run_orderpoint_confirm(cr, uid, automatic=automatic,\
use_new_cursor=use_new_cursor, context=context, user_id=user_id)
def run_procure_confirm(self, cr, uid, user_id=False, schedule_cycle=1.0,\
po_cycle=1.0, po_lead=1.0, security_lead=50.0, picking_lead=1.0, \
use_new_cursor=False, context=None):
'''
use_new_cursor: False or the dbname
'''
from wizard.schedulers import _procure_confirm
if not context:
context={}
_procure_confirm(self, cr, uid, schedule_cycle=schedule_cycle,\
po_cycle=po_cycle, po_lead=po_lead, security_lead=security_lead,\
picking_lead=picking_lead, user_id=user_id, use_new_cursor=use_new_cursor,\
context=context)
def run_orderpoint_confirm(self, cr, uid, automatic=False, use_new_cursor=False,\
context=None, user_id=False):
'''
use_new_cursor: False or the dbname
'''
from wizard.schedulers import _procure_orderpoint_confirm
if not context:
context={}
_procure_orderpoint_confirm(self, cr, uid, automatic=automatic,\
use_new_cursor=use_new_cursor, context=context, user_id=user_id)
mrp_procurement()

View File

@ -382,6 +382,18 @@
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_production_graph">
<field name="name">mrp.production.graph</field>
<field name="model">mrp.production</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Production orders" type="bar">
<field name="product_id"/>
<field name="product_qty" operator="+"/>
</graph>
</field>
</record>
<record id="mrp_production_form_view" model="ir.ui.view">
@ -446,7 +458,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="view_id" eval="False"/>
</record>
<menuitem action="mrp_production_action" id="menu_mrp_production_action" parent="menu_mrp_root"/>
@ -456,7 +468,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','ready')]</field>
</record>
<menuitem action="mrp_production_action2" id="menu_production_orders_start" parent="menu_mrp_production_action"/>
@ -465,7 +477,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','in_production')]</field>
</record>
<menuitem action="mrp_production_action3" id="menu_mrp_production_action3" parent="menu_mrp_production_action"/>
@ -474,7 +486,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','confirmed')]</field>
</record>
<menuitem action="mrp_production_action4" id="menu_production_orders_waiting4" parent="mrp.menu_mrp_production_action"/>
@ -484,7 +496,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree,calendar</field>
<field name="view_mode">form,tree,calendar,graph</field>
</record>
<menuitem action="mrp_production_new" id="menu_production_orders_new" parent="mrp.menu_mrp_production_action"/>

View File

@ -2,19 +2,19 @@
<terp>
<data>
<record id="wiz_mrp_proc0" model="ir.actions.wizard">
<field name="name">Compute all schedulers</field>
<field name="name">Compute All Schedulers</field>
<field name="wiz_name">mrp.procurement.compute.all</field>
</record>
<menuitem action="wiz_mrp_proc0" id="mrp_Sched_all" parent="mrp.menu_mrp_root" type="wizard"/>
<record id="wiz_mrp_proc1" model="ir.actions.wizard">
<field name="name">Compute procurement</field>
<field name="name">Compute Procurements Only</field>
<field name="wiz_name">mrp.procurement.compute</field>
</record>
<menuitem action="wiz_mrp_proc1" id="menu_wiz_mrp_proc1" parent="mrp.mrp_Sched_all" type="wizard"/>
<record id="wiz_mrp_proc2" model="ir.actions.wizard">
<field name="name">Compute stock minimum rules</field>
<field name="name">Compute Stock Minimum Rules Only</field>
<field name="wiz_name">mrp.procurement.orderpoint.compute</field>
</record>
<menuitem action="wiz_mrp_proc2" id="menu_wiz_mrp_proc2" parent="mrp.mrp_Sched_all" type="wizard"/>
@ -31,4 +31,4 @@
</record>
</data>
</terp>
</terp>

248
addons/mrp/schedulers.py Normal file
View File

@ -0,0 +1,248 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id$
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from osv import osv
import netsvc
import pooler
from mx import DateTime
import time
class mrp_procurement(osv.osv):
_inherit = 'mrp.procurement'
def _procure_confirm(self, cr, uid, ids=None, use_new_cursor=False, context=None):
'''
use_new_cursor: False or the dbname
'''
if not context:
context={}
if use_new_cursor:
cr = pooler.get_db(use_new_cursor).cursor()
wf_service = netsvc.LocalService("workflow")
procurement_obj = self.pool.get('mrp.procurement')
if not ids:
ids=procurement_obj.search(cr,uid,[], order="date_planned")
for id in ids:
wf_service.trg_validate(uid, 'mrp.procurement', id, 'button_restart', cr)
if use_new_cursor:
cr.commit()
company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id
maxdate = DateTime.now() + DateTime.RelativeDateTime(days=company.schedule_range)
start_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss')
offset = 0
report = []
report_total = 0
report_except = 0
report_later = 0
while True:
cr.execute('select id from mrp_procurement where state=%s and procure_method=%s order by date_planned limit 500 offset %d', ('confirmed','make_to_order',offset))
ids = map(lambda x:x[0], cr.fetchall())
for proc in procurement_obj.browse(cr, uid, ids):
if maxdate.strftime('%Y-%m-%d')>=proc.date_planned:
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
else:
offset+=1
report_later += 1
for proc in procurement_obj.browse(cr, uid, ids):
if proc.state == 'exception':
report.append('PROC %d: on order - %3.2f %-5s - %s' % \
(proc.id, proc.product_qty, proc.product_uom.name,
proc.product_id.name))
report_except += 1
report_total += 1
if use_new_cursor:
cr.commit()
if not ids:
break
offset = 0
ids = []
while True:
report_ids = []
ids = self.pool.get('mrp.procurement').search(cr, uid, [('state','=','confirmed'),('procure_method','=','make_to_stock')], offset=offset)
for proc in procurement_obj.browse(cr, uid, ids):
if (maxdate).strftime('%Y-%m-%d') >= proc.date_planned:
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
report_ids.append(proc.id)
else:
report_later +=1
report_total +=1
for proc in procurement_obj.browse(cr, uid, report_ids):
if proc.state == 'exception':
report.append('PROC %d: from stock - %3.2f %-5s - %s' % \
(proc.id, proc.product_qty, proc.product_uom.name,
proc.product_id.name,))
report_except +=1
if use_new_cursor:
cr.commit()
offset += len(ids)
if not ids: break
end_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss')
if uid:
request = self.pool.get('res.request')
summary = '''Here is the procurement scheduling report.
Computation Started; %s
Computation Finnished; %s
Total procurement: %d
Exception procurement: %d
Not run now procurement: %d
Exceptions;
'''% (start_date,end_date,report_total, report_except,report_later)
summary += '\n'.join(report)
request.create(cr, uid,
{'name' : "Procurement calculation report.",
'act_from' : uid,
'act_to' : uid,
'body': summary,
})
if use_new_cursor:
cr.commit()
cr.close()
return {}
def create_automatic_op(cr, uid, context=None):
if not context:
context={}
product_obj = self.pool.get('product.product')
proc_obj = self.pool.get('mrp.procurement')
warehouse_obj = self.pool.get('stock.warehouse')
wf_service = netsvc.LocalService("workflow")
cr.execute('select id from stock_warehouse')
warehouses = [x for x, in cr.fetchall()]
cr.execute('select id from product_product')
products_id = [x for x, in cr.fetchall()]
products = dict(zip(products_id, product_obj.browse(cr, uid, products_id, context)))
for warehouse in warehouses:
v_stock = product_obj._product_virtual_available(cr, uid, products_id, None, {'warehouse': warehouse})
cr.execute("select lot_stock_id from stock_warehouse")
location_ids_str = ','.join([str(id) for id, in cr.fetchall()])
stock_locations = warehouse_obj.read(cr, uid, [warehouse], ['lot_input_id', 'lot_stock_id'])[0]
for prod_id, available in v_stock.items():
if available >= 0:
continue
newdate = DateTime.now() + DateTime.RelativeDateTime(days=products[prod_id].seller_delay)
if products[prod_id].supply_method == 'buy':
location_id = stock_locations['lot_input_id'][0]
elif products[prod_id].supply_method == 'produce':
location_id = stock_locations['lot_stock_id'][0]
else:
continue
proc_id = proc_obj.create(cr, uid, {
'name': 'PROC:Automatic OP for product:%s' % products[prod_id].name,
'origin': 'SCHEDULER',
'date_planned': newdate.strftime('%Y-%m-%d'),
'product_id': prod_id,
'product_qty': -available,
'product_uom': products[prod_id].uom_id.id,
'location_id': location_id,
'procure_method': 'make_to_order',
})
wf_service.trg_validate(uid, 'mrp.procurement', proc_id, 'button_confirm', cr)
wf_service.trg_validate(uid, 'mrp.procurement', proc_id, 'button_check', cr)
def _procure_orderpoint_confirm(self, cr, uid, automatic=False,\
use_new_cursor=False, context=None, user_id=False):
'''
use_new_cursor: False or the dbname
'''
if not context:
context={}
if use_new_cursor:
cr = pooler.get_db(use_new_cursor).cursor()
orderpoint_obj = self.pool.get('stock.warehouse.orderpoint')
location_obj = self.pool.get('stock.location')
procurement_obj = self.pool.get('mrp.procurement')
request_obj = self.pool.get('res.request')
wf_service = netsvc.LocalService("workflow")
report = []
offset = 0
ids = [1]
if automatic:
create_automatic_op(cr, uid, context=context)
while ids:
ids=orderpoint_obj.search(cr,uid,[],offset=offset,limit=100)
for op in orderpoint_obj.browse(cr, uid, ids):
try:
prods = location_obj._product_virtual_get(cr, uid,
op.warehouse_id.lot_stock_id.id, [op.product_id.id],
{'uom': op.product_uom.id})[op.product_id.id]
if prods < op.product_min_qty:
qty = max(op.product_min_qty, op.product_max_qty)-prods
reste = qty % op.qty_multiple
if reste>0:
qty += op.qty_multiple-reste
newdate = DateTime.now() + DateTime.RelativeDateTime(
days=op.product_id.seller_delay)
if op.product_id.supply_method == 'buy':
location_id = op.warehouse_id.lot_input_id
elif op.product_id.supply_method == 'produce':
location_id = op.warehouse_id.lot_stock_id
else:
continue
proc_id = procurement_obj.create(cr, uid, {
'name': 'OP:'+str(op.id),
'date_planned': newdate.strftime('%Y-%m-%d'),
'product_id': op.product_id.id,
'product_qty': qty,
'product_uom': op.product_uom.id,
'location_id': op.warehouse_id.lot_input_id.id,
'procure_method': 'make_to_order',
'origin': op.name
})
wf_service.trg_validate(uid, 'mrp.procurement', proc_id,
'button_confirm', cr)
wf_service.trg_validate(uid, 'mrp.procurement', proc_id,
'button_check', cr)
orderpoint_obj.write(cr, uid, [op.id],
{'procurement_id': proc_id})
except Exception, e:
report.append('OP %d:\n%s\n' % (op.id, str(e)))
offset += len(ids)
if use_new_cursor:
cr.commit()
if user_id and report:
request_obj.create(cr, uid, {
'name': 'Orderpoint report.',
'act_from': user_id,
'act_to': user_id,
'body': '\n'.join(report)
})
if use_new_cursor:
cr.commit()
cr.close()
return {}
mrp_procurement()

View File

@ -1,264 +0,0 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id$
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import pooler
import time
from mx import DateTime
import netsvc
from osv import osv
def _procure_confirm(self, cr, uid, schedule_cycle=1.0, po_cycle=1.0,\
po_lead=1.0, security_lead=50.0, picking_lead=1.0, user_id=False,\
use_new_cursor=False, context=None):
'''
use_new_cursor: False or the dbname
'''
if not context:
context={}
if use_new_cursor:
cr = pooler.get_db(use_new_cursor).cursor()
wf_service = netsvc.LocalService("workflow")
procurement_obj = pooler.get_pool(cr.dbname).get('mrp.procurement')
ids=procurement_obj.search(cr,uid,[], order="date_planned")
for id in ids:
wf_service.trg_validate(uid, 'mrp.procurement', id, 'button_restart', cr)
if use_new_cursor:
cr.commit()
po_time = po_cycle + po_lead
maxdate = DateTime.now() + DateTime.RelativeDateTime(days=schedule_cycle + security_lead)
start_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss')
offset = 0
report = []
report_total = 0
report_except = 0
report_later = 0
ids = [1]
while len(ids):
cr.execute('select id from mrp_procurement where state=%s and procure_method=%s order by date_planned limit 500 offset %d', ('confirmed','make_to_order',offset))
ids = map(lambda x:x[0], cr.fetchall())
for proc in procurement_obj.browse(cr, uid, ids):
if proc.product_id.supply_method=='produce':
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
else:
if (maxdate + DateTime.RelativeDateTime(days=(proc.product_id.seller_delay or 0 + po_time))).strftime('%Y-%m-%d')>=proc.date_planned:
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
else:
offset+=1
report_later += 1
for proc in procurement_obj.browse(cr, uid, ids):
if proc.state == 'exception':
report.append('PROC %d: on order - %3.2f %-5s - %s' % \
(proc.id, proc.product_qty, proc.product_uom.name,
proc.product_id.name))
report_except += 1
report_total += 1
if use_new_cursor:
cr.commit()
offset = 0
ids = [1]
while len(ids):
report_ids = []
ids = pooler.get_pool(cr.dbname).get('mrp.procurement').search(cr, uid, [('state','=','confirmed'),('procure_method','=','make_to_stock')], offset=offset)
for proc in procurement_obj.browse(cr, uid, ids):
if (maxdate + DateTime.RelativeDateTime(days=picking_lead)).strftime('%Y-%m-%d') >= proc.date_planned:
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
report_ids.append(proc.id)
else:
report_later +=1
report_total +=1
for proc in procurement_obj.browse(cr, uid, report_ids):
if proc.state == 'exception':
report.append('PROC %d: from stock - %3.2f %-5s - %s' % \
(proc.id, proc.product_qty, proc.product_uom.name,
proc.product_id.name,))
report_except +=1
if use_new_cursor:
cr.commit()
offset += len(ids)
end_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss')
if user_id:
request = pooler.get_pool(cr.dbname).get('res.request')
summary = '''Here is the procurement scheduling report.
Computation Started; %s
Computation Finnished; %s
Total procurement: %d
Exception procurement: %d
Not run now procurement: %d
Exceptions;
'''% (start_date,end_date,report_total, report_except,report_later)
summary += '\n'.join(report)
request.create(cr, uid,
{'name' : "Procurement calculation report.",
'act_from' : user_id,
'act_to' : user_id,
'body': summary,
})
if use_new_cursor:
cr.commit()
cr.close()
return {}
def create_automatic_op(cr, uid, context=None):
if not context:
context={}
product_obj = pooler.get_pool(cr.dbname).get('product.product')
proc_obj = pooler.get_pool(cr.dbname).get('mrp.procurement')
warehouse_obj = pooler.get_pool(cr.dbname).get('stock.warehouse')
wf_service = netsvc.LocalService("workflow")
cr.execute('select id from stock_warehouse')
warehouses = [x for x, in cr.fetchall()]
cr.execute('select id from product_product')
products_id = [x for x, in cr.fetchall()]
products = dict(zip(products_id, product_obj.browse(cr, uid, products_id, context)))
for warehouse in warehouses:
v_stock = product_obj._product_virtual_available(cr, uid, products_id, None, {'warehouse': warehouse})
cr.execute("select lot_stock_id from stock_warehouse")
location_ids_str = ','.join([str(id) for id, in cr.fetchall()])
stock_locations = warehouse_obj.read(cr, uid, [warehouse], ['lot_input_id', 'lot_stock_id'])[0]
for prod_id, available in v_stock.items():
if available >= 0:
continue
newdate = DateTime.now() + DateTime.RelativeDateTime(days=products[prod_id].seller_delay)
if products[prod_id].supply_method == 'buy':
location_id = stock_locations['lot_input_id'][0]
elif products[prod_id].supply_method == 'produce':
location_id = stock_locations['lot_stock_id'][0]
else:
continue
proc_id = proc_obj.create(cr, uid, {
'name': 'PROC:Automatic OP for product:%s' % products[prod_id].name,
'origin': 'SCHEDULER',
'date_planned': newdate.strftime('%Y-%m-%d'),
'product_id': prod_id,
'product_qty': -available,
'product_uom': products[prod_id].uom_id.id,
'location_id': location_id,
'procure_method': 'make_to_order',
})
wf_service.trg_validate(uid, 'mrp.procurement', proc_id, 'button_confirm', cr)
wf_service.trg_validate(uid, 'mrp.procurement', proc_id, 'button_check', cr)
def _procure_orderpoint_confirm(self, cr, uid, automatic=False,\
use_new_cursor=False, context=None, user_id=False):
'''
use_new_cursor: False or the dbname
'''
if not context:
context={}
if use_new_cursor:
cr = pooler.get_db(use_new_cursor).cursor()
pool = pooler.get_pool(cr.dbname)
orderpoint_obj = pool.get('stock.warehouse.orderpoint')
location_obj = pool.get('stock.location')
procurement_obj = pool.get('mrp.procurement')
request_obj = pool.get('res.request')
wf_service = netsvc.LocalService("workflow")
report = []
offset = 0
ids = [1]
if automatic:
create_automatic_op(cr, uid, context=context)
while ids:
ids=orderpoint_obj.search(cr,uid,[],offset=offset,limit=100)
for op in orderpoint_obj.browse(cr, uid, ids):
#if op.procurement_id and op.procurement_id.purchase_id:
# if (op.procurement_id.purchase_id.state=='confirmed'):
# #
# # TODO: Should write a request with this warning
# #
# continue
# elif op.procurement_id.purchase_id.state=='draft':
# wf_service = netsvc.LocalService("workflow")
# wf_service.trg_validate(uid, 'purchase.order',
# op.procurement_id.purchase_id.id, 'purchase_cancel', cr)
try:
prods = location_obj._product_virtual_get(cr, uid,
op.warehouse_id.lot_stock_id.id, [op.product_id.id],
{'uom': op.product_uom.id})[op.product_id.id]
if prods < op.product_min_qty:
# order the quantity necessary to get to max(min_qty, max_qty)
qty = max(op.product_min_qty, op.product_max_qty)-prods
reste = qty % op.qty_multiple
if reste>0:
qty += op.qty_multiple-reste
newdate = DateTime.now() + DateTime.RelativeDateTime(
days=op.product_id.seller_delay)
if op.product_id.supply_method == 'buy':
location_id = op.warehouse_id.lot_input_id
elif op.product_id.supply_method == 'produce':
location_id = op.warehouse_id.lot_stock_id
else:
continue
proc_id = procurement_obj.create(cr, uid, {
'name': 'OP:'+str(op.id),
'date_planned': newdate.strftime('%Y-%m-%d'),
'product_id': op.product_id.id,
'product_qty': qty,
'product_uom': op.product_uom.id,
'location_id': op.warehouse_id.lot_input_id.id,
'procure_method': 'make_to_order',
'origin': op.name
})
wf_service.trg_validate(uid, 'mrp.procurement', proc_id,
'button_confirm', cr)
wf_service.trg_validate(uid, 'mrp.procurement', proc_id,
'button_check', cr)
orderpoint_obj.write(cr, uid, [op.id],
{'procurement_id': proc_id})
except Exception, e:
report.append('OP %d:\n%s\n' % (op.id, str(e)))
offset += len(ids)
if use_new_cursor:
cr.commit()
if user_id and report:
request_obj.create(cr, uid, {
'name': 'Orderpoint report.',
'act_from': user_id,
'act_to': user_id,
'body': '\n'.join(report)
})
if use_new_cursor:
cr.commit()
cr.close()
return {}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -51,8 +51,8 @@ def _procure_calculation_orderpoint(self, db_name, uid, data, context):
cr = db.cursor()
proc_obj = pool.get('mrp.procurement')
automatic = data['form']['automatic']
proc_obj.run_orderpoint_confirm(cr, uid, automatic=automatic,\
use_new_cursor=cr.dbname, context=context, user_id=uid)
proc_obj._procure_orderpoint_confirm(cr, uid, automatic=automatic,\
use_new_cursor=cr.dbname, context=context)
return {}
def _procure_calculation(self, cr, uid, data, context):

View File

@ -34,38 +34,17 @@ import pooler
parameter_form = '''<?xml version="1.0"?>
<form string="Parameters" colspan="4">
<separator string="Time (days)" colspan="4"/>
<field name="po_lead"/>
<field name="picking_lead"/>
<field name="schedule_cycle"/>
<field name="po_cycle"/>
<field name="security_lead"/>
<separator string="Control" colspan="4"/>
<field name="user_id"/>
<label string="This wizard will schedule procurements." colspan="4" align="0.0"/>
</form>'''
parameter_fields = {
'schedule_cycle': {'string':'Scheduler Cycle', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'po_cycle': {'string':'PO Cycle', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'po_lead': {'string':'PO Lead Time', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'security_lead': {'string':'Security Days', 'type':'float', 'required':True, 'default': lambda *a: 5.0},
'picking_lead': {'string':'Packing Lead Time', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'user_id': {'string':'Send Result To', 'type':'many2one', 'relation':'res.users', 'default': lambda uid,data,state: uid},
}
def _procure_calculation_procure(self, db_name, uid, data, context):
db, pool = pooler.get_db_and_pool(db_name)
cr = db.cursor()
proc_obj = pool.get('mrp.procurement')
schedule_cycle = data['form']['schedule_cycle']
po_cycle = data['form']['po_cycle']
po_lead = data['form']['po_lead']
security_lead = data['form']['security_lead']
picking_lead = data['form']['picking_lead']
user_id = data['form']['user_id']
proc_obj.run_procure_confirm(cr, uid, user_id=user_id, schedule_cycle=schedule_cycle,\
po_cycle=po_cycle, po_lead=po_lead, security_lead=security_lead,\
picking_lead=picking_lead, use_new_cursor=cr.dbname, context=context)
proc_obj._procure_confirm(cr, uid, use_new_cursor=cr.dbname, context=context)
return {}
def _procure_calculation(self, cr, uid, data, context):

View File

@ -34,41 +34,19 @@ import pooler
parameter_form = '''<?xml version="1.0"?>
<form string="Scheduler Parameters" colspan="4">
<separator string="Time (days)" colspan="4"/>
<field name="po_lead"/>
<field name="picking_lead"/>
<field name="schedule_cycle"/>
<field name="po_cycle"/>
<field name="security_lead"/>
<field name="automatic" />
<separator string="Control" colspan="4"/>
<field name="user_id"/>
</form>'''
parameter_fields = {
'schedule_cycle': {'string':'Scheduler Cycle', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'po_cycle': {'string':'PO Cycle', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'po_lead': {'string':'PO Lead Time', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'security_lead': {'string':'Security Days', 'type':'float', 'required':True, 'default': lambda *a: 50.0},
'picking_lead': {'string':'Packing Lead Time', 'type':'float', 'required':True, 'default': lambda *a: 1.0},
'automatic': {'string': 'Automatic orderpoint', 'type': 'boolean', 'help': 'Triggers an automatic procurement for all products that have a virtual stock under 0.', 'default': lambda *a: False},
'user_id': {'string':'Send Result To', 'type':'many2one', 'relation':'res.users', 'default': lambda uid,data,state: uid},
}
def _procure_calculation_all(self, db_name, uid, data, context):
db, pool = pooler.get_db_and_pool(db_name)
cr = db.cursor()
proc_obj = pool.get('mrp.procurement')
schedule_cycle = data['form']['schedule_cycle']
po_cycle = data['form']['po_cycle']
po_lead = data['form']['po_lead']
security_lead = data['form']['security_lead']
picking_lead = data['form']['picking_lead']
user_id = data['form']['user_id']
automatic = data['form']['automatic']
proc_obj.run_scheduler(cr, uid, user_id=user_id, schedule_cycle=schedule_cycle,\
po_cycle=po_cycle, po_lead=po_lead, security_lead=security_lead,\
picking_lead=picking_lead, automatic=automatic, use_new_cursor=cr.dbname,\
proc_obj.run_scheduler(cr, uid, automatic=automatic, use_new_cursor=cr.dbname,\
context=context)
return {}

View File

@ -196,7 +196,7 @@ class product_category(osv.osv):
_name = "product.category"
_description = "Product Category"
_columns = {
'name': fields.char('Name', size=64, required=True),
'name': fields.char('Name', size=64, required=True, translate=True),
'complete_name': fields.function(_name_get_fnc, method=True, type="char", string='Name'),
'parent_id': fields.many2one('product.category','Parent Category', select=True),
'child_id': fields.one2many('product.category', 'parent_id', string='Childs Categories'),

View File

@ -29,8 +29,8 @@
from osv import fields, osv
import pooler
class config_install_extra_modules(osv.osv_memory):
_name='config.install_extra_modules'
class profile_accounting_config_install_modules_wizard(osv.osv_memory):
_name='profile.accounting.config.install_modules_wizard'
_columns = {
'name':fields.char('Name', size=64),
'account_analytic_analysis':fields.boolean('Analytic Accounting'),
@ -69,7 +69,7 @@ class config_install_extra_modules(osv.osv_memory):
}
config_install_extra_modules()
profile_accounting_config_install_modules_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -2,8 +2,8 @@
<terp>
<data>
<record id="view_confirm_install_module_form" model="ir.ui.view">
<field name="name">Install extra modules</field>
<field name="model">config.install_extra_modules</field>
<field name="name">Accounting Profile : Install extra modules</field>
<field name="model">profile.accounting.config.install_modules_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Install Extra Module">
@ -27,17 +27,17 @@
</record>
<record id="action_config_install_module" model="ir.actions.act_window">
<field name="name">Install Extra Modules</field>
<field name="name">Accounting Profile : Install Extra Modules</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">config.install_extra_modules</field>
<field name="res_model">profile.accounting.config.install_modules_wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.module.module.configuration.step"
id="config_install_module">
<field name="name">Install Extra modules</field>
id="profile_accounting.config_install_wizard">
<field name="name">Accounting Profile : Install Extra modules</field>
<field name="note">Install more modules. A few modules are proposed according to the service profile you selected. You will be able to install them based on our requirements.</field>
<field name="action_id" ref="action_config_install_module"/>
<field name="state">open</field>

View File

@ -1,2 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_config_install_extra_modules,config.install_extra_modules,model_config_install_extra_modules,base.group_system,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2

View File

@ -30,8 +30,8 @@ from osv import fields, osv
import pooler
class config_install_extra_modules(osv.osv_memory):
_name='config.install_extra_modules'
class profile_association_config_install_modules_wizard(osv.osv_memory):
_name='profile.association.config.install_modules_wizard'
_columns = {
'crm_configuration':fields.boolean('CRM & Calendars', help="This installs the customer relationship features like: leads and opportunities tracking, shared calendar, jobs tracking, bug tracker, and so on."),
'hr_expense':fields.boolean('Expenses Tracking', help="Tracks the personal expenses process, from the employee expense encoding, to the reimbursement of the employee up to the reinvoicing to the final customer."),
@ -68,6 +68,6 @@ class config_install_extra_modules(osv.osv_memory):
}
config_install_extra_modules()
profile_association_config_install_modules_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -2,8 +2,8 @@
<terp>
<data>
<record id="view_confirm_install_module_form" model="ir.ui.view">
<field name="name">Install extra modules</field>
<field name="model">config.install_extra_modules</field>
<field name="name">Association Profile : Install extra modules</field>
<field name="model">profile.association.config.install_modules_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Install Extra Module">
@ -26,9 +26,9 @@
</record>
<record id="action_config_install_module" model="ir.actions.act_window">
<field name="name">Install Extra Modules</field>
<field name="name">Association Profile : Install Extra Modules</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">config.install_extra_modules</field>
<field name="res_model">profile.association.config.install_modules_wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
@ -36,7 +36,7 @@
<record model="ir.module.module.configuration.step"
id="config_install_module">
<field name="name">Install Extra modules</field>
<field name="name">Association Profile : Install Extra modules</field>
<field name="note">Install more modules. A few modules are proposed according to the service profile you selected. You will be able to install them based on our requirements.</field>
<field name="action_id" ref="action_config_install_module"/>
<field name="state">open</field>

View File

@ -31,7 +31,7 @@ import pooler
class config_install_extra_modules(osv.osv_memory):
_name='config.install_extra_modules'
_name='config.install_extra_modules.mrp'
_columns = {
'mrp_jit':fields.boolean('Just in Time Scheduling',
help="The JIT module allows you to not run the scheduler "\

View File

@ -2,11 +2,11 @@
<terp>
<data>
<record id="view_confirm_install_module_form" model="ir.ui.view">
<field name="name">Install extra modules</field>
<field name="model">config.install_extra_modules</field>
<field name="name">Manufacturing Profile : Install extra modules</field>
<field name="model">profile.manufacturing.config.install_modules_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Install Extra Module">
<form string="Manufacturing Profile : Install Extra Module">
<separator string="Stock &amp; Manufacturing" colspan="4"/>
<field name="stock_location"/>
<field name="mrp_jit"/>
@ -28,9 +28,9 @@
</record>
<record id="action_config_install_module" model="ir.actions.act_window">
<field name="name">Install Extra Modules</field>
<field name="name">Manufacturing Profile : Install Extra Modules</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">config.install_extra_modules</field>
<field name="res_model">profile.manufacturing.config.install_modules_wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
@ -38,7 +38,7 @@
<record model="ir.module.module.configuration.step"
id="config_install_module">
<field name="name">Install Extra modules</field>
<field name="name">Manufacturing Profile : Install Extra modules</field>
<field name="note">Install more modules. A few modules are proposed according to the service profile you selected. You will be able to install them based on our requirements.</field>
<field name="action_id" ref="action_config_install_module"/>
<field name="state">open</field>

View File

@ -1,2 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_config_install_extra_modules,config.install_extra_modules,model_config_install_extra_modules,base.group_system,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2

View File

@ -30,8 +30,8 @@
from osv import fields, osv
import pooler
class config_install_extra_modules(osv.osv_memory):
_name='config.install_extra_modules'
class profile_service_config_install_modules_wizard(osv.osv_memory):
_name='profile.service.config.install_modules_wizard'
_rec_name = 'crm_configuration'
_columns = {
'crm_configuration':fields.boolean('CRM & Calendars', help="This installs the customer relationship features like: leads and opportunities tracking, shared calendar, jobs tracking, bug tracker, and so on."),
@ -69,7 +69,7 @@ class config_install_extra_modules(osv.osv_memory):
'type': 'ir.actions.act_window',
'target':'new',
}
config_install_extra_modules()
profile_service_config_install_modules_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -2,8 +2,8 @@
<terp>
<data>
<record id="view_confirm_install_module_form" model="ir.ui.view">
<field name="name">Install extra modules</field>
<field name="model">config.install_extra_modules</field>
<field name="name">Service Profile : Install extra modules</field>
<field name="model">profile.service.config.install_modules_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Install Extra Module">
@ -33,9 +33,9 @@
</record>
<record id="action_config_install_module" model="ir.actions.act_window">
<field name="name">Install Extra Modules</field>
<field name="name">Service Profile : Install Extra Modules</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">config.install_extra_modules</field>
<field name="res_model">profile.service.config.install_modules_wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
@ -43,7 +43,7 @@
<record model="ir.module.module.configuration.step"
id="config_install_module">
<field name="name">Install Extra modules</field>
<field name="name">Service Profile : Install Extra modules</field>
<field name="note">A few modules are proposed according to the 'service profile' you selected. You will be able to install them or more modules later through the Administration menu.</field>
<field name="action_id" ref="action_config_install_module"/>
<field name="state">open</field>

View File

@ -1,2 +1 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_config_install_extra_modules,config.install_extra_modules,model_config_install_extra_modules,base.group_system,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
access_config_install_extra_modules config.install_extra_modules model_config_install_extra_modules base.group_system 1 1 1 1

View File

@ -242,7 +242,6 @@ class task(osv.osv):
'child_ids': fields.one2many('project.task', 'parent_id', 'Delegated Tasks'),
'history': fields.function(_history_get, method=True, string="Task Details", type="text"),
'notes': fields.text('Notes'),
'start_sequence': fields.boolean('Wait for previous sequences'),
'planned_hours': fields.float('Planned Hours', readonly=True, states={'draft':[('readonly',False)]}, required=True),
'effective_hours': fields.function(_hours_get, method=True, string='Hours Spent', multi='hours', store=True),
@ -263,7 +262,6 @@ class task(osv.osv):
'sequence': lambda *a: 10,
'active': lambda *a: True,
'date_start': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'start_sequence': lambda *a: True
}
_order = "state, sequence, priority, date_deadline, id"
@ -375,7 +373,7 @@ class project_work(osv.osv):
'name': fields.char('Work summary', size=128),
'date': fields.datetime('Date'),
'task_id': fields.many2one('project.task', 'Task', ondelete='cascade', required=True),
'hours': fields.float('Hours spent'),
'hours': fields.float('Time Spent'),
'user_id': fields.many2one('res.users', 'Done by', required=True),
}
_defaults = {

View File

@ -89,7 +89,6 @@
</record>
<record id="project_task_190" model="project.task">
<field name="sequence">20</field>
<field name="start_sequence">1</field>
<field name="planned_hours">32.0</field>
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="project_project_21"/>
@ -97,7 +96,6 @@
</record>
<record id="project_task_192" model="project.task">
<field name="sequence">25</field>
<field name="start_sequence">1</field>
<field name="planned_hours">24.0</field>
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="project_project_21"/>
@ -128,7 +126,6 @@
</record>
<record id="project_task_196" model="project.task">
<field name="sequence">30</field>
<field name="start_sequence">1</field>
<field name="planned_hours">32.0</field>
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="project_project_22"/>
@ -172,7 +169,6 @@
</record>
<record id="project_task_202" model="project.task">
<field name="sequence">50</field>
<field name="start_sequence">1</field>
<field name="planned_hours">24.0</field>
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project_project_22"/>

View File

@ -266,7 +266,6 @@
<field name="type"/>
<field name="active" select="2"/>
<field name="start_sequence"/>
<field name="partner_id" select="2"/>
<separator colspan="4" string="Notes"/>
<field colspan="4" name="notes" nolabel="1"/>
@ -309,12 +308,24 @@
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_project_task_graph">
<field name="name">project.task.graph</field>
<field name="model">project.task</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Project Tasks" type="bar">
<field name="project_id"/>
<field name="planned_hours" operator="+"/>
<field name="delay_hours" operator="+"/>
</graph>
</field>
</record>
<record id="action_view_task" model="ir.actions.act_window">
<field name="name">All Tasks</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field eval="False" name="view_id"/>
</record>
<menuitem action="action_view_task" id="menu_action_view_task" parent="project.menu_main"/>
@ -323,7 +334,7 @@
<field name="name">My Tasks</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('user_id', '=', uid)]</field>
</record>
<menuitem action="action_view_task4" id="menu_action_view_task4" parent="project.menu_main"/>
@ -332,7 +343,7 @@
<field name="name">My Pending Tasks</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('user_id', '=', uid),('state','=','pending')]</field>
</record>
<menuitem action="action_view_task5_pending" id="menu_tasks_yours_pending" parent="menu_action_view_task4"/>
@ -341,7 +352,7 @@
<field name="name">My Open Tasks</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('user_id', '=', uid),('state','=','open')]</field>
</record>
<menuitem action="action_view_task5" id="menu_tasks_yours" parent="menu_action_view_task4"/>
@ -350,7 +361,7 @@
<field name="name">My Tasks in Progress</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('user_id', '=', uid),('state','=','open')]</field>
</record>
<menuitem action="action_view_task5_prog" id="menu_tasks_yours_prog" parent="menu_action_view_task4"/>
@ -359,7 +370,7 @@
<field name="name">New Task</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_mode">form,tree,calendar,graph</field>
</record>
<menuitem action="action_view_task_new" id="menu_action_view_task_new" parent="menu_action_view_task4"/>
@ -367,7 +378,7 @@
<field name="name">Open Tasks</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state', '=', 'open')]</field>
</record>
<menuitem action="action_view_task6" id="menu_action_view_task6" parent="project.menu_action_view_task"/>
@ -376,7 +387,7 @@
<field name="name">Tasks in Progress</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state', '=', 'progress')]</field>
</record>
<menuitem action="action_view_task6_prog" id="menu_action_view_task6_prog" parent="project.menu_action_view_task"/>
@ -385,7 +396,7 @@
<field name="name">Unassigned Tasks</field>
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('user_id', '=', False)]</field>
</record>
<menuitem action="action_view_task7" id="menu_action_view_task7" parent="project.menu_action_view_task"/>
@ -395,7 +406,7 @@
<field name="res_model">project.task</field>
<field name="name">Project's tasks</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('project_id', 'child_of', [active_id])]</field>
</record>
<record id="ir_project_task_open" model="ir.values">
@ -444,7 +455,7 @@
name="All Tasks"
res_model="project.task"
src_model="project.project"
view_mode="tree,form,calendar"
view_mode="tree,form,calendar,graph"
view_type="form"/>
<act_window
@ -453,7 +464,7 @@
name="Open Tasks"
res_model="project.task"
src_model="project.project"
view_mode="tree,form,calendar"
view_mode="tree,form,calendar,graph"
view_type="form"/>
<record id="task_company" model="ir.ui.view">

View File

@ -52,13 +52,12 @@ def _compute_tasks(cr, uid, task_list, date_begin):
date_start = users[task.user_id.id]
else:
date_start = date_begin
if task.start_sequence:
sequences.sort()
for (seq,dt) in sequences:
if seq<task.sequence:
date_start = max(dt,date_start)
else:
break
sequences.sort()
for (seq,dt) in sequences:
if seq<task.sequence:
date_start = max(dt,date_start)
else:
break
if task.date_start:
task_date_start = DateTime.strptime(task.date_start, '%Y-%m-%d %H:%M:%S')

View File

@ -6,7 +6,13 @@
"website" : "http://tinyerp.com/module_project.html",
"category" : "Generic Modules/Projects & Services",
"depends" : ["project", 'mrp'],
"description": "Link between project and mrp",
"description": """
This module is used to automatically create tasks base on different
procurements: sales order, manufacturing order, ...
It is mainly used to invoices services based on tasks by doing sales
order on services products.
""",
"init_xml" : [],
"demo_xml" : [],
"update_xml": ["project_workflow.xml"],

View File

@ -36,15 +36,27 @@ class mrp_procurement(osv.osv):
def action_produce_assign_service(self, cr, uid, ids, context={}):
for procurement in self.browse(cr, uid, ids):
sline = self.pool.get('sale.order.line')
sale_ids = sline.search(cr, uid, [('procurement_id','=',procurement.id)], context)
content = ''
l = None
for line in sline.browse(cr, uid, sale_ids, context=context):
content += (line.notes or '')
l = line
self.write(cr, uid, [procurement.id], {'state':'running'})
task_id = self.pool.get('project.task').create(cr, uid, {
'name': procurement.name,
'name': procurement.origin+': '+procurement.name,
'date_deadline': procurement.date_planned,
'state': 'open',
'planned_hours': procurement.product_qty,
'remaining_hours': procurement.product_qty,
'user_id': procurement.product_id.product_manager.id,
'notes': procurement.origin,
'procurement_id': procurement.id
'notes': l and l.order_id.note or '',
'procurement_id': procurement.id,
'description': content,
'date_deadline': procurement.date_planned,
'state': 'draft',
'partner_id': l and l.order_id.partner_id.id or False
})
return task_id
mrp_procurement()

View File

@ -29,15 +29,16 @@
##############################################################################
from osv import fields, osv
import netsvc
class task(osv.osv):
class project_task(osv.osv):
_name = "project.task"
_inherit = "project.task"
_columns = {
'procurement_id': fields.many2one('mrp.procurement', 'Procurement', ondelete='set null')
}
def do_close(self, cr, uid, ids, *args):
res = super(task, self).do_close(cr, uid, ids, *args)
res = super(project_task, self).do_close(cr, uid, ids, *args)
tasks = self.browse(cr, uid, ids)
for task in tasks:
if task.procurement_id:
@ -46,13 +47,13 @@ class task(osv.osv):
return res
def do_cancel(self, cr, uid, ids, *args):
res = super(task, self).do_cancel(cr, uid, ids, *args)
res = super(project_task, self).do_cancel(cr, uid, ids, *args)
tasks = self.browse(cr, uid, ids)
for task in tasks:
if task.procurement_id:
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'mrp.procurement', task.procurement_id.id, 'subflow.cancel', cr)
return True
task()
project_task()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -7,11 +7,11 @@
<field name="type">form</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<page string="Sales &amp; Purchases" position="inside">
<group colspan="2" col="2">
<separator string="Purchases" colspan="2"/>
<field name="property_product_pricelist_purchase"/>
</group>
<page string="Sales &amp; Purchases" position="inside">
<group colspan="2" col="2">
<separator string="Purchases" colspan="2"/>
<field name="property_product_pricelist_purchase"/>
</group>
</page>
</field>
</record>

View File

@ -16,6 +16,17 @@
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_purchase_order_graph">
<field name="name">purchase.order.graph</field>
<field name="model">purchase.order</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Purchase Order" type="bar">
<field name="partner_id"/>
<field name="amount_total" operator="+"/>
</graph>
</field>
</record>
<record id="purchase_order_form" model="ir.ui.view">
<field name="name">purchase.order.form</field>
@ -87,7 +98,7 @@
<field name="name">Purchase Orders</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="view_mode">tree,calendar,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
</record>
<menuitem action="purchase_form_action" id="menu_purchase_form_action" parent="purchase.menu_purchase_root"/>
@ -97,7 +108,7 @@
<field name="res_model">purchase.order</field>
<field name="domain">[('state','=','draft')]</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
</record>
<menuitem action="purchase_form_action2" id="menu_purchase_order_draft" parent="purchase.menu_purchase_form_action"/>
@ -106,7 +117,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','confirmed')]</field>
</record>
<menuitem action="purchase_form_action3" id="menu_purchase_form_action3" parent="purchase.menu_purchase_form_action"/>
@ -116,7 +127,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','approved')]</field>
</record>
<menuitem action="purchase_form_action4" id="menu_purchase_form_action4" parent="purchase.menu_purchase_form_action"/>

View File

@ -129,11 +129,17 @@ class sale_order(osv.osv):
res[r] = 0.0
else:
res[r] = 100.0 * res[r][0] / res[r][1]
for order in self.browse(cr, uid, ids, context):
if order.shipped:
res[order.id] = 100.0
return res
def _invoiced_rate(self, cursor, user, ids, name, arg, context=None):
res = {}
for sale in self.browse(cursor, user, ids, context=context):
if sale.invoiced:
res[sale.id] = 100.0
continue
tot = 0.0
for invoice in sale.invoice_ids:
if invoice.state not in ('draft','cancel'):
@ -159,7 +165,6 @@ class sale_order(osv.osv):
def _invoiced_search(self, cursor, user, obj, name, args):
if not len(args):
return []
clause = ''
no_invoiced = False
for arg in args:
@ -169,7 +174,6 @@ class sale_order(osv.osv):
else:
clause += 'AND inv.state <> \'paid\''
no_invoiced = True
cursor.execute('SELECT rel.order_id ' \
'FROM sale_order_invoice_rel AS rel, account_invoice AS inv ' \
'WHERE rel.invoice_id = inv.id ' + clause)
@ -210,7 +214,7 @@ class sale_order(osv.osv):
'partner_shipping_id':fields.many2one('res.partner.address', 'Shipping Address', readonly=True, required=True, states={'draft':[('readonly',False)]}),
'incoterm': fields.selection(_incoterm_get, 'Incoterm',size=3),
'picking_policy': fields.selection([('direct','Direct Delivery'),('one','All at once')], 'Packing Policy', required=True ),
'picking_policy': fields.selection([('direct','Partial Delivery'),('one','Complete Delivery')], 'Packing Policy', required=True ),
'order_policy': fields.selection([
('prepaid','Payment before delivery'),
('manual','Shipping & Manual Invoice'),
@ -322,9 +326,13 @@ class sale_order(osv.osv):
'comment': order.note,
'payment_term': pay_term,
}
inv.update(self._inv_get(cr, uid, order))
inv_obj = self.pool.get('account.invoice')
inv.update(self._inv_get(cr, uid, order))
inv_id = inv_obj.create(cr, uid, inv)
data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id],
pay_term,time.strftime('%Y-%m-%d'))
if data.get('value',False):
inv_obj.write(cr, uid, [inv_id], inv.update(data['value']), context=context)
inv_obj.button_compute(cr, uid, [inv_id])
return inv_id
@ -464,12 +472,14 @@ class sale_order(osv.osv):
def action_ship_create(self, cr, uid, ids, *args):
picking_id=False
company = self.pool.get('res.users').browse(cr, uid, uid).company_id
for order in self.browse(cr, uid, ids, context={}):
output_id = order.shop_id.warehouse_id.lot_output_id.id
picking_id = False
for line in order.order_line:
proc_id=False
date_planned = (DateTime.now() + DateTime.RelativeDateTime(days=line.delay or 0.0)).strftime('%Y-%m-%d')
date_planned = DateTime.now() + DateTime.RelativeDateTime(days=line.delay or 0.0)
date_planned = (date_planned - DateTime.RelativeDateTime(days=company.security_lead)).strftime('%Y-%m-%d')
if line.state == 'done':
continue
if line.product_id and line.product_id.product_tmpl_id.type in ('product', 'consu'):
@ -771,12 +781,7 @@ class sale_order_line(osv.osv):
if not product:
return {'value': {'th_weight' : 0, 'product_packaging': False,
'product_uos_qty': qty}, 'domain': {'product_uom': [],
'product_uos': []}}
if not pricelist:
raise osv.except_osv(_('No Pricelist !'),
_('You have to select a pricelist in the sale form !\n'
'Please set one before choosing a product.'))
'product_uos': []}}
if not date_order:
date_order = time.strftime('%Y-%m-%d')
@ -788,18 +793,7 @@ class sale_order_line(osv.osv):
pack = self.pool.get('product.packaging').browse(cr, uid, packaging, context)
q = product_uom_obj._compute_qty(cr, uid, uom, pack.qty, default_uom)
qty = qty - qty % q + q
result['product_uom_qty'] = qty
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist],
product, qty or 1.0, partner_id, {
'uom': uom,
'date': date_order,
})[pricelist]
if price is False:
raise osv.except_osv(_('No valid pricelist line found !'),
_("Couldn't find a pricelist line matching this product and quantity.\n"
"You have to change either the product, the quantity or the pricelist."))
result['product_uom_qty'] = qty
if uom:
uom2 = product_uom_obj.browse(cr, uid, uom)
@ -814,7 +808,7 @@ class sale_order_line(osv.osv):
else:
uos = False
result .update({'price_unit': price, 'type': product_obj.procure_method})
result .update({'type': product_obj.procure_method})
if product_obj.description_sale:
result['notes'] = product_obj.description_sale
@ -868,7 +862,34 @@ class sale_order_line(osv.osv):
result['product_uom_qty'] = qty_uos / product_obj.uos_coeff
result['th_weight'] = result['product_uom_qty'] * product_obj.weight
# Round the quantity up
return {'value': result, 'domain': domain}
# get unit price
warning={}
if not pricelist:
warning={
'title':'No Pricelist !',
'message':
'You have to select a pricelist in the sale form !\n'
'Please set one before choosing a product.'
}
else:
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist],
product, qty or 1.0, partner_id, {
'uom': uom,
'date': date_order,
})[pricelist]
if price is False:
warning={
'title':'No valid pricelist line found !',
'message':
"Couldn't find a pricelist line matching this product and quantity.\n"
"You have to change either the product, the quantity or the pricelist."
}
else:
result.update({'price_unit': price})
return {'value': result, 'domain': domain,'warning':warning}
def product_uom_change(self, cursor, user, ids, pricelist, product, qty=0,
uom=False, qty_uos=0, uos=False, name='', partner_id=False,

View File

@ -43,6 +43,29 @@
</record>
<menuitem id="menu_shop_configuration" name="Configuration" parent="sale.menu_sale_root" sequence="1"/>
<menuitem action="action_shop_form" id="menu_action_shop_form" parent="sale.menu_shop_configuration"/>
<record id="view_sale_order_calendar" model="ir.ui.view">
<field name="name">sale.order.calendar</field>
<field name="model">sale.order</field>
<field name="type">calendar</field>
<field name="arch" type="xml">
<calendar string="Sales orders" color="state" date_start="date_order">
<field name="partner_id"/>
<field name="amount_total"/>
</calendar>
</field>
</record>
<record model="ir.ui.view" id="view_sale_order_graph">
<field name="name">sale.order.graph</field>
<field name="model">sale.order</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Sales orders" type="bar">
<field name="partner_id"/>
<field name="amount_total" operator="+"/>
</graph>
</field>
</record>
<record id="view_order_tree" model="ir.ui.view">
<field name="name">sale.order.tree</field>
@ -207,7 +230,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('user_id','=',uid)]</field>
</record>
<menuitem action="action_order_tree" id="menu_action_order_tree" parent="sale.menu_sale_order"/>
@ -218,7 +241,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
</record>
<menuitem action="action_order_tree_all" id="menu_action_order_tree_all" parent="sale.menu_sale_order"/>
@ -227,7 +250,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_mode">form,tree,calendar,graph</field>
</record>
<menuitem action="action_order_tree_new" id="menu_action_order_tree_new" parent="sale.menu_sale_order"/>
@ -237,7 +260,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','in',('shipping_except','invoice_except')]</field>
</record>
<menuitem action="action_order_tree2" id="menu_action_order_tree2" parent="menu_action_order_tree_all"/>
@ -247,7 +270,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','manual')]</field>
</record>
<menuitem action="action_order_tree3" id="menu_action_order_tree3" parent="sale.menu_action_order_tree_all"/>
@ -257,7 +280,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','in',('progress','waiting_date','manual'))]</field>
</record>
<menuitem action="action_order_tree4" id="menu_action_order_tree4" parent="sale.menu_action_order_tree_all" sequence="2"/>
@ -268,7 +291,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','draft')]</field>
</record>
<menuitem action="action_order_tree5" id="menu_action_order_tree5" parent="sale.menu_action_order_tree_all" sequence="1"/>
@ -278,7 +301,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','in',('shipping_except','invoice_except')),('user_id','=',uid)]</field>
</record>
<menuitem action="action_order_tree7" id="menu_action_order_tree7" parent="menu_action_order_tree"/>
@ -288,7 +311,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','manual'),('user_id','=',uid)]</field>
</record>
<menuitem action="action_order_tree8" id="menu_action_order_tree8" parent="sale.menu_action_order_tree"/>
@ -298,7 +321,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','in',('progress','waiting_date','manual')),('user_id','=',uid)]</field>
</record>
<menuitem action="action_order_tree9" id="menu_action_order_tree9" parent="sale.menu_action_order_tree" sequence="2"/>
@ -309,7 +332,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','=','draft'),('user_id','=',uid)]</field>
</record>
<menuitem action="action_order_tree10" id="menu_action_order_tree10" parent="sale.menu_action_order_tree" sequence="1"/>
@ -404,7 +427,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order.line</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,graph</field>
<field name="domain">[('invoiced','&lt;&gt;', 1),('state','&lt;&gt;','draft'),('state','&lt;&gt;','cancel')]</field>
</record>
<menuitem action="action_order_line_tree2" id="menu_action_order_line_tree2" parent="sale.menu_action_order_line_tree1"/>
@ -414,7 +437,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order.line</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,graph</field>
<field name="domain">[('invoiced','&lt;&gt;', 1),('state','=','done')]</field>
</record>
<menuitem action="action_order_line_tree3" id="menu_action_order_line_tree3" parent="sale.menu_action_order_line_tree2"/>

View File

@ -3,7 +3,7 @@
<data>
<wizard
string="Make Sale Order"
string="Make Quotation"
model="crm.case"
name="crm.case.make_order"
keyword="client_action_multi"

View File

@ -368,6 +368,7 @@ class stock_picking(osv.osv):
_columns = {
'name': fields.char('Reference', size=64, required=True, select=True),
'origin': fields.char('Origin', size=64),
'backorder_id': fields.many2one('stock.picking', 'Back Order'),
'type': fields.selection([('out','Sending Goods'),('in','Getting Goods'),('internal','Internal'),('delivery','Delivery')], 'Shipping Type', required=True, select=True),
'active': fields.boolean('Active'),
'note': fields.text('Notes'),
@ -408,10 +409,9 @@ class stock_picking(osv.osv):
'invoice_state': lambda *a: 'none',
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
}
def copy(self, cr, uid, id, data=None, context={}):
data = data or {}
data['name'] = '/'
return super(stock_picking, self).copy(cr, uid, id, data, context)
#def copy(self, cr, uid, id, data=None, context={}):
# data = data or {}
# return super(stock_picking, self).copy(cr, uid, id, data, context)
def onchange_partner_in(self, cr, uid, context, partner_id=None):
sid = self.pool.get('res.partner.address').browse(cr, uid, partner_id, context).partner_id.property_stock_supplier.id

View File

@ -453,17 +453,30 @@
=============================
Packing
=============================
<record model="ir.ui.view" id="stock_picking_calendar">
<field name="name">stock.picking.calendar</field>
<field name="model">stock.picking</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
<calendar string="Calendar View" date_start="date" color="state">
<field name="name"/>
<field name="type"/>
<field name="address_id"/>
</calendar>
</field>
</record>
<record id="vpicktree" model="ir.ui.view">
<field name="name">stock.picking.tree</field>
<field name="model">stock.picking</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree color="red:state=='cancel'" string="Packing list">
<field colspan="4" name="name" select="1"/>
<field name="name"/>
<field name="address_id" select="1"/>
<field name="invoice_state" readonly="1"/>
<field name="origin" select="1"/>
<field name="state" readonly="1"/>
<field name="invoice_state"/>
<field name="origin"/>
<field name="backorder_id"/>
<field name="min_date" select="1"/>
<field name="max_date" select="1"/>
</tree>
@ -477,11 +490,11 @@
<form string="Packing list">
<notebook>
<page string="General Information">
<field name="name" select="1"/>
<field name="address_id" select="2" context="{'context_display':'partner'}"/>
<field name="type" select="2" readonly="1"/>
<field name="name" select="1" readonly="1"/>
<field name="date" select="1"/>
<group colspan="4" col="6">
<field name="address_id" select="2" context="{'context_display':'partner'}"/>
<field name="type"/>
<field name="name"/>
<field name="date"/>
<field name="type" select="2"/>
<field name="invoice_state" select="2"/>
<newline/>
@ -557,12 +570,11 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree color="red:state=='cancel'" string="Packing list">
<field colspan="4" name="name" select="1"/>
<field name="name"/>
<field name="address_id" select="1"/>
<field name="origin" select="1"/>
<field name="origin"/>
<field name="min_date" select="1"/>
<field name="max_date" select="1"/>
<field name="state" readonly="1"/>
</tree>
</field>
</record>
@ -577,7 +589,8 @@
<field name="min_date" select="1"/>
<field name="max_date" select="1"/>
<newline/>
<field name="address_id" select="2"/>
<field name="backorder_id" select="2"/>
</group>
<notebook colspan="4">
<page string="General Information">
<field colspan="4" name="move_lines" nolabel="1" widget="one2many_list" default_get="{'move_line':move_lines, 'address_out_id': address_id}">
@ -638,7 +651,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','delivery')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -662,7 +675,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','assigned'),('type','=','delivery')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -685,7 +698,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','confirmed'),('type','=','delivery')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -713,14 +726,13 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree color="red:state=='cancel'" string="Packing list">
<field colspan="4" name="name" select="1"/>
<field name="name"/>
<field name="min_date" select="1"/>
<field name="max_date" select="1"/>
<!--field name="date" select="1"/-->
<field name="address_id" select="1"/>
<field name="invoice_state" readonly="1"/>
<field name="origin" select="1"/>
<field name="state" readonly="1"/>
<field name="backorder_id"/>
<field name="state"/>
</tree>
</field>
</record>
@ -735,6 +747,8 @@
<newline/>
<field name="min_date" select="1"/>
<field name="max_date" select="1"/>
<field name="backorder_id" select="2"/>
</group>
<notebook colspan="4">
<page string="General Information">
<field colspan="4" name="move_lines" nolabel="1" widget="one2many_list" default_get="{'move_line':move_lines, 'address_out_id': address_id}">
@ -794,7 +808,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','out')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -817,7 +831,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','assigned'),('type','=','out')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -840,7 +854,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','confirmed'),('type','=','out')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -873,6 +887,7 @@
<field name="address_id" select="1"/>
<field name="invoice_state" readonly="1"/>
<field name="origin" select="1"/>
<field name="backorder_id" select="2"/>
<field name="state" readonly="1"/>
</tree>
</field>
@ -883,10 +898,11 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Input Packing List">
<field name="address_id" on_change="onchange_partner_in(address_id)" select="2" context="{'context_display':'partner'}"/>
<field name="origin" select="2"/>
<field name="invoice_state" select="2" string="Invoice Control"/>
<field name="name" readonly="1" select="1"/>
<group colspan="4" col="6">
<field name="address_id" on_change="onchange_partner_in(address_id)" select="2" context="{'context_display':'partner'}"/>
<field name="origin" select="2"/>
<field name="invoice_state" select="2" string="Invoice Control"/>
<field name="name" readonly="1" select="1"/>
<field name="location_id"/>
<field domain="[('usage','=','internal')]" name="location_dest_id"/>
<field name="invoice_state" select="2" string="Supplier Invoice Control"/>
@ -961,7 +977,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','in')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -985,7 +1001,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','assigned'),('type','=','in')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -1032,7 +1048,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','internal')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -1044,7 +1060,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','assigned'),('type','=','internal')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -1055,7 +1071,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','confirmed'),('type','=','internal')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>
@ -1066,7 +1082,7 @@
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('state','=','draft'),('type','=','internal')]</field>
<field name="context">{'contact_display': 'partner'}</field>
</record>

View File

@ -110,6 +110,7 @@ def _do_split(self, cr, uid, data, context):
new_moves = []
complete, too_many, too_few = [], [], []
pool = pooler.get_pool(cr.dbname)
for move in move_obj.browse(cr, uid, data['form'].get('moves',[])):
if move.product_qty == data['form']['move%s' % move.id]:
complete.append(move)
@ -120,10 +121,10 @@ def _do_split(self, cr, uid, data, context):
# Average price computation
if (pick.type == 'in') and (move.product_id.cost_method == 'average'):
product_obj = pooler.get_pool(cr.dbname).get('product.product')
currency_obj = pooler.get_pool(cr.dbname).get('res.currency')
users_obj = pooler.get_pool(cr.dbname).get('res.users')
uom_obj = pooler.get_pool(cr.dbname).get('product.uom')
product_obj = pool.get('product.product')
currency_obj = pool.get('res.currency')
users_obj = pool.get('res.users')
uom_obj = pool.get('product.uom')
product = product_obj.browse(cr, uid, [move.product_id.id])[0]
user = users_obj.browse(cr, uid, [uid])[0]
@ -151,9 +152,9 @@ def _do_split(self, cr, uid, data, context):
if not new_picking:
new_picking = pick_obj.copy(cr, uid, pick.id,
{
'name' : '%s (splitted)' % pick.name,
'name': pool.get('ir.sequence').get(cr, uid, 'stock.picking'),
'move_lines' : [],
'state':'draft'
'state':'draft',
})
new_obj = move_obj.copy(cr, uid, move.id,
{
@ -193,6 +194,7 @@ def _do_split(self, cr, uid, data, context):
wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_confirm', cr)
# Then we finish the good picking
if new_picking:
pick_obj.write(cr, uid, [pick.id], {'backorder_id': new_picking})
pick_obj.action_move(cr, uid, [new_picking])
wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_done', cr)
wf_service.trg_write(uid, 'stock.picking', pick.id, cr)

View File

@ -1,33 +0,0 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
# Fabien Pinckaers <fp@tiny.Be>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import stock
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,22 +0,0 @@
# -*- encoding: utf-8 -*-
{
"name" : "Stock Back Order",
"version" : "1.0",
"author" : "Tiny",
"depends" : ["base", "stock",],
"category" : "Generic Modules/Inventory Control",
"description":"""
To manage all back-orders (means partial pickings):
When products coming from suppliers arrive but some are missing, we have to make a partial picking.
The remaining products are called "back-orders" and have to be separated from normal waiting picking (in a predefined list called "Back-Orders").
The same process has to be done for sending goods.
""",
"init_xml" : [],
"demo_xml" : [],
"update_xml" : ["stock_view.xml","stock_wizard.xml"],
"active": False,
"installable": True
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:32:29+0000"
"PO-Revision-Date: 2008-09-04 08:32:29+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr ""
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:33:13+0000"
"PO-Revision-Date: 2008-09-04 08:33:13+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Warenversand"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Lagerverwaltung"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:34:02+0000"
"PO-Revision-Date: 2008-09-04 08:34:02+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Envío de Productos"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Recepción de Productos"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Control de Inventarios (Stock)"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:34:48+0000"
"PO-Revision-Date: 2008-09-04 08:34:48+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Envio Mercancias"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Recepcion Mercancias"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Control Inventario"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:35:53+0000"
"PO-Revision-Date: 2008-09-04 08:35:53+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Livraison de marchandise"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Reception des produits"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Contrôle d'inventaire"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr "Interne"
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr "Listes de colisage"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:36:32+0000"
"PO-Revision-Date: 2008-09-04 08:36:32+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr ""
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:37:25+0000"
"PO-Revision-Date: 2008-09-04 08:37:25+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Beni in spedizione"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Beni in ricezione"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Controllo inventario"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:38:11+0000"
"PO-Revision-Date: 2008-09-04 08:38:11+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Goederen Verzenden"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Getting Goods"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Voorraadbeheer"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:38:52+0000"
"PO-Revision-Date: 2008-09-04 08:38:52+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Enviar artigos"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Recebendo lances"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:39:40+0000"
"PO-Revision-Date: 2008-09-04 08:39:40+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "A Enviar Artigos "
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "A Receber Artigos"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Controlo de Inventário"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:40:19+0000"
"PO-Revision-Date: 2008-09-04 08:40:19+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Expedirea Marfii"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Receptia de marfuri"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:41:03+0000"
"PO-Revision-Date: 2008-09-04 08:41:03+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Отправка продукции"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Получение продукции"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:41:45+0000"
"PO-Revision-Date: 2008-09-04 08:41:45+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "Sändning av varor"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "Hämtning av varor"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "Lagerkontroll"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:42:44+0000"
"PO-Revision-Date: 2008-09-04 08:42:44+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "货物出库"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "货物入库"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr "库存管理"
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr "内部"
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr "装箱单"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,74 +0,0 @@
# Translation of OpenERP Server.
# This file containt the translation of the following modules:
# * stock_back_order
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 4.3.0"
"Report-Msgid-Bugs-To: support@tinyerp.com"
"POT-Creation-Date: 2008-09-04 08:43:25+0000"
"PO-Revision-Date: 2008-09-04 08:43:25+0000"
"Last-Translator: <>"
"Language-Team: "
"MIME-Version: 1.0"
"Content-Type: text/plain; charset=UTF-8"
"Content-Transfer-Encoding: "
"Plural-Forms: "
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_goods_list
msgid "Sending Goods"
msgstr "货物发送"
#. module: stock_back_order
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_getting_goods_list
msgid "Getting Goods"
msgstr "货物收乞"
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_control
msgid "Inventory Control"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,back_order_id:0
msgid "Back Order"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_list
msgid "Internal"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_internal_picking_back_order_tree
msgid "Back Orders (internal goods)"
msgstr ""
#. module: stock_back_order
#: field:stock.picking,backorder:0
msgid "Backorder"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_packing_list
msgid "Packing Lists"
msgstr ""
#. module: stock_back_order
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_internal_back_orders_list
#: model:ir.ui.menu,name:stock_back_order.menu_report_inventory_orders_list
msgid "Back Orders"
msgstr ""
#. module: stock_back_order
#: model:ir.actions.act_window,name:stock_back_order.action_report_stock_out_picking_back_order_tree
msgid "Back Orders (sending goods)"
msgstr ""

View File

@ -1,81 +0,0 @@
<?xml version="1.0"?>
<terp>
<data>
#--------------------------------------
# picking form view
#--------------------------------------
<record model="ir.ui.view" id="view_picking_form_inherited">
<field name="name">stock.picking.form.inherit</field>
<field name="model">stock.picking</field>
<field name="type">form</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="back_order_id" />
</field>
</field>
</record>
<record model="ir.ui.view" id="view_picking_tree_inherited">
<field name="name">stock.picking.tree.inherit</field>
<field name="model">stock.picking</field>
<field name="type">tree</field>
<field name="inherit_id" ref="stock.vpicktree"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="back_order_id" />
</field>
</field>
</record>
#--------------------------------------
# report back order
#--------------------------------------
<record model="ir.actions.act_window" id="action_report_stock_out_picking_back_order_tree">
<field name="name">Back Orders (sending goods)</field>
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('state','&lt;&gt;','done'),('type','=','out'),('backorder','=',True)]</field>
</record>
<menuitem name="Inventory Control" id="menu_report_inventory_control"/>
<menuitem name="Packing Lists" id="menu_report_inventory_packing_list" parent="menu_report_inventory_control"/>
<menuitem name="Sending Goods" id="menu_report_inventory_goods_list" parent="menu_report_inventory_packing_list"/>
<menuitem name="Back Orders" id="menu_report_inventory_orders_list" parent="menu_report_inventory_goods_list" action="action_report_stock_out_picking_back_order_tree"/>
<record model="ir.actions.act_window" id="action_report_stock_in_picking_back_order_tree">
<field name="name">Back Orders (getting goods)</field>
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('state','&lt;&gt;','done'),('type','=','in'),('backorder','=',True)]</field>
</record>
<menuitem name="Getting Goods" id="menu_report_inventory_getting_goods_list" parent="menu_report_inventory_packing_list"/>
<menuitem name="Back Orders" id="menu_report_inventory_back_orders_list" parent="menu_report_inventory_getting_goods_list" action="action_report_stock_in_picking_back_order_tree"/>
<record model="ir.actions.act_window" id="action_report_stock_internal_picking_back_order_tree">
<field name="name">Back Orders (internal goods)</field>
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('state','&lt;&gt;','done'),('type','=','internal'),('backorder','=',True)]</field>
</record>
<menuitem name="Internal" id="menu_report_inventory_internal_list" parent="menu_report_inventory_packing_list"/>
<menuitem name="Back Orders" id="menu_report_inventory_internal_back_orders_list" parent="menu_report_inventory_internal_list" action="action_report_stock_internal_picking_back_order_tree"/>
</data>
</terp>

View File

@ -1,6 +0,0 @@
<?xml version="1.0"?>
<terp>
<data>
<wizard string="Partial picking" multi="True" model="stock.picking" name="stock.back_order.partial_picking" id="stock.partial_picking" />
</data>
</terp>

View File

@ -1,31 +0,0 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
# Fabien Pinckaers <fp@tiny.Be>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import wizard_partial_picking
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,210 +0,0 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2005-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
#
# $Id: wizard_partial_picking.py 6118 2007-04-25 16:08:50Z ced $
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import time
import netsvc
from tools.misc import UpdateableStr
import pooler
import wizard
from osv import osv
from osv.osv import except_osv
_moves_arch = UpdateableStr()
_moves_fields = {}
_moves_arch_end = '''<?xml version="1.0"?><form string="Picking Result"><label string="The picking has been successfully made !" colspan="4" /></form>'''
_moves_fields_end = {}
def make_default(val):
def fct(uid, data, state):
return val
return fct
def _get_moves(self, cr, uid, data, context):
pick_obj = pooler.get_pool(cr.dbname).get('stock.picking')
pick = pick_obj.browse(cr, uid, [data['id']])[0]
res = {}
_moves_fields.clear()
_moves_arch_lst = ['<?xml version="1.0"?>', '<form string="Make picking">']
for m in pick.move_lines:
quantity = m.product_qty
if m.state<>'assigned':
quantity = 0
_moves_arch_lst.append('<field name="move%s" />' % (m.id,))
_moves_fields['move%s' % m.id] = {'string' : '%s - %s' % (m.product_id.code, m.product_id.name), 'type' : 'float', 'required' : True, 'default' : make_default(quantity)}
if (pick.type == 'in') and (m.product_id.cost_method == 'average'):
price=0
if hasattr(m, 'purchase_line_id') and m.purchase_line_id:
price=m.purchase_line_id.price_unit
currency=0
if hasattr(pick, 'purchase_id') and pick.purchase_id:
currency=pick.purchase_id.pricelist_id.currency_id.id
_moves_arch_lst.append('<group><field name="price%s"/>' % (m.id,))
_moves_fields['price%s' % m.id] = {'string': 'Unit Price', 'type': 'float', 'required': True, 'default': make_default(price)}
_moves_arch_lst.append('<field name="currency%d"/></group>' % (m.id,))
_moves_fields['currency%s' % m.id] = {'string': 'Currency', 'type': 'many2one', 'relation': 'res.currency', 'required': True, 'default': make_default(currency)}
_moves_arch_lst.append('<newline/>')
res.setdefault('moves', []).append(m.id)
_moves_arch_lst.append('</form>')
_moves_arch.string = '\n'.join(_moves_arch_lst)
return res
def _do_print(self, cr, uid, data, context):
pick_obj = pooler.get_pool(cr.dbname).get('stock.picking')
pick = pick_obj.browse(cr, uid, [data['id']])[0]
if pick.type=='out':
return 'print'
return 'end'
def _do_split(self, cr, uid, data, context):
move_obj = pooler.get_pool(cr.dbname).get('stock.move')
pick_obj = pooler.get_pool(cr.dbname).get('stock.picking')
pick = pick_obj.browse(cr, uid, [data['id']])[0]
new_picking = None
new_moves = []
complete, too_many, too_few = [], [], []
for move in move_obj.browse(cr, uid, data['form'].get('moves',[])):
if move.product_qty == data['form']['move%s' % move.id]:
complete.append(move)
elif move.product_qty > data['form']['move%s' % move.id]:
too_few.append(move)
else:
too_many.append(move)
#
# Average price computation
#
if (pick.type == 'in') and (move.product_id.cost_method == 'average'):
product_obj = pooler.get_pool(cr.dbname).get('product.product')
currency_obj = pooler.get_pool(cr.dbname).get('res.currency')
users_obj = pooler.get_pool(cr.dbname).get('res.users')
product = product_obj.browse(cr, uid, [move.product_id.id])[0]
user = users_obj.browse(cr, uid, [uid])[0]
qty = data['form']['move%s' % move.id]
price = data['form']['price%s' % move.id]
currency = data['form']['currency%s' % move.id]
if qty > 0:
new_price = currency_obj.compute(cr, uid, currency, user.company_id.currency_id.id, price)
new_std_price = ((product.standard_price * product.qty_available) + (new_price * qty))/(product.qty_available + qty)
product_obj.write(cr, uid, [product.id], {'standard_price': new_std_price})
for move in too_few:
if not new_picking:
new_picking = pick_obj.copy(cr, uid, pick.id, {'backorder':True,'name' : '%s (splitted)' % pick.name, 'move_lines' : [],'back_order_id':data['id'], 'state':'draft'})
pick.write(cr, uid, [pick.id], {'back_order_id' : new_picking})
new_obj = move_obj.copy(cr, uid, move.id, {'product_qty' : move.product_qty - data['form']['move%s' % move.id], 'product_uos_qty':move.product_qty - data['form']['move%s' % move.id], 'picking_id' : new_picking, 'state': 'assigned', 'move_dest_id': False})
move_obj.write(cr, uid, [move.id], {'product_qty' : data['form']['move%s' % move.id], 'product_uos_qty':data['form']['move%s' % move.id]})
if new_picking:
move_obj.write(cr, uid, [c.id for c in complete], {'picking_id': pick.id})
for move in too_many:
move_obj.write(cr, uid, [move.id], {'product_qty' : data['form']['move%s' % move.id],'product_uos_qty':data['form']['move%s' % move.id] , 'picking_id': pick.id})
else:
for move in too_many:
move_obj.write(cr, uid, [move.id], {'product_qty' : data['form']['move%s' % move.id],'product_uos_qty':data['form']['move%s' % move.id]})
# At first we confirm the new picking (if necessary)
wf_service = netsvc.LocalService("workflow")
if new_picking:
wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_confirm', cr)
# Then we finish the good picking
try:
if new_picking:
pick_obj.action_move(cr, uid, [pick.id])
wf_service.trg_validate(uid, 'stock.picking',pick.id , 'button_done', cr)
wf_service.trg_write(uid, 'stock.picking', new_picking, cr)
else:
pick_obj.action_move(cr, uid, [pick.id])
wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_done', cr)
except except_osv, e:
raise wizard.except_wizard(e.name, e.value)
return {}
# for move in too_few:
# if not new_picking:
# new_picking = pick_obj.copy(cr, uid, pick.id, {'name' : '%s (splitted)' % pick.name, 'move_lines' : [],'back_order_id':data['id'], 'state':'draft'})
# pick.write(cr, uid, [pick.id], {'backorder':True,'back_order_id' : new_picking})
# new_obj = move_obj.copy(cr, uid, move.id, {'product_qty' : data['form']['move%s' % move.id], 'product_uos_qty':data['form']['move%s' % move.id], 'picking_id' : new_picking, 'state': 'assigned', 'move_dest_id': False})
# move_obj.write(cr, uid, [move.id], {'product_qty' : move.product_qty - data['form']['move%s' % move.id], 'product_uos_qty':move.product_qty - data['form']['move%s' % move.id]})
#
# if new_picking:
# move_obj.write(cr, uid, [c.id for c in complete], {'picking_id': new_picking})
# for move in too_many:
# move_obj.write(cr, uid, [move.id], {'product_qty' : data['form']['move%s' % move.id],'product_uos_qty':data['form']['move%s' % move.id] , 'picking_id': new_picking})
# else:
# for move in too_many:
# move_obj.write(cr, uid, [move.id], {'product_qty' : data['form']['move%s' % move.id],'product_uos_qty':data['form']['move%s' % move.id]})
#
# # At first we confirm the new picking (if necessary)
# wf_service = netsvc.LocalService("workflow")
# if new_picking:
# wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_confirm', cr)
# # Then we finish the good picking
# try:
# if new_picking:
# pick_obj.action_move(cr, uid, [new_picking])
# wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_done', cr)
# wf_service.trg_write(uid, 'stock.picking', pick.id, cr)
# else:
# pick_obj.action_move(cr, uid, [pick.id])
# wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_done', cr)
# except except_osv, e:
# raise wizard.except_wizard(e.name, e.value)
#service = netsvc.LocalService("wizard.stock.picking.delivery.report")
#res = service.execute(cr.dbname, uid,{'id': new_picking})
#return {}
class partial_picking(wizard.interface):
states = {
'init' : {
'actions' : [ _get_moves ],
'result' : { 'type' : 'form', 'arch' : _moves_arch, 'fields' : _moves_fields, 'state' : (('end', 'Cancel'),('split', 'Make Picking') )},
},
'split': {
'actions': [_do_split],
'result': {'type': 'state', 'state': 'end'},
},
}
partial_picking('stock.back_order.partial_picking')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: