[MERGE] branch merged with lp:~openerp-dev/openobject-addons/trunk-dev-addons1
bzr revid: mso@mso-20100512051103-0wqt75ymx33qy2x6
This commit is contained in:
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-04-26 07:46+0000\n"
|
||||
"PO-Revision-Date: 2010-05-10 08:37+0000\n"
|
||||
"Last-Translator: eLBati - albatos.com <lorenzo.battistini@albatos.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-28 03:44+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-11 04:18+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
@@ -1192,7 +1192,7 @@ msgstr "Report tassa"
|
||||
#: wizard_button:account.analytic.account.chart,init,open:0
|
||||
#: wizard_button:account.chart,init,open:0
|
||||
msgid "Open Charts"
|
||||
msgstr "Apri"
|
||||
msgstr "Apri conti"
|
||||
|
||||
#. module: account
|
||||
#: wizard_view:account.fiscalyear.close.state,init:0
|
||||
@@ -4162,7 +4162,7 @@ msgstr "Fattura"
|
||||
#: wizard_button:account.open_closed_fiscalyear,init,open:0
|
||||
#: wizard_button:account_use_models,create,open_move:0
|
||||
msgid "Open"
|
||||
msgstr "Apri"
|
||||
msgstr "Aperto"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.next_id_29
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-17 09:28+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-05-11 10:20+0000\n"
|
||||
"Last-Translator: Simon Vidmar <Unknown>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:12+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-12 04:20+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_payment
|
||||
@@ -46,7 +46,7 @@ msgstr "Napačno ime modela v definiciji dejanja."
|
||||
#: field:payment.line,info_owner:0
|
||||
#: view:payment.order:0
|
||||
msgid "Owner Account"
|
||||
msgstr ""
|
||||
msgstr "Konto lastnika"
|
||||
|
||||
#. module: account_payment
|
||||
#: help:account.invoice,amount_to_pay:0
|
||||
@@ -54,6 +54,8 @@ msgid ""
|
||||
"The amount which should be paid at the current date\n"
|
||||
"minus the amount which is already in payment order"
|
||||
msgstr ""
|
||||
"Znesek, ki ga je potrebno plačati na trenutni datum\n"
|
||||
"zmanjšan za znesek že posredovanih plačilnih nalogov."
|
||||
|
||||
#. module: account_payment
|
||||
#: help:payment.line,date:0
|
||||
@@ -61,6 +63,8 @@ msgid ""
|
||||
"If no payment date is specified, the bank will treat this payment line "
|
||||
"directly"
|
||||
msgstr ""
|
||||
"Če datum plačilnega naloga ni podan, ga bo banka takoj posredovala v "
|
||||
"plačilni sistem"
|
||||
|
||||
#. module: account_payment
|
||||
#: field:payment.order,date_prefered:0
|
||||
@@ -147,7 +151,7 @@ msgstr "Vrstica plačila"
|
||||
#. module: account_payment
|
||||
#: field:payment.type,suitable_bank_types:0
|
||||
msgid "Suitable bank types"
|
||||
msgstr ""
|
||||
msgstr "Primerne vrste bank"
|
||||
|
||||
#. module: account_payment
|
||||
#: view:payment.line:0
|
||||
@@ -182,7 +186,7 @@ msgstr ""
|
||||
#. module: account_payment
|
||||
#: field:payment.order,state:0
|
||||
msgid "State"
|
||||
msgstr ""
|
||||
msgstr "Država"
|
||||
|
||||
#. module: account_payment
|
||||
#: view:payment.line:0
|
||||
|
||||
+27
-16
@@ -24,6 +24,11 @@ from osv import osv
|
||||
from osv import fields
|
||||
import string
|
||||
from tools.func import partial
|
||||
from tools.translate import _
|
||||
|
||||
_ref_vat = {
|
||||
'be': 'BE0477472701',
|
||||
}
|
||||
|
||||
def mult_add(i, j):
|
||||
"""Sum each digits of the multiplication of i and j."""
|
||||
@@ -32,6 +37,10 @@ def mult_add(i, j):
|
||||
class res_partner(osv.osv):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
def _split_vat(self, vat):
|
||||
vat_country, vat_number = vat[:2].lower(), vat[2:].replace(' ', '')
|
||||
return vat_country, vat_number
|
||||
|
||||
def check_vat(self, cr, uid, ids):
|
||||
'''
|
||||
Check the VAT number depending of the country.
|
||||
@@ -39,35 +48,37 @@ class res_partner(osv.osv):
|
||||
'''
|
||||
for partner in self.browse(cr, uid, ids):
|
||||
if not partner.vat:
|
||||
continue #FIXME return False? empty vat numbre is invalid?
|
||||
continue
|
||||
|
||||
vat_country, vat_number = partner.vat[:2].lower(), partner.vat[2:].replace(' ', '')
|
||||
vat_country, vat_number = self._split_vat(partner.vat)
|
||||
if not hasattr(self, 'check_vat_' + vat_country):
|
||||
return False
|
||||
check = getattr(self, 'check_vat_' + vat_country)
|
||||
if not check(vat_number):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def __getattr__(self, attr):
|
||||
if not attr.startswith('check_vat_'):
|
||||
super(res_partner, self).__getattr__(attr)
|
||||
|
||||
def default_vat_check(self, cn, vn):
|
||||
# by default, a VAT number is valid if:
|
||||
# it starts with 2 letters
|
||||
# has more than 3 characters
|
||||
return len(vn) > 0 and len(cn) == 2 and cn[0] in string.ascii_lowercase and cn[1] in string.ascii_lowercase
|
||||
|
||||
return partial(default_vat_check, self, attr[10:])
|
||||
|
||||
|
||||
def vat_change(self, cr, uid, ids, value, context={}):
|
||||
return {'value': {'vat_subjected': bool(value)}}
|
||||
|
||||
_columns = {
|
||||
'vat_subjected': fields.boolean('VAT Legal Statement', help="Check this box if the partner is subjected to the VAT. It will be used for the VAT legal statement.")
|
||||
}
|
||||
_constraints = [(check_vat, "The VAT doesn't seem to be correct.", ["vat"])]
|
||||
|
||||
def _construct_constraint_msg(self, cr, uid, ids):
|
||||
def default_vat_check(cn, vn):
|
||||
# by default, a VAT number is valid if:
|
||||
# it starts with 2 letters
|
||||
# has more than 3 characters
|
||||
return cn[0] in string.ascii_lowercase and cn[1] in string.ascii_lowercase
|
||||
|
||||
vat_country, vat_number = self._split_vat(self.browse(cr, uid, ids)[0].vat)
|
||||
if default_vat_check(vat_country, vat_number):
|
||||
return _('The Vat does not seems to be correct. You should have entered something like this %s'), (_ref_vat[vat_country])
|
||||
return _('The VAT is invalid, it shoul begin with the country code'), ()
|
||||
|
||||
_constraints = [(check_vat, _construct_constraint_msg, ["vat"])]
|
||||
|
||||
# code from the following methods come from Tryton (B2CK)
|
||||
# http://www.tryton.org/hgwebdir.cgi/modules/relationship/file/544d1de586d9/party.py
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<child1>
|
||||
<action colspan="4" height="200" name="%(mrp.mrp_production_action2)d" string="Next production orders" width="510"/>
|
||||
<action colspan="4" name="%(stock.action_picking_all)d" string="Deliveries (Out picking)" domain="[('state','=','assigned'),('type','=','out')]"/>
|
||||
<action colspan="4" name="%(mrp.mrp_procurement_action4)d" string="Procurements in Exception"/>
|
||||
<action colspan="4" name="%(mrp_procurement.mrp_procurement_action4)d" string="Procurements in Exception"/>
|
||||
</child1>
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<form string="Warehouse board">
|
||||
<hpaned position="100">
|
||||
<child1>
|
||||
<action colspan="4" name="%(mrp.mrp_procurement_action5)d" string="Procurement Exceptions" width="510" />
|
||||
<action colspan="4" name="%(mrp_procurement.mrp_procurement_action5)d" string="Procurement Exceptions" width="510" />
|
||||
<action colspan="4" name="%(action_reception_picking_move_board)d" string="Products To Receive" />
|
||||
</child1>
|
||||
|
||||
|
||||
+2
-3
@@ -315,8 +315,7 @@ class crm_case(osv.osv):
|
||||
_columns = {
|
||||
'id': fields.integer('ID', readonly=True),
|
||||
'name': fields.char('Description', size=1024, required=True),
|
||||
'active': fields.boolean('Active', help="If the active field is set to\
|
||||
true, it will allow you to hide the case without removing it."),
|
||||
'active': fields.boolean('Active', help="If the active field is set to false, it will allow you to hide the case without removing it."),
|
||||
'description': fields.text('Description'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
|
||||
select=True, help='Sales team to which Case belongs to.\
|
||||
@@ -774,7 +773,7 @@ class crm_case_history(osv.osv):
|
||||
"""
|
||||
res = {}
|
||||
for hist in self.browse(cursor, user, ids, context or {}):
|
||||
res[hist.id] = (hist.email or '/') + ' (' + str(hist.date) + ')\n'
|
||||
res[hist.id] = (hist.email_from or '/') + ' (' + str(hist.date) + ')\n'
|
||||
res[hist.id] += (hist.description or '')
|
||||
return res
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ class crm_lead(osv.osv):
|
||||
'type_id': fields.many2one('crm.case.resource.type', 'Lead Type', \
|
||||
domain="[('section_id','=',section_id),\
|
||||
('object_id.model', '=', 'crm.lead')]"),
|
||||
'partner_name': fields.char("Contact Name", size=64),
|
||||
'partner_name': fields.char("Company Name", size=64),
|
||||
|
||||
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
|
||||
'date_closed': fields.datetime('Closed', readonly=True),
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
<page string="Lead">
|
||||
<group colspan="2" col="4">
|
||||
<separator string="Contact" colspan="4" col="4"/>
|
||||
<field name="partner_name" string="Contact Name" colspan="4"/>
|
||||
<field name="partner_name" colspan="4"/>
|
||||
<newline/>
|
||||
<field domain="[('domain', '=', 'contact')]" name="title"/>
|
||||
<field name="function_name" />
|
||||
@@ -141,8 +141,8 @@
|
||||
<separator string="Dates" colspan="2" col="2"/>
|
||||
<field name="create_date"/>
|
||||
<field name="write_date"/>
|
||||
<field name="date_closed"/>
|
||||
<field name="date_open"/>
|
||||
<field name="date_closed"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="Statistics" colspan="2" col="2"/>
|
||||
|
||||
@@ -168,13 +168,14 @@ class email_parser(object):
|
||||
|
||||
def _decode_header(self, s):
|
||||
from email.Header import decode_header
|
||||
s = decode_header(s)
|
||||
s = decode_header(s.replace('\r', ''))
|
||||
return ''.join(map(lambda x:self._to_decode(x[0], [x[1]]), s or []))
|
||||
|
||||
def msg_new(self, msg):
|
||||
message = self.msg_body_get(msg)
|
||||
msg_subject = self._decode_header(msg['Subject'])
|
||||
msg_from = self._decode_header(msg['From'])
|
||||
msg_to = self._decode_header(msg['To'])
|
||||
msg_cc = self._decode_header(msg['Cc'] or '')
|
||||
|
||||
data = {
|
||||
@@ -189,7 +190,7 @@ class email_parser(object):
|
||||
|
||||
try:
|
||||
id = self.rpc(self.model, 'create', data)
|
||||
self.rpc(self.model, 'history', [id], 'Receive', True, msg['From'], message['body'], False, False, {'model' : self.model})
|
||||
self.rpc(self.model, 'history', [id], 'Receive', True, msg_to, message['body'], msg_from, False, {'model' : self.model})
|
||||
#self.rpc(self.model, 'case_open', [id])
|
||||
except Exception, e:
|
||||
if getattr(e, 'faultCode', '') and 'AccessError' in e.faultCode:
|
||||
@@ -314,7 +315,7 @@ class email_parser(object):
|
||||
'res_id': id
|
||||
}
|
||||
self.rpc('ir.attachment', 'create', data_attach)
|
||||
self.rpc(self.model, 'history', [id], 'Send', True, msg['From'], body['body'])
|
||||
self.rpc(self.model, 'history', [id], 'Send', True, self._decode_header(msg['From']), body['body'])
|
||||
return id
|
||||
|
||||
def msg_send(self, msg, emails, priority=None):
|
||||
@@ -357,7 +358,7 @@ class email_parser(object):
|
||||
'res_id': id
|
||||
}
|
||||
self.rpc('ir.attachment', 'create', data_attach)
|
||||
self.rpc(self.model, 'history', [id], 'Send', True, msg['From'], message['body'])
|
||||
self.rpc(self.model, 'history', [id], 'Send', True, self._decode_header(msg['From']), message['body'])
|
||||
return id
|
||||
|
||||
def msg_test(self, msg, case_str):
|
||||
|
||||
@@ -26,6 +26,24 @@ import base64
|
||||
import tools
|
||||
from crm import crm
|
||||
|
||||
class crm_send_new_email(osv.osv_memory):
|
||||
""" Sends new email for the case"""
|
||||
_name = "crm.send.mail"
|
||||
|
||||
crm_send_new_email()
|
||||
|
||||
class crm_send_new_email_attachment(osv.osv_memory):
|
||||
_name = 'crm.send.mail.attachment'
|
||||
|
||||
_columns = {
|
||||
'binary' : fields.binary('Attachment', required=True),
|
||||
'name' : fields.char('Name', size=128, required=True),
|
||||
|
||||
'wizard_id' : fields.many2one('crm.send.mail', 'Wizard', required=True),
|
||||
}
|
||||
|
||||
crm_send_new_email_attachment()
|
||||
|
||||
class crm_send_new_email(osv.osv_memory):
|
||||
""" Sends new email for the case"""
|
||||
_name = "crm.send.mail"
|
||||
@@ -38,12 +56,8 @@ class crm_send_new_email(osv.osv_memory):
|
||||
'subject': fields.char('Subject', size=128, required=True),
|
||||
'text': fields.text('Message', required=True),
|
||||
'state': fields.selection(crm.AVAILABLE_STATES, string='Set New State To', required=True),
|
||||
'doc1': fields.binary("Attachment1"),
|
||||
'doc1_fname': fields.char("File Name", size=64),
|
||||
'doc2': fields.binary("Attachment2"),
|
||||
'doc2_fname': fields.char("File Name", size=64),
|
||||
'doc3': fields.binary("Attachment3"),
|
||||
'doc3_fname': fields.char("File Name", size=64),
|
||||
|
||||
'attachment_ids' : fields.one2many('crm.send.mail.attachment', 'wizard_id'),
|
||||
}
|
||||
|
||||
def action_cancel(self, cr, uid, ids, context=None):
|
||||
@@ -68,12 +82,13 @@ class crm_send_new_email(osv.osv_memory):
|
||||
case_pool = self.pool.get(model)
|
||||
res_id = context and context.get('active_id', False) or False
|
||||
|
||||
for data in self.read(cr, uid, ids, context=context):
|
||||
attach = filter(lambda x: x, [data['doc1'], data['doc2'], data['doc3']])
|
||||
attach = map(lambda x: (data['doc' + str(attach.index(x) + 1) \
|
||||
+ '_fname'], base64.decodestring(x)), attach)
|
||||
message_id = None
|
||||
|
||||
for obj in self.browse(cr, uid, ids, context=context):
|
||||
attach = [
|
||||
(x.name, base64.decodestring(x.binary)) for x in obj.attachment_ids
|
||||
]
|
||||
|
||||
message_id = None
|
||||
|
||||
case = case_pool.browse(cr, uid, res_id)
|
||||
if context.get('mail', 'new') == 'new':
|
||||
if len(case.history_line):
|
||||
@@ -84,17 +99,18 @@ class crm_send_new_email(osv.osv_memory):
|
||||
model = hist.log_id.model_id.model
|
||||
model_pool = self.pool.get(model)
|
||||
case = model_pool.browse(cr, uid, hist.log_id.res_id)
|
||||
emails = [data['email_to']] + (data['email_cc'] or '').split(',')
|
||||
emails = [obj.email_to] + (obj.email_cc or '').split(',')
|
||||
emails = filter(None, emails)
|
||||
body = data['text']
|
||||
body = obj.text
|
||||
|
||||
body = case_pool.format_body(body)
|
||||
email_from = data.get('email_from', False)
|
||||
case_pool._history(cr, uid, [case], _('Send'), history=True, email=data['email_to'], details=body, email_from=email_from, message_id=message_id)
|
||||
email_from = getattr(obj, 'email_from', False)
|
||||
case_pool._history(cr, uid, [case], _('Send'), history=True, email=obj.email_to, details=body, email_from=email_from, message_id=message_id)
|
||||
|
||||
x_headers = {
|
||||
'Reply-To':"%s" % case.section_id.reply_to,
|
||||
}
|
||||
x_headers = dict()
|
||||
#x_headers = {
|
||||
# 'Reply-To':"%s" % case.section_id.reply_to,
|
||||
#}
|
||||
if message_id:
|
||||
x_headers['References'] = "%s" % (message_id)
|
||||
|
||||
@@ -105,7 +121,7 @@ class crm_send_new_email(osv.osv_memory):
|
||||
uid=uid,
|
||||
server_id=case.section_id.server_id.id,
|
||||
emailto=emails,
|
||||
subject=data['subject'],
|
||||
subject=obj.subject,
|
||||
body="<pre>%s</pre>" % body,
|
||||
attachments=attach,
|
||||
headers=x_headers
|
||||
@@ -114,7 +130,7 @@ class crm_send_new_email(osv.osv_memory):
|
||||
flag = tools.email_send(
|
||||
email_from,
|
||||
emails,
|
||||
data['subject'],
|
||||
obj.subject,
|
||||
body,
|
||||
attach=attach,
|
||||
reply_to=case.section_id.reply_to,
|
||||
@@ -123,14 +139,14 @@ class crm_send_new_email(osv.osv_memory):
|
||||
)
|
||||
|
||||
if flag:
|
||||
if data['state'] == 'unchanged':
|
||||
if obj.state == 'unchanged':
|
||||
pass
|
||||
elif data['state'] == 'done':
|
||||
elif obj.state == 'done':
|
||||
case_pool.case_close(cr, uid, [case.id])
|
||||
elif data['state'] == 'draft':
|
||||
elif obj.state == 'draft':
|
||||
case_pool.case_reset(cr, uid, [case.id])
|
||||
elif data['state'] in ['cancel', 'open', 'pending']:
|
||||
act = 'case_' + data['state']
|
||||
elif obj.state in ['cancel', 'open', 'pending']:
|
||||
act = 'case_' + obj.state
|
||||
getattr(case_pool, act)(cr, uid, [case.id])
|
||||
cr.commit()
|
||||
|
||||
@@ -186,6 +202,11 @@ class crm_send_new_email(osv.osv_memory):
|
||||
res = {}
|
||||
for hist in hist_obj.browse(cr, uid, res_ids):
|
||||
model = hist.log_id.model_id.model
|
||||
|
||||
# In the case where the crm.case does not exist in the database
|
||||
if not model:
|
||||
return {}
|
||||
|
||||
model_pool = self.pool.get(model)
|
||||
case = model_pool.browse(cr, uid, hist.log_id.res_id)
|
||||
if 'email_to' in fields:
|
||||
@@ -201,7 +222,12 @@ class crm_send_new_email(osv.osv_memory):
|
||||
to = 'To: %s' % (hist.email_to or '')
|
||||
sentdate = 'Date: %s' % (hist.date)
|
||||
desc = '\n%s'%(hist.description)
|
||||
original = [header, sender, to, sentdate, desc]
|
||||
|
||||
signature = ''
|
||||
if case.user_id.signature:
|
||||
signature = '--\n' + case.user_id.signature
|
||||
|
||||
original = [header, sender, to, sentdate, desc, signature]
|
||||
original = '\n'.join(original)
|
||||
res['text']=original
|
||||
if 'subject' in fields:
|
||||
|
||||
@@ -19,12 +19,15 @@
|
||||
<field name="text" nolabel="1" colspan="4"/>
|
||||
</page>
|
||||
<page string="Attachments">
|
||||
<field name="doc1" filename="doc1_fname"/>
|
||||
<field name="doc1_fname" invisible="1" />
|
||||
<field name="doc2" filename="doc2_fname" />
|
||||
<field name="doc2_fname" invisible="1" />
|
||||
<field name="doc3" filename="doc3_fname" />
|
||||
<field name="doc3_fname" invisible="1" />
|
||||
<field name="attachment_ids" colspan="4" nolabel="1">
|
||||
<form string="Attachment">
|
||||
<field name="binary" filename="name" />
|
||||
<field name="name" />
|
||||
</form>
|
||||
<tree string="Attachments">
|
||||
<field name="name" />
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group colspan="2" col="4" >
|
||||
@@ -60,9 +63,15 @@
|
||||
<field name="email_to" />
|
||||
<field name="email_cc" />
|
||||
<field name="subject" />
|
||||
<field name="doc1" />
|
||||
<field name="doc2" />
|
||||
<field name="doc3" />
|
||||
<field name="attachment_ids" colspan="4" nolabel="1">
|
||||
<form string="Attachment">
|
||||
<field name="binary" filename="name" />
|
||||
<field name="name" />
|
||||
</form>
|
||||
<tree string="Attachments">
|
||||
<field name="name" />
|
||||
</tree>
|
||||
</field>
|
||||
<separator string="" colspan="4"/>
|
||||
<field name="text" nolabel="1" colspan="4"/>
|
||||
<separator string=" " colspan="4"/>
|
||||
|
||||
+21
-21
@@ -7,25 +7,25 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-09 13:36+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-05-10 10:27+0000\n"
|
||||
"Last-Translator: lyyser <logard.1961@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:00+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-11 04:18+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: event
|
||||
#: field:event.event,date_end:0
|
||||
#: field:report.event.registration,date_end:0
|
||||
msgid "Ending date"
|
||||
msgstr ""
|
||||
msgstr "Lõpu kuupäev"
|
||||
|
||||
#. module: event
|
||||
#: field:event.event,register_min:0
|
||||
msgid "Minimum Registrations"
|
||||
msgstr ""
|
||||
msgstr "Miinimum registreerimised"
|
||||
|
||||
#. module: event
|
||||
#: constraint:ir.actions.act_window:0
|
||||
@@ -35,17 +35,17 @@ msgstr "Vigane mudeli nimi toimingu definitsioonis."
|
||||
#. module: event
|
||||
#: field:event.event,mail_registr:0
|
||||
msgid "Registration Email"
|
||||
msgstr ""
|
||||
msgstr "Registreerimise Email"
|
||||
|
||||
#. module: event
|
||||
#: model:crm.case.section,name:event.event_0_crm_case_section
|
||||
msgid "Concert of Bon Jovi"
|
||||
msgstr ""
|
||||
msgstr "Bon Jovi kontsert"
|
||||
|
||||
#. module: event
|
||||
#: field:event.event,mail_confirm:0
|
||||
msgid "Confirmation Email"
|
||||
msgstr ""
|
||||
msgstr "Kinnitus Email"
|
||||
|
||||
#. module: event
|
||||
#: constraint:crm.case.section:0
|
||||
@@ -55,7 +55,7 @@ msgstr "Viga! Sa ei saa luua rekursiivseid sektsioone."
|
||||
#. module: event
|
||||
#: model:ir.model,name:event.model_event_registration
|
||||
msgid "Event Registration"
|
||||
msgstr ""
|
||||
msgstr "Sündmuse registreerimine"
|
||||
|
||||
#. module: event
|
||||
#: model:ir.actions.wizard,name:event.event_reg_invoice
|
||||
@@ -65,52 +65,52 @@ msgstr ""
|
||||
#. module: event
|
||||
#: field:report.event.type.registration,draft_state:0
|
||||
msgid "Draft Registrations"
|
||||
msgstr ""
|
||||
msgstr "Registreerimiste mustand"
|
||||
|
||||
#. module: event
|
||||
#: view:report.event.registration:0
|
||||
msgid "Event on Registration"
|
||||
msgstr ""
|
||||
msgstr "Registreerimise sündmus"
|
||||
|
||||
#. module: event
|
||||
#: wizard_button:event.reg_make_invoice,init,end:0
|
||||
msgid "Ok"
|
||||
msgstr ""
|
||||
msgstr "Ok"
|
||||
|
||||
#. module: event
|
||||
#: field:event.event,mail_auto_confirm:0
|
||||
msgid "Mail Auto Confirm"
|
||||
msgstr ""
|
||||
msgstr "Autokinnituse meil"
|
||||
|
||||
#. module: event
|
||||
#: model:product.template,name:event.event_product_1_product_template
|
||||
msgid "Ticket for Opera"
|
||||
msgstr ""
|
||||
msgstr "Ooperi pilet"
|
||||
|
||||
#. module: event
|
||||
#: wizard_field:event.reg_make_invoice,init,inv_rejected:0
|
||||
msgid "Invoice Rejected"
|
||||
msgstr ""
|
||||
msgstr "Arve väljapraagitud"
|
||||
|
||||
#. module: event
|
||||
#: view:event.event:0
|
||||
msgid "Confirm Event"
|
||||
msgstr ""
|
||||
msgstr "Kinnita sündmus"
|
||||
|
||||
#. module: event
|
||||
#: model:crm.case.section,name:event.event_1_crm_case_section
|
||||
msgid "Opera of Verdi"
|
||||
msgstr ""
|
||||
msgstr "Verdi ooper"
|
||||
|
||||
#. module: event
|
||||
#: field:report.event.registration,draft_state:0
|
||||
msgid "Draft Registration"
|
||||
msgstr ""
|
||||
msgstr "Registreerimise mustand"
|
||||
|
||||
#. module: event
|
||||
#: wizard_view:event.reg_make_invoice,init:0
|
||||
msgid "Create Invoices"
|
||||
msgstr ""
|
||||
msgstr "Loo arved"
|
||||
|
||||
#. module: event
|
||||
#: model:ir.module.module,description:event.module_meta_information
|
||||
@@ -134,12 +134,12 @@ msgstr ""
|
||||
#. module: event
|
||||
#: view:event.registration:0
|
||||
msgid "Extra Info"
|
||||
msgstr ""
|
||||
msgstr "Täiendav info"
|
||||
|
||||
#. module: event
|
||||
#: view:event.registration:0
|
||||
msgid "Registration"
|
||||
msgstr ""
|
||||
msgstr "Registreerimine"
|
||||
|
||||
#. module: event
|
||||
#: field:event.type,name:0
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-02-14 21:34+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-05-10 13:18+0000\n"
|
||||
"Last-Translator: Angel Spy <melissadilara@yahoo.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:16+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-11 04:19+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: hr
|
||||
@@ -62,7 +62,7 @@ msgstr ""
|
||||
#. module: hr
|
||||
#: view:hr.department:0
|
||||
msgid "Department"
|
||||
msgstr ""
|
||||
msgstr "Bölüm"
|
||||
|
||||
#. module: hr
|
||||
#: model:process.transition,name:hr.process_transition_contactofemployee0
|
||||
@@ -340,7 +340,7 @@ msgstr "Firmalar"
|
||||
#. module: hr
|
||||
#: selection:hr.timesheet,dayofweek:0
|
||||
msgid "Wednesday"
|
||||
msgstr "Carsamba"
|
||||
msgstr "Çarşamba"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.open_view_categ_form
|
||||
|
||||
@@ -86,7 +86,7 @@ class hr_contract(osv.osv):
|
||||
'job_id': fields.many2one('hr.job', 'Job Title'),
|
||||
'date_start': fields.date('Start Date', required=True),
|
||||
'date_end': fields.date('End Date'),
|
||||
'working_hours': fields.many2one('resource.calendar','Working hours'),
|
||||
'working_hours': fields.many2one('resource.calendar','Working Schedule'),
|
||||
'wage_type_id': fields.many2one('hr.contract.wage.type', 'Wage Type', required=True),
|
||||
'wage': fields.float('Wage', digits=(16,2), required=True),
|
||||
'advantages': fields.text('Advantages'),
|
||||
@@ -99,4 +99,4 @@ class hr_contract(osv.osv):
|
||||
}
|
||||
hr_contract()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-03-24 10:38+0000\n"
|
||||
"Last-Translator: Drazen Bosak <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-05-10 06:56+0000\n"
|
||||
"Last-Translator: nafterburner <nafterburner@gmail.com>\n"
|
||||
"Language-Team: Vinteh\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:10+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-11 04:19+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
"Language: hr\n"
|
||||
|
||||
@@ -336,7 +336,7 @@ msgstr "Kreator"
|
||||
#. module: idea
|
||||
#: model:ir.ui.menu,name:idea.menu_tools
|
||||
msgid "Tools"
|
||||
msgstr "Pomagala"
|
||||
msgstr "Alati"
|
||||
|
||||
#. module: idea
|
||||
#: field:idea.comment,idea_id:0
|
||||
|
||||
@@ -26,5 +26,6 @@ import installer
|
||||
import wizard
|
||||
import report
|
||||
import company
|
||||
import schedulers
|
||||
import mrp_procurement
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"author" : "Tiny",
|
||||
"website" : "http://www.openerp.com",
|
||||
"category" : "Generic Modules/Production",
|
||||
"depends" : ["stock", "resource", "purchase", "product","process"],
|
||||
"depends" : ["mrp_procurement", "stock", "resource", "purchase", "product","process"],
|
||||
"description": """
|
||||
This is the base module to manage the manufacturing process in Open ERP.
|
||||
|
||||
@@ -61,15 +61,11 @@
|
||||
'mrp_workflow.xml',
|
||||
'mrp_data.xml',
|
||||
'wizard/mrp_product_produce_view.xml',
|
||||
'wizard/make_procurement_view.xml',
|
||||
'wizard/mrp_procurement_view.xml',
|
||||
'wizard/change_production_qty_view.xml',
|
||||
'wizard/orderpoint_procurement_view.xml',
|
||||
'wizard/mrp_price_view.xml',
|
||||
'wizard/mrp_workcenter_load_view.xml',
|
||||
# 'wizard/mrp_track_prod_view.xml',
|
||||
'mrp_view.xml',
|
||||
'wizard/schedulers_all_view.xml',
|
||||
'mrp_wizard.xml',
|
||||
'mrp_report.xml',
|
||||
'company_view.xml',
|
||||
@@ -81,6 +77,7 @@
|
||||
'report/mrp_production_order_view.xml',
|
||||
],
|
||||
'demo_xml': ['mrp_demo.xml', 'mrp_order_point.xml'],
|
||||
# 'test': ['test/mrp_phantom_bom.yml','test/mrp_production_order.yml'],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0032052481373',
|
||||
|
||||
@@ -24,22 +24,10 @@ from osv import osv,fields
|
||||
class company(osv.osv):
|
||||
_inherit = 'res.company'
|
||||
_columns = {
|
||||
'schedule_range': fields.float('Scheduler Range', required=True,
|
||||
help="This is the time frame analysed by the scheduler when "\
|
||||
"computing procurements. All procurements 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('Manufacturing Lead Time', required=True,
|
||||
help="Security days for each manufacturing operation."),
|
||||
}
|
||||
_defaults = {
|
||||
'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()
|
||||
|
||||
@@ -9,12 +9,7 @@
|
||||
<field name="inherit_id" ref="base.view_company_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<page string="Configuration" position="inside">
|
||||
<separator string="MRP & Logistic Scheduler" colspan="4"/>
|
||||
<field name="schedule_range"/>
|
||||
<field name="po_lead"/>
|
||||
<field name="security_lead"/>
|
||||
<field name="manufacturing_lead"/>
|
||||
<newline/>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -64,35 +64,6 @@ class mrp_workcenter(osv.osv):
|
||||
mrp_workcenter()
|
||||
|
||||
|
||||
class mrp_property_group(osv.osv):
|
||||
"""
|
||||
Group of mrp properties.
|
||||
"""
|
||||
_name = 'mrp.property.group'
|
||||
_description = 'Property Group'
|
||||
_columns = {
|
||||
'name': fields.char('Property Group', size=64, required=True),
|
||||
'description': fields.text('Description'),
|
||||
}
|
||||
mrp_property_group()
|
||||
|
||||
class mrp_property(osv.osv):
|
||||
"""
|
||||
Properties of mrp.
|
||||
"""
|
||||
_name = 'mrp.property'
|
||||
_description = 'Property'
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True),
|
||||
'composition': fields.selection([('min','min'),('max','max'),('plus','plus')], 'Properties composition', required=True, help="Not used in computations, for information purpose only."),
|
||||
'group_id': fields.many2one('mrp.property.group', 'Property Group', required=True),
|
||||
'description': fields.text('Description'),
|
||||
}
|
||||
_defaults = {
|
||||
'composition': lambda *a: 'min',
|
||||
}
|
||||
mrp_property()
|
||||
|
||||
class mrp_routing(osv.osv):
|
||||
"""
|
||||
For specifying the routings of workcenters.
|
||||
@@ -996,520 +967,6 @@ class mrp_production_product_line(osv.osv):
|
||||
}
|
||||
mrp_production_product_line()
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Procurement
|
||||
# ------------------------------------------------------------------
|
||||
#
|
||||
# Produce, Buy or Find products and place a move
|
||||
# then wizard for picking lists & move
|
||||
#
|
||||
class mrp_procurement(osv.osv):
|
||||
"""
|
||||
Procument Orders
|
||||
"""
|
||||
_name = "mrp.procurement"
|
||||
_description = "Procurement"
|
||||
_order = 'priority,date_planned'
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Reason', size=64, required=True, help='Procurement name.'),
|
||||
'origin': fields.char('Source Document', size=64,
|
||||
help="Reference of the document that created this Procurement.\n"
|
||||
"This is automatically completed by Open ERP."),
|
||||
'priority': fields.selection([('0','Not urgent'),('1','Normal'),('2','Urgent'),('3','Very Urgent')], 'Priority', required=True),
|
||||
'date_planned': fields.datetime('Scheduled date', required=True),
|
||||
'date_close': fields.datetime('Date Closed'),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_qty': fields.float('Quantity', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_uom': fields.many2one('product.uom', 'Product UoM', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_uos_qty': fields.float('UoS Quantity', states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_uos': fields.many2one('product.uom', 'Product UoS', states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'move_id': fields.many2one('stock.move', 'Reservation', ondelete='set null'),
|
||||
|
||||
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade', select=True),
|
||||
|
||||
'close_move': fields.boolean('Close Move at end', required=True),
|
||||
'location_id': fields.many2one('stock.location', 'Location', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'procure_method': fields.selection([('make_to_stock','from stock'),('make_to_order','on order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
|
||||
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
|
||||
" a make to order method."),
|
||||
|
||||
'purchase_id': fields.many2one('purchase.order', 'Purchase Order'),
|
||||
'note': fields.text('Note'),
|
||||
|
||||
'property_ids': fields.many2many('mrp.property', 'mrp_procurement_property_rel', 'procurement_id','property_id', 'Properties'),
|
||||
|
||||
'message': fields.char('Latest error', size=64, help="Exception occurred while computing procurement orders."),
|
||||
'state': fields.selection([
|
||||
('draft','Draft'),
|
||||
('confirmed','Confirmed'),
|
||||
('exception','Exception'),
|
||||
('running','Running'),
|
||||
('cancel','Cancel'),
|
||||
('ready','Ready'),
|
||||
('done','Done'),
|
||||
('waiting','Waiting')], 'State', required=True,
|
||||
help='When a procurement is created the state is set to \'Draft\'.\n If the procurement is confirmed, the state is set to \'Confirmed\'.\
|
||||
\nAfter confirming the state is set to \'Running\'.\n If any exception arises in the order then the state is set to \'Exception\'.\n Once the exception is removed the state becomes \'Ready\'.\n It is in \'Waiting\'. state when the procurement is waiting for another one to finish.'),
|
||||
'note': fields.text('Note'),
|
||||
'company_id': fields.many2one('res.company','Company',required=True),
|
||||
}
|
||||
_defaults = {
|
||||
'state': lambda *a: 'draft',
|
||||
'priority': lambda *a: '1',
|
||||
'date_planned': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'close_move': lambda *a: 0,
|
||||
'procure_method': lambda *a: 'make_to_order',
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.procurement', context=c)
|
||||
}
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
procurements = self.read(cr, uid, ids, ['state'])
|
||||
unlink_ids = []
|
||||
for s in procurements:
|
||||
if s['state'] in ['draft','cancel']:
|
||||
unlink_ids.append(s['id'])
|
||||
else:
|
||||
raise osv.except_osv(_('Invalid action !'), _('Cannot delete Procurement Order(s) which are in %s State!' % s['state']))
|
||||
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id, context={}):
|
||||
""" Finds UoM and UoS of changed product.
|
||||
@param product_id: Changed id of product.
|
||||
@return: Dictionary of values.
|
||||
"""
|
||||
if product_id:
|
||||
w = self.pool.get('product.product').browse(cr, uid, product_id, context)
|
||||
v = {
|
||||
'product_uom': w.uom_id.id,
|
||||
'product_uos': w.uos_id and w.uos_id.id or w.uom_id.id
|
||||
}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def check_product(self, cr, uid, ids):
|
||||
""" Checks product type.
|
||||
@return: True or False
|
||||
"""
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_id.type in ('product', 'consu'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_move_cancel(self, cr, uid, ids, context={}):
|
||||
""" Checks if move is cancelled or not.
|
||||
@return: True or False.
|
||||
"""
|
||||
res = True
|
||||
ok = False
|
||||
for procurement in self.browse(cr, uid, ids, context):
|
||||
if procurement.move_id:
|
||||
ok = True
|
||||
if not procurement.move_id.state == 'cancel':
|
||||
res = False
|
||||
return res and ok
|
||||
|
||||
def check_move_done(self, cr, uid, ids, context={}):
|
||||
""" Checks if move is done or not.
|
||||
@return: True or False.
|
||||
"""
|
||||
res = True
|
||||
for proc in self.browse(cr, uid, ids, context):
|
||||
if proc.move_id:
|
||||
if not proc.move_id.state == 'done':
|
||||
res = False
|
||||
return res
|
||||
|
||||
#
|
||||
# This method may be overrided by objects that override mrp.procurment
|
||||
# for computing their own purpose
|
||||
#
|
||||
def _quantity_compute_get(self, cr, uid, proc, context={}):
|
||||
""" Finds sold quantity of product.
|
||||
@param proc: Current procurement.
|
||||
@return: Quantity or False.
|
||||
"""
|
||||
if proc.product_id.type == 'product':
|
||||
if proc.move_id.product_uos:
|
||||
return proc.move_id.product_uos_qty
|
||||
return False
|
||||
|
||||
def _uom_compute_get(self, cr, uid, proc, context={}):
|
||||
""" Finds UoS if product is Stockable Product.
|
||||
@param proc: Current procurement.
|
||||
@return: UoS or False.
|
||||
"""
|
||||
if proc.product_id.type == 'product':
|
||||
if proc.move_id.product_uos:
|
||||
return proc.move_id.product_uos.id
|
||||
return False
|
||||
|
||||
#
|
||||
# Return the quantity of product shipped/produced/served, wich may be
|
||||
# different from the planned quantity
|
||||
#
|
||||
def quantity_get(self, cr, uid, id, context={}):
|
||||
""" Finds quantity of product used in procurement.
|
||||
@return: Quantity of product.
|
||||
"""
|
||||
proc = self.browse(cr, uid, id, context)
|
||||
result = self._quantity_compute_get(cr, uid, proc, context)
|
||||
if not result:
|
||||
result = proc.product_qty
|
||||
return result
|
||||
|
||||
def uom_get(self, cr, uid, id, context=None):
|
||||
""" Finds UoM of product used in procurement.
|
||||
@return: UoM of product.
|
||||
"""
|
||||
proc = self.browse(cr, uid, id, context)
|
||||
result = self._uom_compute_get(cr, uid, proc, context)
|
||||
if not result:
|
||||
result = proc.product_uom.id
|
||||
return result
|
||||
|
||||
def check_waiting(self, cr, uid, ids, context=[]):
|
||||
""" Checks state of move.
|
||||
@return: True or False
|
||||
"""
|
||||
for procurement in self.browse(cr, uid, ids, context=context):
|
||||
if procurement.move_id and procurement.move_id.state == 'auto':
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_produce_service(self, cr, uid, procurement, context=[]):
|
||||
return True
|
||||
|
||||
def check_produce_product(self, cr, uid, procurement, context=[]):
|
||||
""" Finds BoM of a product if not found writes exception message.
|
||||
@param procurement: Current procurement.
|
||||
@return: True or False.
|
||||
"""
|
||||
properties = [x.id for x in procurement.property_ids]
|
||||
bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)
|
||||
if not bom_id:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id))
|
||||
return False
|
||||
return True
|
||||
|
||||
def check_make_to_stock(self, cr, uid, ids, context={}):
|
||||
""" Checks product type.
|
||||
@return: True or False
|
||||
"""
|
||||
ok = True
|
||||
for procurement in self.browse(cr, uid, ids, context=context):
|
||||
if procurement.product_id.type == 'service':
|
||||
ok = ok and self._check_make_to_stock_service(cr, uid, procurement, context)
|
||||
else:
|
||||
ok = ok and self._check_make_to_stock_product(cr, uid, procurement, context)
|
||||
return ok
|
||||
|
||||
def check_produce(self, cr, uid, ids, context={}):
|
||||
""" Checks product type.
|
||||
@return: True or Product Id.
|
||||
"""
|
||||
res = True
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid)
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_id.product_tmpl_id.supply_method <> 'produce':
|
||||
if procurement.product_id.seller_ids:
|
||||
partner = procurement.product_id.seller_ids[0].name
|
||||
if user.company_id and user.company_id.partner_id:
|
||||
if partner.id == user.company_id.partner_id.id:
|
||||
return True
|
||||
return False
|
||||
if procurement.product_id.product_tmpl_id.type=='service':
|
||||
res = res and self.check_produce_service(cr, uid, procurement, context)
|
||||
else:
|
||||
res = res and self.check_produce_product(cr, uid, procurement, context)
|
||||
if not res:
|
||||
return False
|
||||
return res
|
||||
|
||||
def check_buy(self, cr, uid, ids):
|
||||
""" Checks product type.
|
||||
@return: True or Product Id.
|
||||
"""
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid)
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_id.product_tmpl_id.supply_method <> 'buy':
|
||||
return False
|
||||
if not procurement.product_id.seller_ids:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('No supplier defined for this product !'), procurement.id))
|
||||
return False
|
||||
partner = procurement.product_id.seller_ids[0].name
|
||||
if user.company_id and user.company_id.partner_id:
|
||||
if partner.id == user.company_id.partner_id.id:
|
||||
return False
|
||||
address_id = partner_obj.address_get(cr, uid, [partner.id], ['delivery'])['delivery']
|
||||
if not address_id:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('No address defined for the supplier'), procurement.id))
|
||||
return False
|
||||
return True
|
||||
|
||||
def test_cancel(self, cr, uid, ids):
|
||||
""" Tests whether state of move is cancelled or not.
|
||||
@return: True or False
|
||||
"""
|
||||
for record in self.browse(cr, uid, ids):
|
||||
if record.move_id and record.move_id.state == 'cancel':
|
||||
return True
|
||||
return False
|
||||
|
||||
def action_confirm(self, cr, uid, ids, context={}):
|
||||
""" Confirms procurement and writes exception message if any.
|
||||
@return: True
|
||||
"""
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_qty <= 0.00:
|
||||
raise osv.except_osv(_('Data Insufficient !'), _('Please check the Quantity of Procurement Order(s), it should not be less than 1!'))
|
||||
if procurement.product_id.type in ('product', 'consu'):
|
||||
if not procurement.move_id:
|
||||
source = procurement.location_id.id
|
||||
if procurement.procure_method == 'make_to_order':
|
||||
source = procurement.product_id.product_tmpl_id.property_stock_procurement.id
|
||||
id = move_obj.create(cr, uid, {
|
||||
'name': 'PROC:' + procurement.name,
|
||||
'location_id': source,
|
||||
'location_dest_id': procurement.location_id.id,
|
||||
'product_id': procurement.product_id.id,
|
||||
'product_qty': procurement.product_qty,
|
||||
'product_uom': procurement.product_uom.id,
|
||||
'date_planned': procurement.date_planned,
|
||||
'state': 'confirmed',
|
||||
'company_id': procurement.company_id.id,
|
||||
})
|
||||
self.write(cr, uid, [procurement.id], {'move_id': id, 'close_move': 1})
|
||||
else:
|
||||
# TODO: check this
|
||||
if procurement.procure_method == 'make_to_stock' and procurement.move_id.state in ('waiting',):
|
||||
id = move_obj.write(cr, uid, [procurement.move_id.id], {'state':'confirmed'})
|
||||
self.write(cr, uid, ids, {'state': 'confirmed', 'message': ''})
|
||||
return True
|
||||
|
||||
def action_move_assigned(self, cr, uid, ids, context={}):
|
||||
""" Changes procurement state to Running and writes message.
|
||||
@return: True
|
||||
"""
|
||||
self.write(cr, uid, ids, {'state': 'running', 'message': _('from stock: products assigned.')})
|
||||
return True
|
||||
|
||||
def _check_make_to_stock_service(self, cr, uid, procurement, context={}):
|
||||
return True
|
||||
|
||||
def _check_make_to_stock_product(self, cr, uid, procurement, context={}):
|
||||
""" Checks procurement move state.
|
||||
@param procurement: Current procurement.
|
||||
@return: True or move id.
|
||||
"""
|
||||
ok = True
|
||||
if procurement.move_id:
|
||||
id = procurement.move_id.id
|
||||
if not (procurement.move_id.state in ('done','assigned','cancel')):
|
||||
ok = ok and self.pool.get('stock.move').action_assign(cr, uid, [id])
|
||||
cr.execute('select count(id) from stock_warehouse_orderpoint where product_id=%s', (procurement.product_id.id,))
|
||||
if not cr.fetchone()[0]:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('from stock and no minimum orderpoint rule defined'), procurement.id))
|
||||
return ok
|
||||
|
||||
def action_produce_assign_service(self, cr, uid, ids, context={}):
|
||||
""" Changes procurement state to Running.
|
||||
@return: True
|
||||
"""
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
||||
return True
|
||||
|
||||
def action_produce_assign_product(self, cr, uid, ids, context={}):
|
||||
""" This is action which call from workflow to assign production order to procurements
|
||||
@return: True
|
||||
"""
|
||||
res = self.make_mo(cr, uid, ids, context=context)
|
||||
res = res.values()
|
||||
return len(res) and res[0] or 0 #TO CHECK: why workflow is generated error if return not integer value
|
||||
|
||||
def make_mo(self, cr, uid, ids, context={}):
|
||||
""" Make Manufecturing(production) order from procurement
|
||||
@return: New created Production Orders procurement wise
|
||||
"""
|
||||
res = {}
|
||||
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
|
||||
production_obj = self.pool.get('mrp.production')
|
||||
move_obj = self.pool.get('stock.move')
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
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 %H:%M:%S') - DateTime.RelativeDateTime(days=procurement.product_id.product_tmpl_id.produce_delay or 0.0)
|
||||
newdate = newdate - DateTime.RelativeDateTime(days=company.manufacturing_lead)
|
||||
produce_id = production_obj.create(cr, uid, {
|
||||
'origin': procurement.origin,
|
||||
'product_id': procurement.product_id.id,
|
||||
'product_qty': procurement.product_qty,
|
||||
'product_uom': procurement.product_uom.id,
|
||||
'product_uos_qty': procurement.product_uos and procurement.product_uos_qty or False,
|
||||
'product_uos': procurement.product_uos and procurement.product_uos.id or False,
|
||||
'location_src_id': procurement.location_id.id,
|
||||
'location_dest_id': procurement.location_id.id,
|
||||
'bom_id': procurement.bom_id and procurement.bom_id.id or False,
|
||||
'date_planned': newdate.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'move_prod_id': res_id,
|
||||
'company_id': procurement.company_id.id,
|
||||
})
|
||||
res[procurement.id] = produce_id
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
||||
bom_result = production_obj.action_compute(cr, uid,
|
||||
[produce_id], properties=[x.id for x in procurement.property_ids])
|
||||
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
|
||||
move_obj.write(cr, uid, [res_id],
|
||||
{'location_id': procurement.location_id.id})
|
||||
return res
|
||||
|
||||
def action_po_assign(self, cr, uid, ids, context={}):
|
||||
""" This is action which call from workflow to assign purchase order to procuments
|
||||
@return: True
|
||||
"""
|
||||
res = self.make_po(cr, uid, ids, context=context)
|
||||
res = res.values()
|
||||
return len(res) and res[0] or 0 #TO CHECK: why workflow is generated error if return not integer value
|
||||
|
||||
def make_po(self, cr, uid, ids, context={}):
|
||||
""" Make purchase order from procurement
|
||||
@return: New created Purchase Orders procurement wise
|
||||
"""
|
||||
res = {}
|
||||
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
uom_obj = self.pool.get('product.uom')
|
||||
pricelist_obj = self.pool.get('product.pricelist')
|
||||
prod_obj = self.pool.get('product.product')
|
||||
acc_pos_obj = self.pool.get('account.fiscal.position')
|
||||
po_obj = self.pool.get('purchase.order')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
res_id = procurement.move_id.id
|
||||
partner = procurement.product_id.seller_ids[0].name
|
||||
partner_id = partner.id
|
||||
address_id = partner_obj.address_get(cr, uid, [partner_id], ['delivery'])['delivery']
|
||||
pricelist_id = partner.property_product_pricelist_purchase.id
|
||||
|
||||
uom_id = procurement.product_id.uom_po_id.id
|
||||
|
||||
qty = uom_obj._compute_qty(cr, uid, procurement.product_uom.id, procurement.product_qty, uom_id)
|
||||
if procurement.product_id.seller_ids[0].qty:
|
||||
qty = max(qty,procurement.product_id.seller_ids[0].qty)
|
||||
|
||||
price = pricelist_obj.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 %H:%M:%S')
|
||||
newdate = newdate - DateTime.RelativeDateTime(days=company.po_lead)
|
||||
newdate = newdate - procurement.product_id.seller_ids[0].delay
|
||||
|
||||
#Passing partner_id to context for purchase order line integrity of Line name
|
||||
context.update({'lang': partner.lang, 'partner_id': partner_id})
|
||||
|
||||
product = prod_obj.browse(cr, uid, procurement.product_id.id, context=context)
|
||||
|
||||
line = {
|
||||
'name': product.partner_ref,
|
||||
'product_qty': qty,
|
||||
'product_id': procurement.product_id.id,
|
||||
'product_uom': uom_id,
|
||||
'price_unit': price,
|
||||
'date_planned': newdate.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'move_dest_id': res_id,
|
||||
'notes': product.description_purchase,
|
||||
}
|
||||
|
||||
taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id
|
||||
taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids)
|
||||
line.update({
|
||||
'taxes_id': [(6,0,taxes)]
|
||||
})
|
||||
purchase_id = po_obj.create(cr, uid, {
|
||||
'origin': procurement.origin,
|
||||
'partner_id': partner_id,
|
||||
'partner_address_id': address_id,
|
||||
'location_id': procurement.location_id.id,
|
||||
'pricelist_id': pricelist_id,
|
||||
'order_line': [(0,0,line)],
|
||||
'company_id': procurement.company_id.id,
|
||||
'fiscal_position': partner.property_account_position and partner.property_account_position.id or False
|
||||
})
|
||||
res[procurement.id] = purchase_id
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': purchase_id})
|
||||
return res
|
||||
|
||||
def action_cancel(self, cr, uid, ids):
|
||||
""" Cancels procurement and writes move state to Assigned.
|
||||
@return: True
|
||||
"""
|
||||
todo = []
|
||||
todo2 = []
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for proc in self.browse(cr, uid, ids):
|
||||
if proc.close_move:
|
||||
if proc.move_id.state not in ('done', 'cancel'):
|
||||
todo2.append(proc.move_id.id)
|
||||
else:
|
||||
if proc.move_id and proc.move_id.state == 'waiting':
|
||||
todo.append(proc.move_id.id)
|
||||
if len(todo2):
|
||||
move_obj.action_cancel(cr, uid, todo2)
|
||||
if len(todo):
|
||||
move_obj.write(cr, uid, todo, {'state': 'assigned'})
|
||||
self.write(cr, uid, ids, {'state': 'cancel'})
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
for id in ids:
|
||||
wf_service.trg_trigger(uid, 'mrp.procurement', id, cr)
|
||||
return True
|
||||
|
||||
def action_check_finnished(self, cr, uid, ids):
|
||||
return self.check_move_done(cr, uid, ids)
|
||||
|
||||
def action_check(self, cr, uid, ids):
|
||||
""" Checks procurement move state whether assigned or done.
|
||||
@return: True
|
||||
"""
|
||||
ok = False
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.move_id.state == 'assigned' or procurement.move_id.state == 'done':
|
||||
self.action_done(cr, uid, [procurement.id])
|
||||
ok = True
|
||||
return ok
|
||||
|
||||
def action_ready(self, cr, uid, ids):
|
||||
""" Changes procurement state to Ready.
|
||||
@return: True
|
||||
"""
|
||||
res = self.write(cr, uid, ids, {'state': 'ready'})
|
||||
return res
|
||||
|
||||
def action_done(self, cr, uid, ids):
|
||||
""" Changes procurement state to Done and writes Closed date.
|
||||
@return: True
|
||||
"""
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.move_id:
|
||||
if procurement.close_move and (procurement.move_id.state <> 'done'):
|
||||
move_obj.action_done(cr, uid, [procurement.move_id.id])
|
||||
res = self.write(cr, uid, ids, {'state': 'done', 'date_close': time.strftime('%Y-%m-%d')})
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
for id in ids:
|
||||
wf_service.trg_trigger(uid, 'mrp.procurement', id, cr)
|
||||
return res
|
||||
|
||||
def run_scheduler(self, cr, uid, automatic=False, use_new_cursor=False, context=None):
|
||||
''' Runs through scheduler.
|
||||
@param use_new_cursor: False or the dbname
|
||||
'''
|
||||
if not context:
|
||||
context={}
|
||||
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)
|
||||
mrp_procurement()
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -31,18 +31,5 @@
|
||||
<field name="number_increment">1</field>
|
||||
</record>
|
||||
|
||||
<record forcecreate="True" id="ir_cron_scheduler_action" model="ir.cron">
|
||||
<field name="name">Run mrp scheduler</field>
|
||||
<field eval="False" name="active"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall"/>
|
||||
<field eval="'mrp.procurement'" name="model"/>
|
||||
<field eval="'run_scheduler'" name="function"/>
|
||||
<field eval="'(False,)'" name="args"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from mx import DateTime
|
||||
from osv import fields
|
||||
from osv import osv
|
||||
from tools.translate import _
|
||||
import ir
|
||||
import netsvc
|
||||
import time
|
||||
|
||||
class mrp_procurement(osv.osv):
|
||||
_inherit = 'mrp.procurement'
|
||||
_columns = {
|
||||
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade', select=True),
|
||||
}
|
||||
|
||||
def check_produce_product(self, cr, uid, procurement, context=[]):
|
||||
properties = [x.id for x in procurement.property_ids]
|
||||
bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)
|
||||
if not bom_id:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id))
|
||||
return False
|
||||
return True
|
||||
|
||||
def action_produce_assign_product(self, cr, uid, ids, context={}):
|
||||
""" This is action which call from workflow to assign production order to procurements
|
||||
@return: True
|
||||
"""
|
||||
procurement_obj = self.pool.get('mrp.procurement')
|
||||
res = procurement_obj.make_mo(cr, uid, ids, context=context)
|
||||
res = res.values()
|
||||
return len(res) and res[0] or 0 #TO CHECK: why workflow is generated error if return not integer value
|
||||
|
||||
def make_mo(self, cr, uid, ids, context={}):
|
||||
""" Make Manufacturing(production) order from procurement
|
||||
@return: New created Production Orders procurement wise
|
||||
"""
|
||||
res = {}
|
||||
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
|
||||
production_obj = self.pool.get('mrp.production')
|
||||
move_obj = self.pool.get('stock.move')
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
procurement_obj = self.pool.get('mrp.procurement')
|
||||
for procurement in procurement_obj.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 %H:%M:%S') - DateTime.RelativeDateTime(days=procurement.product_id.product_tmpl_id.produce_delay or 0.0)
|
||||
newdate = newdate - DateTime.RelativeDateTime(days=company.manufacturing_lead)
|
||||
produce_id = production_obj.create(cr, uid, {
|
||||
'origin': procurement.origin,
|
||||
'product_id': procurement.product_id.id,
|
||||
'product_qty': procurement.product_qty,
|
||||
'product_uom': procurement.product_uom.id,
|
||||
'product_uos_qty': procurement.product_uos and procurement.product_uos_qty or False,
|
||||
'product_uos': procurement.product_uos and procurement.product_uos.id or False,
|
||||
'location_src_id': procurement.location_id.id,
|
||||
'location_dest_id': procurement.location_id.id,
|
||||
'bom_id': procurement.bom_id and procurement.bom_id.id or False,
|
||||
'date_planned': newdate.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'move_prod_id': res_id,
|
||||
'company_id': procurement.company_id.id,
|
||||
})
|
||||
res[procurement.id] = produce_id
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
||||
bom_result = production_obj.action_compute(cr, uid,
|
||||
[produce_id], properties=[x.id for x in procurement.property_ids])
|
||||
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
|
||||
move_obj.write(cr, uid, [res_id],
|
||||
{'location_id': procurement.location_id.id})
|
||||
return res
|
||||
|
||||
mrp_procurement()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
+39
-258
@@ -12,6 +12,7 @@
|
||||
id="menu_mrp_bom"
|
||||
parent="base.menu_mrp_root"
|
||||
sequence="5" />
|
||||
|
||||
<!--
|
||||
Property / Property Group
|
||||
-->
|
||||
@@ -257,14 +258,14 @@
|
||||
<field name="type" groups="base.group_extended"/>
|
||||
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="General Information">
|
||||
<notebook colspan="4" >
|
||||
<page string="General Information" attrs="{'invisible': [('bom_id','!=',False),('multi_level_bom','=',False)]}">
|
||||
<field colspan="4" name="bom_lines" nolabel="1" widget="one2many_list" />
|
||||
</page>
|
||||
<page string="Revisions" groups="base.group_extended">
|
||||
<page string="Revisions" groups="base.group_extended" attrs="{'invisible': [('bom_id','!=',False),('multi_level_bom','=',False)]}">
|
||||
<field colspan="4" name="revision_ids" nolabel="1" widget="one2many_list"/>
|
||||
</page>
|
||||
<page string="Properties" groups="base.group_extended">
|
||||
<page string="Properties" groups="base.group_extended" attrs="{'invisible': [('bom_id','!=',False),('multi_level_bom','=',False)]}">
|
||||
<field name="position"/>
|
||||
<field name="active"/>
|
||||
<field name="sequence"/>
|
||||
@@ -378,10 +379,27 @@
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!--
|
||||
Procurement
|
||||
-->
|
||||
|
||||
<menuitem action="mrp_procurement.mrp_procurement_action" id="menu_mrp_procurement_action"
|
||||
parent="mrp.menu_mrp_manufacturing" sequence="2" />
|
||||
<menuitem action="mrp_procurement.mrp_procurement_action5" id="menu_mrp_procurement_exception_action"
|
||||
parent="mrp.menu_mrp_control" sequence="1" />
|
||||
|
||||
<menuitem id="menu_mrp_scheduler" name="Schedulers" parent="base.menu_mrp_root" sequence="4"/>
|
||||
<menuitem action="mrp_procurement.action_compute_schedulers" id="mrp_Sched_all" parent="mrp.menu_mrp_scheduler" sequence="90"/>
|
||||
|
||||
<!--
|
||||
Order Point
|
||||
-->
|
||||
<menuitem action="mrp_procurement.action_orderpoint_form" id="menu_action_orderpoint_form" parent="mrp.menu_mrp_reordering"/>
|
||||
|
||||
<!--
|
||||
Production Management
|
||||
-->
|
||||
Production Management
|
||||
-->
|
||||
|
||||
<record id="mrp_production_tree_view" model="ir.ui.view">
|
||||
<field name="name">mrp.production.tree</field>
|
||||
@@ -765,259 +783,22 @@
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!--
|
||||
Procurement
|
||||
|
||||
<!--
|
||||
Procurements
|
||||
-->
|
||||
|
||||
<record id="mrp_procurement_tree_view" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.tree</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Procurement Lines" colors="red:state=='draft';black:state=='running';green:state=='confirmed';gray:state in ['done','cancel']">
|
||||
<field name="date_planned" widget="date"/>
|
||||
<field name="origin"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_qty"/>
|
||||
<field name="product_uom" string="UOM"/>
|
||||
<field name="procure_method"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
<record id="view_procurement_form_inherit" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.form.inherit</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="inherit_id" ref="mrp_procurement.mrp_procurement_form_view"/>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/notebook/page/field[@name='move_id']" position="before">
|
||||
<field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<record id="mrp_procurement_form_view" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.form</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Procurement">
|
||||
<group col="2" colspan="2">
|
||||
<separator colspan="2" string="References"/>
|
||||
<field name="name" select="1" string="Procurement Reason"/>
|
||||
<field name="origin"/>
|
||||
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator colspan="2" string="Planification"/>
|
||||
<field name="date_planned" select="1"/>
|
||||
<field name="procure_method"/>
|
||||
<field name="priority" groups="base.group_extended"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Procurement Details">
|
||||
<separator colspan="4" string="Product & Location"/>
|
||||
<field name="product_id" select="1" on_change="onchange_product_id(product_id)"/>
|
||||
<field name="location_id" domain="[('usage','=','internal')]"/>
|
||||
<field name="product_qty"/>
|
||||
<field name="product_uom"/>
|
||||
|
||||
<field name="product_uos_qty" groups="product.group_uos"/>
|
||||
<field name="product_uos" groups="product.group_uos"/>
|
||||
|
||||
<separator colspan="4" string="Status"/>
|
||||
<field colspan="4" name="message" readonly="1"/>
|
||||
<field name="state" readonly="1"/>
|
||||
<group col="7" colspan="2">
|
||||
<button name="button_confirm" states="draft" string="Confirm" icon="gtk-apply"/>
|
||||
<button name="button_restart" states="exception" string="Retry" icon="gtk-convert"/>
|
||||
<button name="button_cancel" states="draft,exception,waiting" string="Cancel" icon="gtk-cancel"/>
|
||||
<button name="button_check" states="confirmed" string="Run Procurement" icon="gtk-media-play"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Extra Information">
|
||||
<separator colspan="4" string="Details"/>
|
||||
<field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>
|
||||
<field name="move_id" groups="base.group_extended"/>
|
||||
<field name="date_close"/>
|
||||
<field name="close_move" groups="base.group_extended"/>
|
||||
<field name="purchase_id"/>
|
||||
<group colspan="4" groups="base.group_extended">
|
||||
<separator colspan="4" string="Properties" />
|
||||
<field colspan="4" name="property_ids" nolabel="1"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<separator colspan="4" string="Note" />
|
||||
<field name="note" colspan="4" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_mrp_procurement_filter" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.select</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Procurement">
|
||||
<group col='10' colspan='4'>
|
||||
<filter icon="terp-mrp" string="Current" domain="[('state','in',('draft','confirmed'))]" default="1" help="Procurement Orders in draft or open state."/>
|
||||
<filter icon="terp-mrp" string="Exceptions" domain="[('state','=','exception')]" help="Procurement Orders with exceptions"/>
|
||||
<filter icon="terp-mrp" string="Late"
|
||||
domain="['&', ('date_planned::date','<', current_date), ('state', 'in', ('draft', 'confirmed'))]"
|
||||
help="Procurement started late" />
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name"/>
|
||||
<field name="origin"/>
|
||||
<field name="product_id" />
|
||||
<field name="date_planned" widget="date"/>
|
||||
<field name="state" />
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By" colspan="4" col="8">
|
||||
<filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product_id'}"/>
|
||||
<filter string="Reason" icon="terp-mrp" domain="[]" context="{'group_by':'name'}"/>
|
||||
<filter string="Scheduled Date" icon="terp-mrp" domain="[]" context="{'group_by':'date_planned'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<record id="mrp_procurement_action" model="ir.actions.act_window">
|
||||
<field name="name">Procurement Orders</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" eval="False"/>
|
||||
<field name="search_view_id" ref="view_mrp_procurement_filter"/>
|
||||
</record>
|
||||
<menuitem action="mrp_procurement_action" id="menu_mrp_procurement_action" parent="mrp.menu_mrp_manufacturing"
|
||||
sequence="2" />
|
||||
|
||||
<record id="mrp_procurement_action3" model="ir.actions.act_window">
|
||||
<field name="name">Procurements</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="search_view_id" ref="view_mrp_procurement_filter"/>
|
||||
<field name="domain">[]</field>
|
||||
<field name="context">{}</field>
|
||||
</record>
|
||||
|
||||
<record id="mrp_procurement_action5" model="ir.actions.act_window">
|
||||
<field name="name">Procurement Exceptions</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state','=','exception')]</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="mrp_procurement_action5" id="menu_mrp_procurement_exception_action" parent="mrp.menu_mrp_control"
|
||||
sequence="1" />
|
||||
<record id="mrp_procurement_action4" model="ir.actions.act_window">
|
||||
<field name="name">Procurement Exceptions to Fix</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state','=','exception'), ('message', '<>', '')]</field>
|
||||
<field name="filter" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record id="mrp_procurement_action11" model="ir.actions.act_window">
|
||||
<field name="name">Temporary Procurement Exceptions</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state','=','exception'), ('message', '=', '')]</field>
|
||||
</record>
|
||||
|
||||
<!-- Order Point -->
|
||||
<record id="view_warehouse_orderpoint_tree" model="ir.ui.view">
|
||||
<field name="name">stock.warehouse.orderpoint.tree</field>
|
||||
<field name="model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Minimum Stock Rules">
|
||||
<field name="name"/>
|
||||
<field name="warehouse_id"/>
|
||||
<field name="location_id"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_uom"/>
|
||||
<field name="product_min_qty"/>
|
||||
<field name="product_max_qty"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="warehouse_orderpoint_search">
|
||||
<field name="name">stock.warehouse.orderpoint.search</field>
|
||||
<field name="model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Minimum Stock Rules Search">
|
||||
<group col="10" colspan="4">
|
||||
<field name="name" select="1" />
|
||||
<field name="warehouse_id" select="1" widget="selection"/>
|
||||
<field name="location_id" select="1" />
|
||||
<field name="company_id" select="1" widget="selection"/>
|
||||
<field name="product_id" select="1"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By..." colspan="4" col="10">
|
||||
<filter string="Warehouse" icon="terp-stock" domain="[]" context="{'group_by':'warehouse_id'}"/>
|
||||
<filter string="Location" icon="terp-stock" domain="[]" context="{'group_by':'location_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_warehouse_orderpoint_form" model="ir.ui.view">
|
||||
<field name="name">stock.warehouse.orderpoint.form</field>
|
||||
<field name="model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Minimum Stock Rules">
|
||||
<group col="2" colspan="2">
|
||||
<separator string="General Information" colspan="2" />
|
||||
<field name="name" />
|
||||
<field name="product_id" on_change="onchange_product_id(product_id)"/>
|
||||
<field name="product_uom"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Locations" colspan="2" />
|
||||
<field name="warehouse_id" on_change="onchange_warehouse_id(warehouse_id)" widget="selection"/>
|
||||
<field name="location_id"/>
|
||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Quantity Rules" colspan="2" />
|
||||
<field name="product_min_qty"/>
|
||||
<field name="product_max_qty"/>
|
||||
<field name="qty_multiple"/>
|
||||
</group>
|
||||
<group col="2" colspan="2" groups="base.group_extended">
|
||||
<separator string="Misc" colspan="2" />
|
||||
<field name="procurement_id" readonly="1"/>
|
||||
<field name="active" />
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_orderpoint_form" model="ir.actions.act_window">
|
||||
<field name="name">Minimum Stock Rules</field>
|
||||
<field name="res_model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="view_warehouse_orderpoint_tree"/>
|
||||
<field name="search_view_id" ref="warehouse_orderpoint_search" />
|
||||
</record>
|
||||
<menuitem action="action_orderpoint_form" id="menu_action_orderpoint_form" parent="menu_mrp_reordering"/>
|
||||
|
||||
<act_window domain="[('warehouse_id', '=', active_id)]" id="act_stock_warehouse_2_stock_warehouse_orderpoint" name="Minimum Stock Rules" res_model="stock.warehouse.orderpoint" src_model="stock.warehouse"/>
|
||||
|
||||
<!-- add product_uom to context to be the default value when adding new orderpoints -->
|
||||
<act_window
|
||||
context="{'product_uom': locals().has_key('uom_id') and uom_id}"
|
||||
domain="[('product_id', '=', active_id)]"
|
||||
id="act_product_product_2_stock_warehouse_orderpoint"
|
||||
name="Minimum Stock Rules"
|
||||
res_model="stock.warehouse.orderpoint"
|
||||
src_model="product.product"/>
|
||||
|
||||
<act_window
|
||||
id="action_product_bom_structure"
|
||||
|
||||
+27
-202
@@ -113,241 +113,66 @@
|
||||
<field name="act_to" ref="prod_act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Procurement -->
|
||||
|
||||
<record id="wkf" model="workflow">
|
||||
<field name="name">mrp.procurement.basic</field>
|
||||
<field name="osv">mrp.procurement</field>
|
||||
<field name="on_create">True</field>
|
||||
</record>
|
||||
|
||||
<record id="act_draft" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="flow_start">True</field>
|
||||
<field name="name">draft</field>
|
||||
</record>
|
||||
<record id="act_cancel" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">cancel</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_cancel()</field>
|
||||
<field name="flow_stop">True</field>
|
||||
</record>
|
||||
<record id="act_confirm" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">confirm</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_confirm()</field>
|
||||
</record>
|
||||
<record id="act_confirm_wait" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">confirm_wait</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">write({'state':'exception'})</field>
|
||||
</record>
|
||||
<record id="act_confirm_mts" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">confirm_mts</field>
|
||||
</record>
|
||||
<record id="act_confirm_mto" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">confirm_mto</field>
|
||||
</record>
|
||||
<record id="act_make_to_stock" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">make_to_stock</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_move_assigned()</field>
|
||||
</record>
|
||||
<record id="act_produce" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="wkf_id" ref="mrp_procurement.wkf_procurement"/>
|
||||
<field name="name">produce</field>
|
||||
<field name="kind">subflow</field>
|
||||
<field name="subflow_id" search="[('osv','=','mrp.production')]"/>
|
||||
<field name="action">action_produce_assign_product()</field>
|
||||
</record>
|
||||
<record id="act_produce_check" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="wkf_id" ref="mrp_procurement.wkf_procurement"/>
|
||||
<field name="name">produce_check</field>
|
||||
</record>
|
||||
<record id="act_produce_service" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="wkf_id" ref="mrp_procurement.wkf_procurement"/>
|
||||
<field name="name">produce_service</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_produce_assign_service()</field>
|
||||
</record>
|
||||
<record id="act_buy" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">buy</field>
|
||||
<field name="kind">subflow</field>
|
||||
<field name="subflow_id" search="[('osv','=','purchase.order')]"/>
|
||||
<field name="action">action_po_assign()</field>
|
||||
</record>
|
||||
<record id="act_make_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">ready</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_ready()</field>
|
||||
</record>
|
||||
<record id="act_wait_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">wait_done</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">write({'state':'waiting'})</field>
|
||||
</record>
|
||||
|
||||
<record id="act_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="flow_stop">True</field>
|
||||
<field name="name">done</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_done()</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_draft_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_confirm"/>
|
||||
<field name="signal">button_confirm</field>
|
||||
</record>
|
||||
<record id="trans_confirm_cancel2" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm"/>
|
||||
<field name="act_to" ref="act_wait_done"/>
|
||||
<field name="signal">button_wait_done</field>
|
||||
<field name="condition">True</field>
|
||||
</record>
|
||||
<record id="trans_confirm_wait_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_wait_done"/>
|
||||
<field name="act_to" ref="act_done"/>
|
||||
<field name="condition">check_move_done()</field>
|
||||
<field name="trigger_model">stock.move</field>
|
||||
<field name="trigger_expr_id">[move_id.id]</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_confirm_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_check</field>
|
||||
<field name="condition">test_cancel()</field>
|
||||
</record>
|
||||
<record id="trans_confirm_confirm_wait" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm"/>
|
||||
<field name="act_to" ref="act_confirm_wait"/>
|
||||
<field name="signal">button_check</field>
|
||||
<field name="condition">not test_cancel()</field>
|
||||
</record>
|
||||
<record id="trans_confirm_wait_confirm_mto" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_wait"/>
|
||||
<field name="act_to" ref="act_confirm_mto"/>
|
||||
<field name="condition">procure_method=='make_to_order'</field>
|
||||
</record>
|
||||
<record id="trans_confirm_wait_confirm_mts" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_wait"/>
|
||||
<field name="act_to" ref="act_confirm_mts"/>
|
||||
<field name="condition">procure_method=='make_to_stock'</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mts_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mts"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_waiting_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_wait_done"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mts_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mts"/>
|
||||
<field name="act_to" ref="act_confirm"/>
|
||||
<field name="signal">button_restart</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mto_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mto_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_confirm"/>
|
||||
<field name="signal">button_restart</field>
|
||||
</record>
|
||||
<record id="trans_draft_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mts_make_to_stock" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mts"/>
|
||||
<field name="act_to" ref="act_make_to_stock"/>
|
||||
<field name="condition">check_make_to_stock()</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_confirm_mto_produce_check" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mto"/>
|
||||
<field name="act_from" ref="mrp_procurement.act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_produce_check"/>
|
||||
<field name="condition">check_produce()</field>
|
||||
</record>
|
||||
<record id="trans_product_check_produce" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce_check"/>
|
||||
<field name="act_to" ref="act_produce"/>
|
||||
<field name="condition">check_product()</field>
|
||||
</record>
|
||||
<record id="trans_product_check_produce_service" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce_check"/>
|
||||
<field name="act_to" ref="act_produce_service"/>
|
||||
<field name="condition">not check_product()</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mto_buy" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_buy"/>
|
||||
<field name="condition">check_buy()</field>
|
||||
</record>
|
||||
<record id="trans_make_to_stock_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_make_to_stock"/>
|
||||
<field name="act_to" ref="act_make_done"/>
|
||||
<field name="condition">True</field>
|
||||
<field name="trigger_model" eval="False"/>
|
||||
<field name="trigger_expr_id" eval="False"/>
|
||||
</record>
|
||||
<record id="trans_produce_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">subflow.cancel</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_produce_service_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce_service"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="act_to" ref="mrp_procurement.act_cancel"/>
|
||||
<field name="signal">subflow.cancel</field>
|
||||
</record>
|
||||
<record id="trans_buy_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_buy"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">subflow.cancel</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_produce_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce"/>
|
||||
<field name="act_to" ref="act_make_done"/>
|
||||
<field name="signal">subflow.done</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="trans_produce_service_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce_service"/>
|
||||
<field name="act_to" ref="act_make_done"/>
|
||||
<field name="act_to" ref="mrp_procurement.act_make_done"/>
|
||||
</record>
|
||||
<record id="trans_buy_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_buy"/>
|
||||
<field name="act_to" ref="act_make_done"/>
|
||||
<field name="signal">subflow.delivery_done</field>
|
||||
|
||||
<record id="trans_product_check_produce" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce_check"/>
|
||||
<field name="act_to" ref="act_produce"/>
|
||||
<field name="condition">check_product()</field>
|
||||
</record>
|
||||
<record id="trans_make_done_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_make_done"/>
|
||||
<field name="act_to" ref="act_done"/>
|
||||
<field name="condition">action_check_finnished()</field>
|
||||
|
||||
<record id="trans_produce_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce"/>
|
||||
<field name="act_to" ref="mrp_procurement.act_cancel"/>
|
||||
<field name="signal">subflow.cancel</field>
|
||||
</record>
|
||||
<record id="trans_make_done_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_make_done"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="condition">check_move_cancel()</field>
|
||||
|
||||
<record id="trans_produce_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_produce"/>
|
||||
<field name="act_to" ref="mrp_procurement.act_make_done"/>
|
||||
<field name="signal">subflow.done</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -1,43 +1,16 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!--
|
||||
Process
|
||||
-->
|
||||
|
||||
<record id="process_process_procurementprocess0" model="process.process">
|
||||
<field eval=""""Procurement"""" name="name"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field eval="1" name="active"/>
|
||||
</record>
|
||||
|
||||
<!--
|
||||
Process Node
|
||||
-->
|
||||
|
||||
<record id="process_node_stockproduct1" model="process.node">
|
||||
|
||||
<record id="process_node_procureproducts0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field eval=""""subflow"""" name="kind"/>
|
||||
<field eval=""""For stockable products and consumables"""" name="note"/>
|
||||
<field eval=""""Stockable Product"""" name="name"/>
|
||||
<field name="process_id" ref="mrp.process_process_stockableproductprocess0"/>
|
||||
<field name="subflow_id" ref="process_process_procurementprocess0"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement"/>
|
||||
<field eval=""""state"""" name="kind"/>
|
||||
<field eval=""""The way to procurement depends on the product type."""" name="note"/>
|
||||
<field eval=""""Procure Products"""" name="name"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_serviceproduct1" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field eval=""""subflow"""" name="kind"/>
|
||||
<field eval=""""For Services."""" name="note"/>
|
||||
<field eval=""""Service"""" name="name"/>
|
||||
<field name="process_id" ref="mrp.process_process_serviceproductprocess0"/>
|
||||
<field name="subflow_id" ref="process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
<field eval="0" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_productionorder0" model="process.node">
|
||||
@@ -46,31 +19,31 @@
|
||||
<field eval=""""state"""" name="kind"/>
|
||||
<field eval=""""Drives the procurement orders for raw material."""" name="note"/>
|
||||
<field eval=""""Production Order"""" name="name"/>
|
||||
<field name="process_id" ref="process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'picking_except', 'confirmed', 'ready', 'in_production', 'cancel', 'done')"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_minimumstockrule0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_action_orderpoint_form"/>
|
||||
<field name="model_id" ref="mrp.model_stock_warehouse_orderpoint"/>
|
||||
<field eval=""""state"""" name="kind"/>
|
||||
<field eval=""""Linked to the 'Minimum stock rule' supplying method."""" name="note"/>
|
||||
<field eval=""""Minimum Stock"""" name="name"/>
|
||||
<field name="process_id" ref="process_process_procurementprocess0"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_procureproducts0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field eval=""""state"""" name="kind"/>
|
||||
<field eval=""""The way to procurement depends on the product type."""" name="note"/>
|
||||
<field eval=""""Procure Products"""" name="name"/>
|
||||
<field name="process_id" ref="process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="0" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_minimumstockrule0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_action_orderpoint_form"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_stock_warehouse_orderpoint"/>
|
||||
<field eval=""""state"""" name="kind"/>
|
||||
<field eval=""""Linked to the 'Minimum stock rule' supplying method."""" name="note"/>
|
||||
<field eval=""""Minimum Stock"""" name="name"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_stockproduct0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
@@ -79,10 +52,22 @@
|
||||
<field eval=""""Product type is Stockable or Consumable."""" name="note"/>
|
||||
<field eval=""""Stockable Product"""" name="name"/>
|
||||
<field name="subflow_id" ref="process_process_stockableproductprocess0"/>
|
||||
<field name="process_id" ref="process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="0" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_stockproduct1" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field eval=""""subflow"""" name="kind"/>
|
||||
<field eval=""""For stockable products and consumables"""" name="note"/>
|
||||
<field eval=""""Stockable Product"""" name="name"/>
|
||||
<field name="process_id" ref="mrp.process_process_stockableproductprocess0"/>
|
||||
<field name="subflow_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_serviceproduct0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
@@ -91,10 +76,22 @@
|
||||
<field eval=""""Product type is service"""" name="note"/>
|
||||
<field eval=""""Service"""" name="name"/>
|
||||
<field name="subflow_id" ref="process_process_serviceproductprocess0"/>
|
||||
<field name="process_id" ref="process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="0" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_serviceproduct1" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field eval=""""subflow"""" name="kind"/>
|
||||
<field eval=""""For Services."""" name="note"/>
|
||||
<field eval=""""Service"""" name="name"/>
|
||||
<field name="process_id" ref="mrp.process_process_serviceproductprocess0"/>
|
||||
<field name="subflow_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_purchaseprocure0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
@@ -102,14 +99,14 @@
|
||||
<field eval=""""subflow"""" name="kind"/>
|
||||
<field eval=""""Procurement Orders"""" name="name"/>
|
||||
<field eval=""""For purchased material"""" name="note"/>
|
||||
<field name="subflow_id" ref="process_process_procurementprocess0"/>
|
||||
<field name="subflow_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="purchase.process_process_purchaseprocess0"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
|
||||
<record id="process_node_productminimumstockrule0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_action_orderpoint_form"/>
|
||||
<field name="model_id" ref="mrp.model_stock_warehouse_orderpoint"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_stock_warehouse_orderpoint"/>
|
||||
<field eval=""""state"""" name="kind"/>
|
||||
<field eval=""""Minimum Stock"""" name="name"/>
|
||||
<field eval=""""Automatic procurement rule"""" name="note"/>
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_mrp_workcenter","mrp.workcenter","model_mrp_workcenter","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_property_group","mrp.property.group","model_mrp_property_group","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_property","mrp.property","model_mrp_property","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_routing","mrp.routing","model_mrp_routing","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_routing_workcenter","mrp.routing.workcenter","model_mrp_routing_workcenter","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_bom","mrp.bom","model_mrp_bom","mrp.group_mrp_user",1,0,0,0
|
||||
@@ -10,11 +8,7 @@
|
||||
"access_mrp_production_workcenter_line","mrp.production.workcenter.line","model_mrp_production_workcenter_line","mrp.group_mrp_user",1,1,1,1
|
||||
"access_mrp_production_product_line","mrp.production.product.line","model_mrp_production_product_line","mrp.group_mrp_user",1,1,1,1
|
||||
"access_mrp_procurement","mrp.procurement","model_mrp_procurement","mrp.group_mrp_user",1,1,1,1
|
||||
"access_stock_warehouse_orderpoint","stock.warehouse.orderpoint","model_stock_warehouse_orderpoint","mrp.group_mrp_user",1,0,0,0
|
||||
"access_stock_warehouse_orderpoint_manager","stock.warehouse.orderpoint.manager","model_stock_warehouse_orderpoint","mrp.group_mrp_manager",1,1,1,1
|
||||
"access_mrp_workcenter_manager","mrp.workcenter.manager","model_mrp_workcenter","mrp.group_mrp_user",1,1,1,1
|
||||
"access_mrp_property_group_manager","mrp.property.group.manager","model_mrp_property_group","mrp.group_mrp_user",1,1,1,1
|
||||
"access_mrp_property_manager","mrp.property.manager","model_mrp_property","mrp.group_mrp_user",1,1,1,1
|
||||
"access_mrp_routing_manager","mrp.routing.manager","model_mrp_routing","mrp.group_mrp_manager",1,1,1,1
|
||||
"access_mrp_routing_workcenter_manager","mrp.routing.workcenter.manager","model_mrp_routing_workcenter","mrp.group_mrp_manager",1,1,1,1
|
||||
"access_mrp_bom_manager","mrp.bom.manager","model_mrp_bom","mrp.group_mrp_manager",1,1,1,1
|
||||
@@ -32,10 +26,7 @@
|
||||
"access_mrp_production_stock_worker","mrp.production stock_worker","model_mrp_production","stock.group_stock_user",1,0,0,0
|
||||
"access_mrp_installer","mrp.installer","model_mrp_installer","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_product_produce","mrp.product.produce","model_mrp_product_produce","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_make_procurement","make.procurement","model_make_procurement","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_change_production_qty","change.production.qty","model_change_production_qty","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_procurement_compute_all","mrp.procurement.compute.all","model_mrp_procurement_compute_all","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_procurement_orderpoint_compute","mrp.procurement.orderpoint.compute","model_mrp_procurement_orderpoint_compute","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_production_order","mrp.production.order","model_mrp_production_order","mrp.group_mrp_user",1,0,0,0
|
||||
"access_report_workcenter_load","report.workcenter.load","model_report_workcenter_load","mrp.group_mrp_manager",1,0,0,0
|
||||
"access_report_mrp_inout","report.mrp.inout","model_report_mrp_inout","mrp.group_mrp_manager",1,0,0,0
|
||||
|
||||
|
@@ -16,20 +16,6 @@
|
||||
</record>
|
||||
|
||||
<!-- Multi -->
|
||||
<record model="ir.rule" id="mrp_procurement_rule">
|
||||
<field name="name">mrp_procurement multi-company</field>
|
||||
<field name="model_id" search="[('model','=','mrp.procurement')]" model="ir.model"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="stock_warehouse_orderpoint_rule">
|
||||
<field name="name">stock_warehouse.orderpoint multi-company</field>
|
||||
<field name="model_id" search="[('model','=','stock.warehouse.orderpoint')]" model="ir.model"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="mrp_production_rule">
|
||||
<field name="name">mrp_production multi-company</field>
|
||||
<field name="model_id" search="[('model','=','mrp.production')]" model="ir.model"/>
|
||||
|
||||
@@ -27,74 +27,6 @@ import ir
|
||||
import netsvc
|
||||
import time
|
||||
|
||||
|
||||
class stock_warehouse_orderpoint(osv.osv):
|
||||
"""
|
||||
Defines Minimum stock rules.
|
||||
"""
|
||||
_name = "stock.warehouse.orderpoint"
|
||||
_description = "Orderpoint minimum rule"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=32, required=True),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the orderpoint without removing it."),
|
||||
'logic': fields.selection([('max','Order to Max'),('price','Best price (not yet active!)')], 'Reordering Mode', required=True),
|
||||
'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', required=True),
|
||||
'location_id': fields.many2one('stock.location', 'Location', required=True),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True, ondelete='cascade', domain=[('type','=','product')]),
|
||||
'product_uom': fields.many2one('product.uom', 'Product UOM', required=True ),
|
||||
'product_min_qty': fields.float('Min Quantity', required=True,
|
||||
help="When the virtual stock goes belong the Min Quantity, Open ERP generates "\
|
||||
"a procurement to bring the virtual stock to the Max Quantity."),
|
||||
'product_max_qty': fields.float('Max Quantity', required=True,
|
||||
help="When the virtual stock goes belong the Min Quantity, Open ERP generates "\
|
||||
"a procurement to bring the virtual stock to the Max Quantity."),
|
||||
'qty_multiple': fields.integer('Qty Multiple', required=True,
|
||||
help="The procurement quantity will by rounded up to this multiple."),
|
||||
'procurement_id': fields.many2one('mrp.procurement', 'Latest procurement'),
|
||||
'company_id': fields.many2one('res.company','Company',required=True),
|
||||
}
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'logic': lambda *a: 'max',
|
||||
'qty_multiple': lambda *a: 1,
|
||||
'name': lambda x,y,z,c: x.pool.get('ir.sequence').get(y,z,'mrp.warehouse.orderpoint') or '',
|
||||
'product_uom': lambda sel, cr, uid, context: context.get('product_uom', False),
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.warehouse.orderpoint', context=c)
|
||||
}
|
||||
|
||||
def onchange_warehouse_id(self, cr, uid, ids, warehouse_id, context={}):
|
||||
""" Finds location id for changed warehouse.
|
||||
@param warehouse_id: Changed id of warehouse.
|
||||
@return: Dictionary of values.
|
||||
"""
|
||||
if warehouse_id:
|
||||
w = self.pool.get('stock.warehouse').browse(cr, uid, warehouse_id, context)
|
||||
v = {'location_id': w.lot_stock_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id, context={}):
|
||||
""" Finds UoM for changed product.
|
||||
@param product_id: Changed id of product.
|
||||
@return: Dictionary of values.
|
||||
"""
|
||||
if product_id:
|
||||
prod = self.pool.get('product.product').browse(cr,uid,product_id)
|
||||
v = {'product_uom': prod.uom_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def copy(self, cr, uid, id, default=None,context={}):
|
||||
if not default:
|
||||
default = {}
|
||||
default.update({
|
||||
'name': self.pool.get('ir.sequence').get(cr, uid, 'mrp.warehouse.orderpoint') or '',
|
||||
})
|
||||
return super(stock_warehouse_orderpoint, self).copy(cr, uid, id, default, context)
|
||||
|
||||
stock_warehouse_orderpoint()
|
||||
|
||||
class StockMove(osv.osv):
|
||||
_inherit = 'stock.move'
|
||||
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
-
|
||||
In order to test the mrp phantom bom type in OpenERP, I will create products
|
||||
and then I will create Phantom bom structure for those products.
|
||||
-
|
||||
I create the products required to produce some orange juices: Oranges, Sugar and Water.
|
||||
-
|
||||
!record {model: product.uom, id: product_uom_litre0}:
|
||||
category_id: product.product_uom_categ_kgm
|
||||
factor: 1.0
|
||||
name: Litre
|
||||
rounding: 0.01
|
||||
-
|
||||
!record {model: product.product, id: product_product_orangejuice0}:
|
||||
categ_id: product.cat1
|
||||
name: Orange Juice
|
||||
procure_method: make_to_order
|
||||
supply_method: produce
|
||||
type: product
|
||||
uom_id: product_uom_litre0
|
||||
uom_po_id: product_uom_litre0
|
||||
-
|
||||
!record {model: product.product, id: product_product_orange0}:
|
||||
categ_id: product.cat1
|
||||
name: Orange
|
||||
procure_method: make_to_stock
|
||||
seller_ids:
|
||||
- delay: 1
|
||||
name: base.res_partner_asus
|
||||
qty: 1.0
|
||||
supply_method: buy
|
||||
type: product
|
||||
uom_id: product.product_uom_kgm
|
||||
uom_po_id: product.product_uom_kgm
|
||||
-
|
||||
!record {model: product.product, id: product_product_sugar0}:
|
||||
categ_id: product.cat1
|
||||
name: Sugar
|
||||
procure_method: make_to_stock
|
||||
seller_ids:
|
||||
- delay: 1
|
||||
name: base.res_partner_desertic_hispafuentes
|
||||
qty: 2.0
|
||||
supply_method: buy
|
||||
type: product
|
||||
uom_id: product.product_uom_kgm
|
||||
uom_po_id: product.product_uom_kgm
|
||||
-
|
||||
!record {model: product.product, id: product_product_water0}:
|
||||
categ_id: product.cat1
|
||||
name: Water
|
||||
procure_method: make_to_stock
|
||||
supply_method: buy
|
||||
type: consu
|
||||
uom_id: product_uom_litre0
|
||||
uom_po_id: product_uom_litre0
|
||||
-
|
||||
I define the BoM to produce an orange juice
|
||||
-
|
||||
!record {model: mrp.bom, id: mrp_bom_orangejuice0}:
|
||||
company_id: base.main_company
|
||||
name: Orange Juice
|
||||
product_efficiency: 1.0
|
||||
product_id: product_product_orangejuice0
|
||||
product_qty: 1.0
|
||||
product_uom: product_uom_litre0
|
||||
type: phantom
|
||||
-
|
||||
!record {model: mrp.bom, id: mrp_bom_orangejuice0}:
|
||||
bom_lines:
|
||||
- bom_id: mrp_bom_orangejuice0
|
||||
company_id: base.main_company
|
||||
name: Orange
|
||||
product_efficiency: 1.0
|
||||
product_id: product_product_orange0
|
||||
product_qty: 0.5
|
||||
product_uom: product.product_uom_kgm
|
||||
type: normal
|
||||
- bom_id: mrp_bom_orangejuice0
|
||||
company_id: base.main_company
|
||||
name: Sugar
|
||||
product_efficiency: 1.0
|
||||
product_id: product_product_sugar0
|
||||
product_qty: 0.02
|
||||
product_uom: product.product_uom_kgm
|
||||
type: normal
|
||||
- bom_id: mrp_bom_orangejuice0
|
||||
company_id: base.main_company
|
||||
name: Water
|
||||
product_efficiency: 1.0
|
||||
product_id: product_product_water0
|
||||
product_qty: 0.80000000000000004
|
||||
product_uom: product_uom_litre0
|
||||
type: normal
|
||||
-
|
||||
I define Minimum stock rules for my stockable products orange and sugar
|
||||
-
|
||||
!record {model: stock.warehouse.orderpoint, id: stock_warehouse_orderpoint_op0}:
|
||||
company_id: base.main_company
|
||||
location_id: stock.stock_location_stock
|
||||
logic: max
|
||||
name: OP/00002
|
||||
product_id: product_product_orange0
|
||||
product_max_qty: 10.0
|
||||
product_min_qty: 5.0
|
||||
product_uom: product.product_uom_kgm
|
||||
qty_multiple: 1
|
||||
warehouse_id: stock.warehouse0
|
||||
-
|
||||
!record {model: stock.warehouse.orderpoint, id: stock_warehouse_orderpoint_op1}:
|
||||
company_id: base.main_company
|
||||
location_id: stock.stock_location_stock
|
||||
logic: max
|
||||
name: OP/00003
|
||||
product_id: product_product_sugar0
|
||||
product_max_qty: 4.0
|
||||
product_min_qty: 2.0
|
||||
product_uom: product.product_uom_kgm
|
||||
qty_multiple: 1
|
||||
warehouse_id: stock.warehouse0
|
||||
-
|
||||
I want to produce 100 litres of Orange juice. I am creating a manufacturing order for this.
|
||||
I want to see how much quantities of sub products I need, to produce the Orange juice.
|
||||
-
|
||||
I compute the data. I get the bill of material of Orange juice and list of
|
||||
scheduled products according to my bom.
|
||||
-
|
||||
!record {model: mrp.production, id: mrp_production_mo0}:
|
||||
company_id: base.main_company
|
||||
date_planned: '2010-04-16 15:53:36'
|
||||
location_dest_id: stock.stock_location_output
|
||||
location_src_id: stock.stock_location_stock
|
||||
name: MO/00002
|
||||
product_id: product_product_orangejuice0
|
||||
product_qty: 100.0
|
||||
product_uom: product_uom_litre0
|
||||
-
|
||||
Creating an mrp.production record. Computing Bills of materials.
|
||||
-
|
||||
!record {model: mrp.production, id: mrp_production_mo0}:
|
||||
bom_id: mrp.mrp_bom_orangejuice0
|
||||
company_id: base.main_company
|
||||
date_planned: '2010-04-16 15:53:36'
|
||||
location_dest_id: stock.stock_location_output
|
||||
location_src_id: stock.stock_location_stock
|
||||
name: MO/00002
|
||||
product_id: mrp.product_product_orangejuice0
|
||||
product_lines:
|
||||
- name: Orange
|
||||
product_id: mrp.product_product_orange0
|
||||
product_qty: 50.0
|
||||
product_uom: product.product_uom_kgm
|
||||
production_id: mrp_production_mo0
|
||||
- name: Sugar
|
||||
product_id: mrp.product_product_sugar0
|
||||
product_qty: 2.0
|
||||
product_uom: product.product_uom_kgm
|
||||
production_id: mrp_production_mo0
|
||||
- name: Water
|
||||
product_id: mrp.product_product_water0
|
||||
product_qty: 80.0
|
||||
product_uom: mrp.product_uom_litre0
|
||||
production_id: mrp_production_mo0
|
||||
product_qty: 100.0
|
||||
product_uom: mrp.product_uom_litre0
|
||||
-
|
||||
I confirm the order.
|
||||
-
|
||||
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_mo0}
|
||||
-
|
||||
I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water.
|
||||
-
|
||||
!python {model: mrp.procurement}: |
|
||||
from tools.translate import _
|
||||
proc_ids = self.search(cr, uid, [('origin','=',':MO/00002')])
|
||||
assert proc_ids, _('No Procurements!')
|
||||
-
|
||||
The scheduler runs.
|
||||
-
|
||||
!function {model: mrp.procurement, name: run_scheduler}:
|
||||
- model: mrp.procurement
|
||||
search: "[('origin','=',':MO/00002')]"
|
||||
-
|
||||
I am checking Internal picking. I see one picking for Orange juice and its
|
||||
stock moves for Oranges, Sugar and Water made correctly.
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
from tools.translate import _
|
||||
pick_ids = self.search(cr, uid, [('origin','=',':MO/00002'),('type','=','internal')])
|
||||
assert pick_ids, _('No Internal Pickings!')
|
||||
-
|
||||
According to minimum stock rules. I have 2 purchase orders for
|
||||
Sugar with 6 Kg from Axelor and Orange 60 Kg from ASUStek.
|
||||
-
|
||||
I confirm the purchase order of Sugar and Orange.
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
from tools.translate import _
|
||||
import netsvc
|
||||
purch_ids = self.search(cr, uid, [('origin','in',['SCHEDULER','OP/00002','OP/00003'])])
|
||||
assert purch_ids, _('No Purchase Orders were made!')
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
for p_id in purch_ids:
|
||||
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr)
|
||||
-
|
||||
I get the approval from both the suppliers. So I approve my purchase orders.
|
||||
-
|
||||
!python {model: purchase.order}: |
|
||||
from tools.translate import _
|
||||
import netsvc
|
||||
purch_ids = self.search(cr, uid, [('origin','in',['SCHEDULER','OP/00002','OP/00003']),('state','=','confirmed')])
|
||||
assert purch_ids, _('No Confirmed Purchase Orders found!')
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
for p_id in purch_ids:
|
||||
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_approve', cr)
|
||||
-
|
||||
I see two incoming pickings for Orange and Sugar.
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
from tools.translate import _
|
||||
pick_ids = self.search(cr, uid, [('origin','in',['PO00001:SCHEDULER','PO00002:SCHEDULER','PO00003:OP/00002','PO00004:OP/00003']),('type','=','in')])
|
||||
assert pick_ids, _('No Incoming Shipments found!')
|
||||
-
|
||||
I receive both the products. My incoming pickings are done.
|
||||
-
|
||||
!record {model: stock.partial.picking, id: stock_partial_picking0}:
|
||||
date: '2010-04-30 16:53:36'
|
||||
partner_id: base.res_partner_asus
|
||||
address_id: base.res_partner_address_tang
|
||||
-
|
||||
!python {model: stock.partial.picking}: |
|
||||
pick_obj = self.pool.get('stock.picking')
|
||||
picking_ids = pick_obj.search(cr, uid, [('origin','in',['PO00001:SCHEDULER','PO00002:SCHEDULER','PO00003:OP/00002','PO00004:OP/00003']),('type','=','in')])
|
||||
self.do_partial(cr, uid, [1],context={'active_ids': picking_ids})
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
-
|
||||
In order to test the manufacturing order working with procurements I will use
|
||||
some products with different supply method and procurement method, also check
|
||||
the bills of material for the products.
|
||||
-
|
||||
I am creating one manufacturing order.
|
||||
-
|
||||
!record {model: mrp.production, id: mrp_production_mo0}:
|
||||
bom_id: mrp.mrp_bom_9
|
||||
routing_id: mrp.mrp_routing_0
|
||||
company_id: base.main_company
|
||||
date_planned: '2010-05-06 14:55:52'
|
||||
location_dest_id: stock.stock_location_stock
|
||||
location_src_id: stock.stock_location_stock
|
||||
name: MO/00004
|
||||
product_id: product.product_product_pc1
|
||||
product_qty: 5.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
-
|
||||
Creating a mrp.production.workcenter.line record
|
||||
-
|
||||
!record {model: mrp.production.workcenter.line, id: mrp_production_workcenter_line_assemblyline0}:
|
||||
cycle: 5.0
|
||||
hour: 10.0
|
||||
name: Assembly Line 1
|
||||
production_id: mrp_production_mo0
|
||||
sequence: 0.0
|
||||
workcenter_id: mrp.mrp_workcenter_0
|
||||
-
|
||||
Creating a mrp.production.product.line record
|
||||
-
|
||||
!record {model: mrp.production.product.line, id: mrp_production_product_line_regularprocessorconfig0}:
|
||||
name: Regular processor config
|
||||
product_id: product.product_product_cpu_gen
|
||||
product_qty: 5.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
production_id: mrp_production_mo0
|
||||
-
|
||||
Creating a mrp.production.product.line record
|
||||
-
|
||||
!record {model: mrp.production.product.line, id: mrp_production_product_line_hddseagategb0}:
|
||||
name: HDD Seagate 7200.8 80GB
|
||||
product_id: product.product_product_hdd1
|
||||
product_qty: 5.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
production_id: mrp_production_mo0
|
||||
-
|
||||
Creating a mrp.production.product.line record
|
||||
-
|
||||
!record {model: mrp.production.product.line, id: mrp_production_product_line_atxmidsizetower0}:
|
||||
name: ATX Mid-size Tower
|
||||
product_id: product.product_product_tow1
|
||||
product_qty: 5.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
production_id: mrp_production_mo0
|
||||
-
|
||||
Creating a mrp.production.product.line record
|
||||
-
|
||||
!record {model: mrp.production.product.line, id: mrp_production_product_line_mouse0}:
|
||||
name: Mouse
|
||||
product_id: product.product_product_25
|
||||
product_qty: 5.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
production_id: mrp_production_mo0
|
||||
-
|
||||
Creating a mrp.production.product.line record
|
||||
-
|
||||
!record {model: mrp.production.product.line, id: mrp_production_product_line_keyboard0}:
|
||||
name: Keyboard
|
||||
product_id: product.product_product_24
|
||||
product_qty: 5.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
production_id: mrp_production_mo0
|
||||
-
|
||||
I confirm the order.
|
||||
-
|
||||
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_mo0}
|
||||
-
|
||||
I am checking Procurement orders.
|
||||
-
|
||||
!python {model: mrp.procurement}: |
|
||||
from tools.translate import _
|
||||
proc_ids = self.search(cr, uid, [('origin','=',':MO/00004')])
|
||||
assert proc_ids, _('No Procurements!')
|
||||
-
|
||||
The scheduler runs.
|
||||
-
|
||||
!function {model: mrp.procurement, name: run_scheduler}:
|
||||
- model: mrp.procurement
|
||||
search: "[('origin','=',':MO/00004')]"
|
||||
-
|
||||
I am checking Internal picking.
|
||||
-
|
||||
!python {model: stock.picking}: |
|
||||
from tools.translate import _
|
||||
pick_ids = self.search(cr, uid, [('origin','=',':MO/00004'),('type','=','internal')])
|
||||
assert pick_ids, _('No Internal Pickings!')
|
||||
-
|
||||
I see that there is a manufacturing order for the subproduct of PC1 with ready state.
|
||||
-
|
||||
!python {model: mrp.production}: |
|
||||
from tools.translate import _
|
||||
order_ids = self.search(cr, uid, [('origin','=',':MO/00004'),('state','=','ready')])
|
||||
assert order_ids, _('No manufacturing order!')
|
||||
-
|
||||
I start producing that product first. So I marked it as started.
|
||||
-
|
||||
!record {model: mrp.product.produce, id: mrp_product_produce0}:
|
||||
product_qty: 5.00
|
||||
mode: 'consume_produce'
|
||||
-
|
||||
!python {model: mrp.product.produce}: |
|
||||
prod_obj = self.pool.get('mrp.production')
|
||||
prod_ids = prod_obj.search(cr, uid, [('origin','=',':MO/00004')])
|
||||
self.do_produce(cr, uid, [1], context={'active_ids': prod_ids})
|
||||
-
|
||||
Now the manufacturing order for subproduct CPU_GEN is done. And manufacturing
|
||||
order for PC1 is in ready state.
|
||||
-
|
||||
!python {model: mrp.production}: |
|
||||
from tools.translate import _
|
||||
prod_ids = self.search(cr, uid, [('origin','=',':MO/00004'),('state','=','done')])
|
||||
assert prod_ids, _('Manufacturing order is yet not done!')
|
||||
-
|
||||
I start producing the product PC1.
|
||||
-
|
||||
!workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0}
|
||||
-
|
||||
!python {model: mrp.product.produce}: |
|
||||
from tools.translate import _
|
||||
prod_obj = self.pool.get('mrp.production')
|
||||
prod_ids = prod_obj.search(cr, uid, [('product_id.default_code','=','PC1')])
|
||||
self.do_produce(cr, uid, [1], context={'active_ids': prod_ids})
|
||||
@@ -20,14 +20,10 @@
|
||||
##############################################################################
|
||||
|
||||
import mrp_product_produce
|
||||
import orderpoint_procurement
|
||||
import mrp_procurement
|
||||
import schedulers_all
|
||||
import mrp_price
|
||||
import mrp_workcenter_load
|
||||
#import mrp_track_prod
|
||||
import change_production_qty
|
||||
import make_procurement_product
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -56,33 +56,35 @@ class mrp_track_move(osv.osv_memory):
|
||||
"""
|
||||
res = super(mrp_track_move, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
|
||||
record_id = context and context.get('active_id', False) or False
|
||||
if record_id:
|
||||
prod_obj = self.pool.get('mrp.production')
|
||||
prod = prod_obj.browse(cr, uid, record_id)
|
||||
try:
|
||||
if prod.state != 'done':
|
||||
res['arch'] = '''<form string="Track lines">
|
||||
<label colspan="4" string="You can not split an unfinished production Output." />
|
||||
<group col="2" colspan="4">
|
||||
<button icon='gtk-cancel' special="cancel"
|
||||
string="Exit" />
|
||||
</group>
|
||||
</form>
|
||||
'''
|
||||
else:
|
||||
arch_lst = ['<form string="Track lines">', '<label colspan="4" string="The field on each line says whether this lot should be tracked or not." />']
|
||||
for m in [line for line in prod.move_created_ids]:
|
||||
quantity = m.product_qty
|
||||
res['fields']['track%s' %m.id] = {'string' : m.product_id.name, 'type' : 'boolean', 'default' : lambda x,y,z: False}
|
||||
arch_lst.append('<field name="track%s" />\n<newline />' %m.id)
|
||||
arch_lst.append('<group col="2" colspan="4">')
|
||||
arch_lst.append('<button icon=\'gtk-cancel\' special="cancel" string="Cancel" />')
|
||||
arch_lst.append('<button name="track_lines" string="Track" colspan="1" type="object" icon="gtk-ok" />')
|
||||
arch_lst.append('</group>')
|
||||
arch_lst.append('</form>')
|
||||
res['arch'] = '\n'.join(arch_lst)
|
||||
except Exception,e:
|
||||
return res
|
||||
active_model = context.get('active_model')
|
||||
|
||||
if not record_id or (active_model and active_model != 'mrp.production'):
|
||||
return res
|
||||
|
||||
prod_obj = self.pool.get('mrp.production')
|
||||
prod = prod_obj.browse(cr, uid, record_id)
|
||||
if prod.state != 'done':
|
||||
res['arch'] = '''<form string="Track lines">
|
||||
<label colspan="4" string="You can not split an unfinished production Output." />
|
||||
<group col="2" colspan="4">
|
||||
<button icon='gtk-cancel' special="cancel"
|
||||
string="Exit" />
|
||||
</group>
|
||||
</form>
|
||||
'''
|
||||
else:
|
||||
arch_lst = ['<form string="Track lines">', '<label colspan="4" string="The field on each line says whether this lot should be tracked or not." />']
|
||||
for m in [line for line in prod.move_created_ids]:
|
||||
quantity = m.product_qty
|
||||
res['fields']['track%s' %m.id] = {'string' : m.product_id.name, 'type' : 'boolean', 'default' : lambda x,y,z: False}
|
||||
arch_lst.append('<field name="track%s" />\n<newline />' %m.id)
|
||||
arch_lst.append('<group col="2" colspan="4">')
|
||||
arch_lst.append('<button icon=\'gtk-cancel\' special="cancel" string="Cancel" />')
|
||||
arch_lst.append('<button name="track_lines" string="Track" colspan="1" type="object" icon="gtk-ok" />')
|
||||
arch_lst.append('</group>')
|
||||
arch_lst.append('</form>')
|
||||
res['arch'] = '\n'.join(arch_lst)
|
||||
|
||||
return res
|
||||
|
||||
def track_lines(self, cr, uid, ids, context):
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import mrp_procurement
|
||||
import wizard
|
||||
import schedulers
|
||||
import company
|
||||
@@ -0,0 +1,52 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
{
|
||||
"name" : "Procurements",
|
||||
"version" : "1.0",
|
||||
"author" : "Tiny",
|
||||
"website" : "http://www.openerp.com",
|
||||
"category" : "Generic Modules/Production",
|
||||
"depends" : ["base","process", "product", "stock"],
|
||||
"description": """
|
||||
This is the module for computing Procurements.
|
||||
""",
|
||||
'init_xml': [],
|
||||
'update_xml': [
|
||||
'security/ir.model.access.csv',
|
||||
'security/mrp_procurement_security.xml',
|
||||
'mrp_procurement_data.xml',
|
||||
'wizard/make_procurement_view.xml',
|
||||
'wizard/mrp_procurement_view.xml',
|
||||
'wizard/orderpoint_procurement_view.xml',
|
||||
'mrp_procurement_view.xml',
|
||||
'wizard/schedulers_all_view.xml',
|
||||
'mrp_procurement_workflow.xml',
|
||||
'process/procurement_process.xml',
|
||||
"company_view.xml",
|
||||
],
|
||||
# 'demo_xml': [],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '',
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,38 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import osv,fields
|
||||
|
||||
class company(osv.osv):
|
||||
_inherit = 'res.company'
|
||||
_columns = {
|
||||
'schedule_range': fields.float('Scheduler Range', required=True,
|
||||
help="This is the time frame analysed by the scheduler when "\
|
||||
"computing procurements. All procurements that are not between "\
|
||||
"today and today+range are skipped for futur computation."),
|
||||
}
|
||||
_defaults = {
|
||||
'schedule_range': lambda *a: 80.0,
|
||||
}
|
||||
company()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<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 & Logistic Scheduler" colspan="4"/>
|
||||
<field name="schedule_range"/>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,527 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from mx import DateTime
|
||||
from osv import osv, fields
|
||||
from tools.translate import _
|
||||
import netsvc
|
||||
import time
|
||||
|
||||
|
||||
class mrp_property_group(osv.osv):
|
||||
"""
|
||||
Group of mrp properties.
|
||||
"""
|
||||
_name = 'mrp.property.group'
|
||||
_description = 'Property Group'
|
||||
_columns = {
|
||||
'name': fields.char('Property Group', size=64, required=True),
|
||||
'description': fields.text('Description'),
|
||||
}
|
||||
mrp_property_group()
|
||||
|
||||
class mrp_property(osv.osv):
|
||||
"""
|
||||
Properties of mrp.
|
||||
"""
|
||||
_name = 'mrp.property'
|
||||
_description = 'Property'
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True),
|
||||
'composition': fields.selection([('min','min'),('max','max'),('plus','plus')], 'Properties composition', required=True, help="Not used in computations, for information purpose only."),
|
||||
'group_id': fields.many2one('mrp.property.group', 'Property Group', required=True),
|
||||
'description': fields.text('Description'),
|
||||
}
|
||||
_defaults = {
|
||||
'composition': lambda *a: 'min',
|
||||
}
|
||||
mrp_property()
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Procurement
|
||||
# ------------------------------------------------------------------
|
||||
#
|
||||
# Produce, Buy or Find products and place a move
|
||||
# then wizard for picking lists & move
|
||||
#
|
||||
class mrp_procurement(osv.osv):
|
||||
"""
|
||||
Procurement Orders
|
||||
"""
|
||||
_name = "mrp.procurement"
|
||||
_description = "Procurement"
|
||||
_order = 'priority,date_planned'
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Reason', size=64, required=True, help='Procurement name.'),
|
||||
'origin': fields.char('Source Document', size=64,
|
||||
help="Reference of the document that created this Procurement.\n"
|
||||
"This is automatically completed by Open ERP."),
|
||||
'priority': fields.selection([('0','Not urgent'),('1','Normal'),('2','Urgent'),('3','Very Urgent')], 'Priority', required=True),
|
||||
'date_planned': fields.datetime('Scheduled date', required=True),
|
||||
'date_close': fields.datetime('Date Closed'),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_qty': fields.float('Quantity', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_uom': fields.many2one('product.uom', 'Product UoM', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_uos_qty': fields.float('UoS Quantity', states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'product_uos': fields.many2one('product.uom', 'Product UoS', states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'move_id': fields.many2one('stock.move', 'Reservation', ondelete='set null'),
|
||||
'close_move': fields.boolean('Close Move at end', required=True),
|
||||
'location_id': fields.many2one('stock.location', 'Location', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'procure_method': fields.selection([('make_to_stock','from stock'),('make_to_order','on order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
|
||||
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
|
||||
" a make to order method."),
|
||||
|
||||
'note': fields.text('Note'),
|
||||
|
||||
'property_ids': fields.many2many('mrp.property', 'mrp_procurement_property_rel', 'procurement_id','property_id', 'Properties'),
|
||||
|
||||
'message': fields.char('Latest error', size=64, help="Exception occurred while computing procurement orders."),
|
||||
'state': fields.selection([
|
||||
('draft','Draft'),
|
||||
('confirmed','Confirmed'),
|
||||
('exception','Exception'),
|
||||
('running','Running'),
|
||||
('cancel','Cancel'),
|
||||
('ready','Ready'),
|
||||
('done','Done'),
|
||||
('waiting','Waiting')], 'State', required=True,
|
||||
help='When a procurement is created the state is set to \'Draft\'.\n If the procurement is confirmed, the state is set to \'Confirmed\'.\
|
||||
\nAfter confirming the state is set to \'Running\'.\n If any exception arises in the order then the state is set to \'Exception\'.\n Once the exception is removed the state becomes \'Ready\'.\n It is in \'Waiting\'. state when the procurement is waiting for another one to finish.'),
|
||||
'note': fields.text('Note'),
|
||||
'company_id': fields.many2one('res.company','Company',required=True),
|
||||
}
|
||||
_defaults = {
|
||||
'state': lambda *a: 'draft',
|
||||
'priority': lambda *a: '1',
|
||||
'date_planned': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'close_move': lambda *a: 0,
|
||||
'procure_method': lambda *a: 'make_to_order',
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.procurement', context=c)
|
||||
}
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
procurements = self.read(cr, uid, ids, ['state'])
|
||||
unlink_ids = []
|
||||
for s in procurements:
|
||||
if s['state'] in ['draft','cancel']:
|
||||
unlink_ids.append(s['id'])
|
||||
else:
|
||||
raise osv.except_osv(_('Invalid action !'), _('Cannot delete Procurement Order(s) which are in %s State!' % s['state']))
|
||||
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id, context={}):
|
||||
""" Finds UoM and UoS of changed product.
|
||||
@param product_id: Changed id of product.
|
||||
@return: Dictionary of values.
|
||||
"""
|
||||
if product_id:
|
||||
w = self.pool.get('product.product').browse(cr, uid, product_id, context)
|
||||
v = {
|
||||
'product_uom': w.uom_id.id,
|
||||
'product_uos': w.uos_id and w.uos_id.id or w.uom_id.id
|
||||
}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def check_product(self, cr, uid, ids):
|
||||
""" Checks product type.
|
||||
@return: True or False
|
||||
"""
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_id.type in ('product', 'consu'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_move_cancel(self, cr, uid, ids, context={}):
|
||||
""" Checks if move is cancelled or not.
|
||||
@return: True or False.
|
||||
"""
|
||||
res = True
|
||||
ok = False
|
||||
for procurement in self.browse(cr, uid, ids, context):
|
||||
if procurement.move_id:
|
||||
ok = True
|
||||
if not procurement.move_id.state == 'cancel':
|
||||
res = False
|
||||
return res and ok
|
||||
|
||||
def check_move_done(self, cr, uid, ids, context={}):
|
||||
""" Checks if move is done or not.
|
||||
@return: True or False.
|
||||
"""
|
||||
res = True
|
||||
for proc in self.browse(cr, uid, ids, context):
|
||||
if proc.move_id:
|
||||
if not proc.move_id.state == 'done':
|
||||
res = False
|
||||
return res
|
||||
|
||||
#
|
||||
# This method may be overrided by objects that override mrp.procurment
|
||||
# for computing their own purpose
|
||||
#
|
||||
def _quantity_compute_get(self, cr, uid, proc, context={}):
|
||||
""" Finds sold quantity of product.
|
||||
@param proc: Current procurement.
|
||||
@return: Quantity or False.
|
||||
"""
|
||||
if proc.product_id.type == 'product':
|
||||
if proc.move_id.product_uos:
|
||||
return proc.move_id.product_uos_qty
|
||||
return False
|
||||
|
||||
def _uom_compute_get(self, cr, uid, proc, context={}):
|
||||
""" Finds UoS if product is Stockable Product.
|
||||
@param proc: Current procurement.
|
||||
@return: UoS or False.
|
||||
"""
|
||||
if proc.product_id.type == 'product':
|
||||
if proc.move_id.product_uos:
|
||||
return proc.move_id.product_uos.id
|
||||
return False
|
||||
|
||||
#
|
||||
# Return the quantity of product shipped/produced/served, wich may be
|
||||
# different from the planned quantity
|
||||
#
|
||||
def quantity_get(self, cr, uid, id, context={}):
|
||||
""" Finds quantity of product used in procurement.
|
||||
@return: Quantity of product.
|
||||
"""
|
||||
proc = self.browse(cr, uid, id, context)
|
||||
result = self._quantity_compute_get(cr, uid, proc, context)
|
||||
if not result:
|
||||
result = proc.product_qty
|
||||
return result
|
||||
|
||||
def uom_get(self, cr, uid, id, context=None):
|
||||
""" Finds UoM of product used in procurement.
|
||||
@return: UoM of product.
|
||||
"""
|
||||
proc = self.browse(cr, uid, id, context)
|
||||
result = self._uom_compute_get(cr, uid, proc, context)
|
||||
if not result:
|
||||
result = proc.product_uom.id
|
||||
return result
|
||||
|
||||
def check_waiting(self, cr, uid, ids, context=[]):
|
||||
""" Checks state of move.
|
||||
@return: True or False
|
||||
"""
|
||||
for procurement in self.browse(cr, uid, ids, context=context):
|
||||
if procurement.move_id and procurement.move_id.state == 'auto':
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_produce_service(self, cr, uid, procurement, context=[]):
|
||||
return True
|
||||
|
||||
def check_produce_product(self, cr, uid, procurement, context=[]):
|
||||
""" Finds BoM of a product if not found writes exception message.
|
||||
@param procurement: Current procurement.
|
||||
@return: True or False.
|
||||
"""
|
||||
return True
|
||||
|
||||
def check_make_to_stock(self, cr, uid, ids, context={}):
|
||||
""" Checks product type.
|
||||
@return: True or False
|
||||
"""
|
||||
ok = True
|
||||
for procurement in self.browse(cr, uid, ids, context=context):
|
||||
if procurement.product_id.type == 'service':
|
||||
ok = ok and self._check_make_to_stock_service(cr, uid, procurement, context)
|
||||
else:
|
||||
ok = ok and self._check_make_to_stock_product(cr, uid, procurement, context)
|
||||
return ok
|
||||
|
||||
def check_produce(self, cr, uid, ids, context={}):
|
||||
""" Checks product type.
|
||||
@return: True or Product Id.
|
||||
"""
|
||||
res = True
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid)
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_id.product_tmpl_id.supply_method <> 'produce':
|
||||
if procurement.product_id.seller_ids:
|
||||
partner = procurement.product_id.seller_ids[0].name
|
||||
if user.company_id and user.company_id.partner_id:
|
||||
if partner.id == user.company_id.partner_id.id:
|
||||
return True
|
||||
return False
|
||||
if procurement.product_id.product_tmpl_id.type=='service':
|
||||
res = res and self.check_produce_service(cr, uid, procurement, context)
|
||||
else:
|
||||
res = res and self.check_produce_product(cr, uid, procurement, context)
|
||||
if not res:
|
||||
return False
|
||||
return res
|
||||
|
||||
def check_buy(self, cr, uid, ids):
|
||||
""" Checks product type.
|
||||
@return: True or Product Id.
|
||||
"""
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid)
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_id.product_tmpl_id.supply_method <> 'buy':
|
||||
return False
|
||||
if not procurement.product_id.seller_ids:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('No supplier defined for this product !'), procurement.id))
|
||||
return False
|
||||
partner = procurement.product_id.seller_ids[0].name
|
||||
if user.company_id and user.company_id.partner_id:
|
||||
if partner.id == user.company_id.partner_id.id:
|
||||
return False
|
||||
address_id = partner_obj.address_get(cr, uid, [partner.id], ['delivery'])['delivery']
|
||||
if not address_id:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('No address defined for the supplier'), procurement.id))
|
||||
return False
|
||||
return True
|
||||
|
||||
def test_cancel(self, cr, uid, ids):
|
||||
""" Tests whether state of move is cancelled or not.
|
||||
@return: True or False
|
||||
"""
|
||||
for record in self.browse(cr, uid, ids):
|
||||
if record.move_id and record.move_id.state == 'cancel':
|
||||
return True
|
||||
return False
|
||||
|
||||
def action_confirm(self, cr, uid, ids, context={}):
|
||||
""" Confirms procurement and writes exception message if any.
|
||||
@return: True
|
||||
"""
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.product_qty <= 0.00:
|
||||
raise osv.except_osv(_('Data Insufficient !'), _('Please check the Quantity of Procurement Order(s), it should not be less than 1!'))
|
||||
if procurement.product_id.type in ('product', 'consu'):
|
||||
if not procurement.move_id:
|
||||
source = procurement.location_id.id
|
||||
if procurement.procure_method == 'make_to_order':
|
||||
source = procurement.product_id.product_tmpl_id.property_stock_procurement.id
|
||||
id = move_obj.create(cr, uid, {
|
||||
'name': 'PROC:' + procurement.name,
|
||||
'location_id': source,
|
||||
'location_dest_id': procurement.location_id.id,
|
||||
'product_id': procurement.product_id.id,
|
||||
'product_qty': procurement.product_qty,
|
||||
'product_uom': procurement.product_uom.id,
|
||||
'date_planned': procurement.date_planned,
|
||||
'state': 'confirmed',
|
||||
'company_id': procurement.company_id.id,
|
||||
})
|
||||
self.write(cr, uid, [procurement.id], {'move_id': id, 'close_move': 1})
|
||||
else:
|
||||
# TODO: check this
|
||||
if procurement.procure_method == 'make_to_stock' and procurement.move_id.state in ('waiting',):
|
||||
id = move_obj.write(cr, uid, [procurement.move_id.id], {'state':'confirmed'})
|
||||
self.write(cr, uid, ids, {'state': 'confirmed', 'message': ''})
|
||||
return True
|
||||
|
||||
def action_move_assigned(self, cr, uid, ids, context={}):
|
||||
""" Changes procurement state to Running and writes message.
|
||||
@return: True
|
||||
"""
|
||||
self.write(cr, uid, ids, {'state': 'running', 'message': _('from stock: products assigned.')})
|
||||
return True
|
||||
|
||||
def _check_make_to_stock_service(self, cr, uid, procurement, context={}):
|
||||
return True
|
||||
|
||||
def _check_make_to_stock_product(self, cr, uid, procurement, context={}):
|
||||
""" Checks procurement move state.
|
||||
@param procurement: Current procurement.
|
||||
@return: True or move id.
|
||||
"""
|
||||
ok = True
|
||||
if procurement.move_id:
|
||||
id = procurement.move_id.id
|
||||
if not (procurement.move_id.state in ('done','assigned','cancel')):
|
||||
ok = ok and self.pool.get('stock.move').action_assign(cr, uid, [id])
|
||||
cr.execute('select count(id) from stock_warehouse_orderpoint where product_id=%s', (procurement.product_id.id,))
|
||||
if not cr.fetchone()[0]:
|
||||
cr.execute('update mrp_procurement set message=%s where id=%s', (_('from stock and no minimum orderpoint rule defined'), procurement.id))
|
||||
return ok
|
||||
|
||||
def action_produce_assign_service(self, cr, uid, ids, context={}):
|
||||
""" Changes procurement state to Running.
|
||||
@return: True
|
||||
"""
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
||||
return True
|
||||
|
||||
def action_produce_assign_product(self, cr, uid, ids, context={}):
|
||||
""" This is action which call from workflow to assign production order to procurements
|
||||
@return: True
|
||||
"""
|
||||
return 0
|
||||
|
||||
|
||||
def action_po_assign(self, cr, uid, ids, context={}):
|
||||
""" This is action which call from workflow to assign purchase order to procurements
|
||||
@return: True
|
||||
"""
|
||||
return 0
|
||||
|
||||
def action_cancel(self, cr, uid, ids):
|
||||
""" Cancels procurement and writes move state to Assigned.
|
||||
@return: True
|
||||
"""
|
||||
todo = []
|
||||
todo2 = []
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for proc in self.browse(cr, uid, ids):
|
||||
if proc.close_move:
|
||||
if proc.move_id.state not in ('done', 'cancel'):
|
||||
todo2.append(proc.move_id.id)
|
||||
else:
|
||||
if proc.move_id and proc.move_id.state == 'waiting':
|
||||
todo.append(proc.move_id.id)
|
||||
if len(todo2):
|
||||
move_obj.action_cancel(cr, uid, todo2)
|
||||
if len(todo):
|
||||
move_obj.write(cr, uid, todo, {'state': 'assigned'})
|
||||
self.write(cr, uid, ids, {'state': 'cancel'})
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
for id in ids:
|
||||
wf_service.trg_trigger(uid, 'mrp.procurement', id, cr)
|
||||
return True
|
||||
|
||||
def action_check_finnished(self, cr, uid, ids):
|
||||
return self.check_move_done(cr, uid, ids)
|
||||
|
||||
def action_check(self, cr, uid, ids):
|
||||
""" Checks procurement move state whether assigned or done.
|
||||
@return: True
|
||||
"""
|
||||
ok = False
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.move_id.state == 'assigned' or procurement.move_id.state == 'done':
|
||||
self.action_done(cr, uid, [procurement.id])
|
||||
ok = True
|
||||
return ok
|
||||
|
||||
def action_ready(self, cr, uid, ids):
|
||||
""" Changes procurement state to Ready.
|
||||
@return: True
|
||||
"""
|
||||
res = self.write(cr, uid, ids, {'state': 'ready'})
|
||||
return res
|
||||
|
||||
def action_done(self, cr, uid, ids):
|
||||
""" Changes procurement state to Done and writes Closed date.
|
||||
@return: True
|
||||
"""
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
if procurement.move_id:
|
||||
if procurement.close_move and (procurement.move_id.state <> 'done'):
|
||||
move_obj.action_done(cr, uid, [procurement.move_id.id])
|
||||
res = self.write(cr, uid, ids, {'state': 'done', 'date_close': time.strftime('%Y-%m-%d')})
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
for id in ids:
|
||||
wf_service.trg_trigger(uid, 'mrp.procurement', id, cr)
|
||||
return res
|
||||
|
||||
def run_scheduler(self, cr, uid, automatic=False, use_new_cursor=False, context=None):
|
||||
''' Runs through scheduler.
|
||||
@param use_new_cursor: False or the dbname
|
||||
'''
|
||||
if not context:
|
||||
context={}
|
||||
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)
|
||||
|
||||
mrp_procurement()
|
||||
|
||||
|
||||
class stock_warehouse_orderpoint(osv.osv):
|
||||
"""
|
||||
Defines Minimum stock rules.
|
||||
"""
|
||||
_name = "stock.warehouse.orderpoint"
|
||||
_description = "Orderpoint minimum rule"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=32, required=True),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the orderpoint without removing it."),
|
||||
'logic': fields.selection([('max','Order to Max'),('price','Best price (not yet active!)')], 'Reordering Mode', required=True),
|
||||
'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse', required=True),
|
||||
'location_id': fields.many2one('stock.location', 'Location', required=True),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True, ondelete='cascade', domain=[('type','=','product')]),
|
||||
'product_uom': fields.many2one('product.uom', 'Product UOM', required=True ),
|
||||
'product_min_qty': fields.float('Min Quantity', required=True,
|
||||
help="When the virtual stock goes belong the Min Quantity, Open ERP generates "\
|
||||
"a procurement to bring the virtual stock to the Max Quantity."),
|
||||
'product_max_qty': fields.float('Max Quantity', required=True,
|
||||
help="When the virtual stock goes belong the Min Quantity, Open ERP generates "\
|
||||
"a procurement to bring the virtual stock to the Max Quantity."),
|
||||
'qty_multiple': fields.integer('Qty Multiple', required=True,
|
||||
help="The procurement quantity will by rounded up to this multiple."),
|
||||
'procurement_id': fields.many2one('mrp.procurement', 'Latest procurement'),
|
||||
'company_id': fields.many2one('res.company','Company',required=True),
|
||||
}
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'logic': lambda *a: 'max',
|
||||
'qty_multiple': lambda *a: 1,
|
||||
'name': lambda x,y,z,c: x.pool.get('ir.sequence').get(y,z,'mrp.warehouse.orderpoint') or '',
|
||||
'product_uom': lambda sel, cr, uid, context: context.get('product_uom', False),
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.warehouse.orderpoint', context=c)
|
||||
}
|
||||
|
||||
def onchange_warehouse_id(self, cr, uid, ids, warehouse_id, context={}):
|
||||
""" Finds location id for changed warehouse.
|
||||
@param warehouse_id: Changed id of warehouse.
|
||||
@return: Dictionary of values.
|
||||
"""
|
||||
if warehouse_id:
|
||||
w = self.pool.get('stock.warehouse').browse(cr, uid, warehouse_id, context)
|
||||
v = {'location_id': w.lot_stock_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id, context={}):
|
||||
""" Finds UoM for changed product.
|
||||
@param product_id: Changed id of product.
|
||||
@return: Dictionary of values.
|
||||
"""
|
||||
if product_id:
|
||||
prod = self.pool.get('product.product').browse(cr,uid,product_id)
|
||||
v = {'product_uom': prod.uom_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def copy(self, cr, uid, id, default=None,context={}):
|
||||
if not default:
|
||||
default = {}
|
||||
default.update({
|
||||
'name': self.pool.get('ir.sequence').get(cr, uid, 'mrp.warehouse.orderpoint') or '',
|
||||
})
|
||||
return super(stock_warehouse_orderpoint, self).copy(cr, uid, id, default, context)
|
||||
|
||||
stock_warehouse_orderpoint()
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<record forcecreate="True" id="ir_cron_scheduler_action" model="ir.cron">
|
||||
<field name="name">Run mrp scheduler</field>
|
||||
<field eval="False" name="active"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall"/>
|
||||
<field eval="'mrp.procurement'" name="model"/>
|
||||
<field eval="'run_scheduler'" name="function"/>
|
||||
<field eval="'(False,)'" name="args"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,251 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<!--
|
||||
Procurement
|
||||
-->
|
||||
|
||||
<record id="mrp_procurement_tree_view" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.tree</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Procurement Lines" colors="red:state=='draft';black:state=='running';green:state=='confirmed';gray:state in ['done','cancel']">
|
||||
<field name="date_planned" widget="date"/>
|
||||
<field name="origin"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_qty"/>
|
||||
<field name="product_uom" string="UOM"/>
|
||||
<field name="procure_method"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<record id="mrp_procurement_form_view" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.form</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Procurement">
|
||||
<group col="2" colspan="2">
|
||||
<separator colspan="2" string="References"/>
|
||||
<field name="name" select="1" string="Procurement Reason"/>
|
||||
<field name="origin"/>
|
||||
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator colspan="2" string="Planification"/>
|
||||
<field name="date_planned" select="1"/>
|
||||
<field name="procure_method"/>
|
||||
<field name="priority" groups="base.group_extended"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Procurement Details">
|
||||
<separator colspan="4" string="Product & Location"/>
|
||||
<field name="product_id" select="1" on_change="onchange_product_id(product_id)"/>
|
||||
<field name="location_id" domain="[('usage','=','internal')]"/>
|
||||
<field name="product_qty"/>
|
||||
<field name="product_uom"/>
|
||||
|
||||
<field name="product_uos_qty" groups="product.group_uos"/>
|
||||
<field name="product_uos" groups="product.group_uos"/>
|
||||
|
||||
<separator colspan="4" string="Status"/>
|
||||
<field colspan="4" name="message" readonly="1"/>
|
||||
<field name="state" readonly="1"/>
|
||||
<group col="7" colspan="2">
|
||||
<button name="button_confirm" states="draft" string="Confirm" icon="gtk-apply"/>
|
||||
<button name="button_restart" states="exception" string="Retry" icon="gtk-convert"/>
|
||||
<button name="button_cancel" states="draft,exception,waiting" string="Cancel" icon="gtk-cancel"/>
|
||||
<button name="button_check" states="confirmed" string="Run Procurement" icon="gtk-media-play"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Extra Information">
|
||||
<separator colspan="4" string="Details"/>
|
||||
<field name="move_id" groups="base.group_extended"/>
|
||||
<field name="date_close"/>
|
||||
<field name="close_move" groups="base.group_extended"/>
|
||||
<group colspan="4" groups="base.group_extended">
|
||||
<separator colspan="4" string="Properties" />
|
||||
<field colspan="4" name="property_ids" nolabel="1"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<separator colspan="4" string="Note" />
|
||||
<field name="note" colspan="4" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_mrp_procurement_filter" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.select</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Procurement">
|
||||
<group col='10' colspan='4'>
|
||||
<filter icon="terp-mrp" string="Current" domain="[('state','in',('draft','confirmed'))]" default="1" help="Procurement Orders in draft or open state."/>
|
||||
<filter icon="terp-mrp" string="Exceptions" domain="[('state','=','exception')]" help="Procurement Orders with exceptions"/>
|
||||
<filter icon="terp-mrp" string="Late"
|
||||
domain="['&', ('date_planned::date','<', current_date), ('state', 'in', ('draft', 'confirmed'))]"
|
||||
help="Procurement started late" />
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name"/>
|
||||
<field name="origin"/>
|
||||
<field name="product_id" />
|
||||
<field name="date_planned" widget="date"/>
|
||||
<field name="state" />
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By" colspan="4" col="8">
|
||||
<filter string="Product" icon="terp-mrp" domain="[]" context="{'group_by':'product_id'}"/>
|
||||
<filter string="Reason" icon="terp-mrp" domain="[]" context="{'group_by':'name'}"/>
|
||||
<filter string="Scheduled Date" icon="terp-mrp" domain="[]" context="{'group_by':'date_planned'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<record id="mrp_procurement_action" model="ir.actions.act_window">
|
||||
<field name="name">Procurement Orders</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" eval="False"/>
|
||||
<field name="search_view_id" ref="view_mrp_procurement_filter"/>
|
||||
</record>
|
||||
|
||||
<record id="mrp_procurement_action3" model="ir.actions.act_window">
|
||||
<field name="name">Procurements</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="search_view_id" ref="view_mrp_procurement_filter"/>
|
||||
<field name="domain">[]</field>
|
||||
<field name="context">{}</field>
|
||||
</record>
|
||||
|
||||
<record id="mrp_procurement_action5" model="ir.actions.act_window">
|
||||
<field name="name">Procurement Exceptions</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state','=','exception')]</field>
|
||||
</record>
|
||||
|
||||
<record id="mrp_procurement_action4" model="ir.actions.act_window">
|
||||
<field name="name">Procurement Exceptions to Fix</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state','=','exception'), ('message', '<>', '')]</field>
|
||||
<field name="filter" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record id="mrp_procurement_action11" model="ir.actions.act_window">
|
||||
<field name="name">Temporary Procurement Exceptions</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.procurement</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('state','=','exception'), ('message', '=', '')]</field>
|
||||
</record>
|
||||
|
||||
<!-- Order Point -->
|
||||
<record id="view_warehouse_orderpoint_tree" model="ir.ui.view">
|
||||
<field name="name">stock.warehouse.orderpoint.tree</field>
|
||||
<field name="model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Minimum Stock Rules">
|
||||
<field name="name"/>
|
||||
<field name="warehouse_id"/>
|
||||
<field name="location_id"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_uom"/>
|
||||
<field name="product_min_qty"/>
|
||||
<field name="product_max_qty"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="warehouse_orderpoint_search">
|
||||
<field name="name">stock.warehouse.orderpoint.search</field>
|
||||
<field name="model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Minimum Stock Rules Search">
|
||||
<group col="10" colspan="4">
|
||||
<field name="name" select="1" />
|
||||
<field name="warehouse_id" select="1" widget="selection"/>
|
||||
<field name="location_id" select="1" />
|
||||
<field name="company_id" select="1" widget="selection"/>
|
||||
<field name="product_id" select="1"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By..." colspan="4" col="10">
|
||||
<filter string="Warehouse" icon="terp-stock" domain="[]" context="{'group_by':'warehouse_id'}"/>
|
||||
<filter string="Location" icon="terp-stock" domain="[]" context="{'group_by':'location_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_warehouse_orderpoint_form" model="ir.ui.view">
|
||||
<field name="name">stock.warehouse.orderpoint.form</field>
|
||||
<field name="model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Minimum Stock Rules">
|
||||
<group col="2" colspan="2">
|
||||
<separator string="General Information" colspan="2" />
|
||||
<field name="name" />
|
||||
<field name="product_id" on_change="onchange_product_id(product_id)"/>
|
||||
<field name="product_uom"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Locations" colspan="2" />
|
||||
<field name="warehouse_id" on_change="onchange_warehouse_id(warehouse_id)" widget="selection"/>
|
||||
<field name="location_id"/>
|
||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Quantity Rules" colspan="2" />
|
||||
<field name="product_min_qty"/>
|
||||
<field name="product_max_qty"/>
|
||||
<field name="qty_multiple"/>
|
||||
</group>
|
||||
<group col="2" colspan="2" groups="base.group_extended">
|
||||
<separator string="Misc" colspan="2" />
|
||||
<field name="procurement_id" readonly="1"/>
|
||||
<field name="active" />
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_orderpoint_form" model="ir.actions.act_window">
|
||||
<field name="name">Minimum Stock Rules</field>
|
||||
<field name="res_model">stock.warehouse.orderpoint</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="view_warehouse_orderpoint_tree"/>
|
||||
<field name="search_view_id" ref="warehouse_orderpoint_search" />
|
||||
</record>
|
||||
|
||||
<act_window domain="[('warehouse_id', '=', active_id)]" id="act_stock_warehouse_2_stock_warehouse_orderpoint" name="Minimum Stock Rules" res_model="stock.warehouse.orderpoint" src_model="stock.warehouse"/>
|
||||
|
||||
<!-- add product_uom to context to be the default value when adding new orderpoints -->
|
||||
<act_window
|
||||
context="{'product_uom': locals().has_key('uom_id') and uom_id}"
|
||||
domain="[('product_id', '=', active_id)]"
|
||||
id="act_product_product_2_stock_warehouse_orderpoint"
|
||||
name="Minimum Stock Rules"
|
||||
res_model="stock.warehouse.orderpoint"
|
||||
src_model="product.product"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,196 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- Procurement -->
|
||||
|
||||
<record id="wkf_procurement" model="workflow">
|
||||
<field name="name">mrp.procurement.basic</field>
|
||||
<field name="osv">mrp.procurement</field>
|
||||
<field name="on_create">True</field>
|
||||
</record>
|
||||
|
||||
<record id="act_draft" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="flow_start">True</field>
|
||||
<field name="name">draft</field>
|
||||
</record>
|
||||
<record id="act_cancel" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">cancel</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_cancel()</field>
|
||||
<field name="flow_stop">True</field>
|
||||
</record>
|
||||
<record id="act_confirm" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">confirm</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_confirm()</field>
|
||||
</record>
|
||||
<record id="act_confirm_wait" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">confirm_wait</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">write({'state':'exception'})</field>
|
||||
</record>
|
||||
<record id="act_confirm_mts" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">confirm_mts</field>
|
||||
</record>
|
||||
<record id="act_confirm_mto" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">confirm_mto</field>
|
||||
</record>
|
||||
<record id="act_make_to_stock" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">make_to_stock</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_move_assigned()</field>
|
||||
</record>
|
||||
<!-- <record id="act_produce_check" model="workflow.activity">-->
|
||||
<!-- <field name="wkf_id" ref="wkf_procurement"/>-->
|
||||
<!-- <field name="name">produce_check</field>-->
|
||||
<!-- </record>-->
|
||||
<!-- <record id="act_produce_service" model="workflow.activity">-->
|
||||
<!-- <field name="wkf_id" ref="wkf_procurement"/>-->
|
||||
<!-- <field name="name">produce_service</field>-->
|
||||
<!-- <field name="kind">function</field>-->
|
||||
<!-- <field name="action">action_produce_assign_service()</field>-->
|
||||
<!-- </record>-->
|
||||
<record id="act_make_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">ready</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_ready()</field>
|
||||
</record>
|
||||
<record id="act_wait_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="name">wait_done</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">write({'state':'waiting'})</field>
|
||||
</record>
|
||||
|
||||
<record id="act_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_procurement"/>
|
||||
<field name="flow_stop">True</field>
|
||||
<field name="name">done</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_done()</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_draft_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_confirm"/>
|
||||
<field name="signal">button_confirm</field>
|
||||
</record>
|
||||
<record id="trans_confirm_cancel2" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm"/>
|
||||
<field name="act_to" ref="act_wait_done"/>
|
||||
<field name="signal">button_wait_done</field>
|
||||
<field name="condition">True</field>
|
||||
</record>
|
||||
<record id="trans_confirm_wait_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_wait_done"/>
|
||||
<field name="act_to" ref="act_done"/>
|
||||
<field name="condition">check_move_done()</field>
|
||||
<field name="trigger_model">stock.move</field>
|
||||
<field name="trigger_expr_id">[move_id.id]</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_confirm_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_check</field>
|
||||
<field name="condition">test_cancel()</field>
|
||||
</record>
|
||||
<record id="trans_confirm_confirm_wait" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm"/>
|
||||
<field name="act_to" ref="act_confirm_wait"/>
|
||||
<field name="signal">button_check</field>
|
||||
<field name="condition">not test_cancel()</field>
|
||||
</record>
|
||||
<record id="trans_confirm_wait_confirm_mto" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_wait"/>
|
||||
<field name="act_to" ref="act_confirm_mto"/>
|
||||
<field name="condition">procure_method=='make_to_order'</field>
|
||||
</record>
|
||||
<record id="trans_confirm_wait_confirm_mts" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_wait"/>
|
||||
<field name="act_to" ref="act_confirm_mts"/>
|
||||
<field name="condition">procure_method=='make_to_stock'</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mts_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mts"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_waiting_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_wait_done"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mts_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mts"/>
|
||||
<field name="act_to" ref="act_confirm"/>
|
||||
<field name="signal">button_restart</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mto_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mto_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_confirm"/>
|
||||
<field name="signal">button_restart</field>
|
||||
</record>
|
||||
<record id="trans_draft_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">button_cancel</field>
|
||||
</record>
|
||||
<record id="trans_confirm_mts_make_to_stock" model="workflow.transition">
|
||||
<field name="act_from" ref="act_confirm_mts"/>
|
||||
<field name="act_to" ref="act_make_to_stock"/>
|
||||
<field name="condition">check_make_to_stock()</field>
|
||||
</record>
|
||||
<!-- <record id="trans_confirm_mto_produce_check" model="workflow.transition">-->
|
||||
<!-- <field name="act_from" ref="act_confirm_mto"/>-->
|
||||
<!-- <field name="act_to" ref="act_produce_check"/>-->
|
||||
<!-- <field name="condition">check_produce()</field>-->
|
||||
<!-- </record>-->
|
||||
<!-- <record id="trans_product_check_produce_service" model="workflow.transition">-->
|
||||
<!-- <field name="act_from" ref="act_produce_check"/>-->
|
||||
<!-- <field name="act_to" ref="act_produce_service"/>-->
|
||||
<!-- <field name="condition">not check_product()</field>-->
|
||||
<!-- </record>-->
|
||||
<record id="trans_make_to_stock_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_make_to_stock"/>
|
||||
<field name="act_to" ref="act_make_done"/>
|
||||
<field name="condition">True</field>
|
||||
<field name="trigger_model" eval="False"/>
|
||||
<field name="trigger_expr_id" eval="False"/>
|
||||
</record>
|
||||
<!-- <record id="trans_produce_service_cancel" model="workflow.transition">-->
|
||||
<!-- <field name="act_from" ref="act_produce_service"/>-->
|
||||
<!-- <field name="act_to" ref="act_cancel"/>-->
|
||||
<!-- <field name="signal">subflow.cancel</field>-->
|
||||
<!-- </record>-->
|
||||
<!-- <record id="trans_produce_service_make_done" model="workflow.transition">-->
|
||||
<!-- <field name="act_from" ref="act_produce_service"/>-->
|
||||
<!-- <field name="act_to" ref="act_make_done"/>-->
|
||||
<!-- </record>-->
|
||||
<record id="trans_make_done_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_make_done"/>
|
||||
<field name="act_to" ref="act_done"/>
|
||||
<field name="condition">action_check_finnished()</field>
|
||||
</record>
|
||||
<record id="trans_make_done_confirm" model="workflow.transition">
|
||||
<field name="act_from" ref="act_make_done"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="condition">check_move_cancel()</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!--
|
||||
Process
|
||||
-->
|
||||
|
||||
<record id="process_process_procurementprocess0" model="process.process">
|
||||
<field eval=""""Procurement"""" name="name"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement"/>
|
||||
<field eval="1" name="active"/>
|
||||
</record>
|
||||
|
||||
<!--
|
||||
Process Node
|
||||
-->
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -238,4 +238,5 @@ class mrp_procurement(osv.osv):
|
||||
cr.close()
|
||||
return {}
|
||||
mrp_procurement()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,9 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_mrp_property_group","mrp.property.group","model_mrp_property_group",,1,0,0,0
|
||||
"access_mrp_property","mrp.property","model_mrp_property",,1,0,0,0
|
||||
"access_mrp_procurement","mrp.procurement","model_mrp_procurement",,1,0,0,0
|
||||
"access_stock_warehouse_orderpoint","stock.warehouse.orderpoint","model_stock_warehouse_orderpoint",,1,0,0,0
|
||||
"access_mrp_procurement_compute_all","mrp.procurement.compute.all","model_mrp_procurement_compute_all",,1,0,0,0
|
||||
"access_mrp_procurement_orderpoint_compute","mrp.procurement.orderpoint.compute","model_mrp_procurement_orderpoint_compute",,1,0,0,0
|
||||
"access_mrp_make_procurement","make.procurement","model_make_procurement",,1,0,0,0
|
||||
"access_mrp_make_procurement","mrp.procurement.compute","model_mrp_procurement_compute",,1,0,0,0
|
||||
|
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
|
||||
<record model="ir.rule" id="mrp_procurement_rule">
|
||||
<field name="name">mrp_procurement multi-company</field>
|
||||
<field name="model_id" search="[('model','=','mrp.procurement')]" model="ir.model"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="stock_warehouse_orderpoint_rule">
|
||||
<field name="name">stock_warehouse.orderpoint multi-company</field>
|
||||
<field name="model_id" search="[('model','=','stock.warehouse.orderpoint')]" model="ir.model"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import orderpoint_procurement
|
||||
import mrp_procurement
|
||||
import schedulers_all
|
||||
import make_procurement_product
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
+2
-2
@@ -83,8 +83,8 @@ class make_procurement(osv.osv_memory):
|
||||
wf_service.trg_validate(uid, 'mrp.procurement', procure_id, 'button_confirm', cr)
|
||||
|
||||
|
||||
id2 = data_obj._get_id(cr, uid, 'mrp', 'mrp_procurement_tree_view')
|
||||
id3 = data_obj._get_id(cr, uid, 'mrp', 'mrp_procurement_form_view')
|
||||
id2 = data_obj._get_id(cr, uid, 'mrp_procurement', 'mrp_procurement_tree_view')
|
||||
id3 = data_obj._get_id(cr, uid, 'mrp_procurement', 'mrp_procurement_form_view')
|
||||
|
||||
if id2:
|
||||
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
|
||||
-3
@@ -30,8 +30,5 @@
|
||||
key2="client_action_multi"
|
||||
id="action_compute_schedulers"/>
|
||||
|
||||
<menuitem id="menu_mrp_scheduler" name="Schedulers" parent="base.menu_mrp_root" sequence="4"/>
|
||||
<menuitem action="action_compute_schedulers" id="mrp_Sched_all" parent="mrp.menu_mrp_scheduler" sequence="90"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -115,7 +115,7 @@
|
||||
<field name="invoiced"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<field colspan="4" name="tax_id" domain="[('parent_id','=',False),('type_tax_use','>>','purchase')]"/>
|
||||
<field colspan="4" name="tax_id" domain="[('parent_id','=',False),('type_tax_use','<>','purchase')]"/>
|
||||
</page>
|
||||
<page string="History" groups="base.group_extended">
|
||||
<field colspan="4" name="invoice_line_id" />
|
||||
|
||||
@@ -57,23 +57,24 @@ class repair_cancel(osv.osv_memory):
|
||||
@param context: A standard dictionary
|
||||
@return: New arch of view.
|
||||
"""
|
||||
record_id = context and context.get('active_id', False) or False
|
||||
res = super(repair_cancel, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
|
||||
if record_id:
|
||||
try:
|
||||
repair_order = self.pool.get('mrp.repair').browse(cr, uid, record_id)
|
||||
if not repair_order.invoiced:
|
||||
res['arch'] = """ <form string="Cancel Repair" colspan="4">
|
||||
<group col="2" colspan="2">
|
||||
<label string="Do you want to continue?" colspan="4"/>
|
||||
<separator colspan="4"/>
|
||||
<button icon="gtk-cancel" special="cancel" string="No" readonly="0"/>
|
||||
<button name="cancel_repair" string="Yes" type="object" icon="gtk-ok"/>
|
||||
</group>
|
||||
</form>
|
||||
"""
|
||||
except:
|
||||
return res
|
||||
record_id = context and context.get('active_id', False) or False
|
||||
active_model = context.get('active_model')
|
||||
|
||||
if not record_id or (active_model and active_model != 'mrp.repair'):
|
||||
return res
|
||||
|
||||
repair_order = self.pool.get('mrp.repair').browse(cr, uid, record_id)
|
||||
if not repair_order.invoiced:
|
||||
res['arch'] = """ <form string="Cancel Repair" colspan="4">
|
||||
<group col="2" colspan="2">
|
||||
<label string="Do you want to continue?" colspan="4"/>
|
||||
<separator colspan="4"/>
|
||||
<button icon="gtk-cancel" special="cancel" string="No" readonly="0"/>
|
||||
<button name="cancel_repair" string="Yes" type="object" icon="gtk-ok"/>
|
||||
</group>
|
||||
</form>
|
||||
"""
|
||||
return res
|
||||
|
||||
repair_cancel()
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
ref('stock.menu_action_picking_tree7'),
|
||||
ref('stock.menu_action_picking_tree8'),
|
||||
ref('stock.menu_action_picking_tree9'),
|
||||
ref('mrp.menu_mrp_procurement_action3'),
|
||||
ref('mrp_procurement.menu_mrp_procurement_action3'),
|
||||
ref('point_of_sale.menu_point_root')])]" name="menu_access"/>
|
||||
<field eval="[(6,0,[ref('res_users_shopuser0'),ref('res_users_shopuser1')])]" name="users"/>
|
||||
<field eval="[(6,0,[ref('point_of_sale.ir_rule_group_point0'),ref('point_of_sale.ir_rule_group_poslinecompany0'),ref('point_of_sale.ir_rule_group_posreporting0')])]" name="rule_groups"/>
|
||||
@@ -132,7 +132,7 @@
|
||||
</record>
|
||||
|
||||
<record id="ir_modelsmrp_pdt0" model="ir.model.access">
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement"/>
|
||||
<field eval="1" name="perm_read"/>
|
||||
<field eval=""""MRP - Procurement"""" name="name"/>
|
||||
<field eval="0" name="perm_unlink"/>
|
||||
@@ -206,7 +206,7 @@
|
||||
<field name="group_id" ref="res_groups_posuser0"/>
|
||||
</record>
|
||||
<record id="ir_model_access_stockwarehouseorderpoint0" model="ir.model.access">
|
||||
<field name="model_id" ref="mrp.model_stock_warehouse_orderpoint"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_stock_warehouse_orderpoint"/>
|
||||
<field eval="1" name="perm_read"/>
|
||||
<field eval=""""stock.warehouse.orderpoint"""" name="name"/>
|
||||
<field eval="0" name="perm_unlink"/>
|
||||
@@ -474,7 +474,7 @@
|
||||
<field name="group_id" ref="res_groups_posuser0"/>
|
||||
</record>
|
||||
<record id="ir_model_access_procurement0" model="ir.model.access">
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement" />
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement" />
|
||||
<field eval="1" name="perm_read" />
|
||||
<field eval="1" name="perm_write" />
|
||||
<field eval="1" name="perm_create" />
|
||||
@@ -497,7 +497,7 @@
|
||||
name="Reporting"
|
||||
parent="stock.menu_stock_root" groups="base.group_user"/>
|
||||
<menuitem action="stock.action_picking_tree" id="stock.menu_action_picking_tree" parent="stock.menu_stock_root" sequence="19" groups="res_groups_posuser0"/>
|
||||
<menuitem id="mrp.menu_mrp_reordering" name="Automatic Procurements" parent="stock.menu_stock_root" sequence="4" groups="base.group_user"/>
|
||||
<menuitem id="mrp_procurement.menu_mrp_reordering" name="Automatic Procurements" parent="stock.menu_stock_root" sequence="4" groups="base.group_user"/>
|
||||
<menuitem parent="stock.next_id_61" action="stock.action_stock_line_date" id="stock.menu_report_stock_line_date" groups="base.group_user"/>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
ref('stock.menu_action_picking_tree7'),
|
||||
ref('stock.menu_action_picking_tree8'),
|
||||
ref('stock.menu_action_picking_tree9'),
|
||||
ref('mrp.menu_mrp_procurement_action3'),
|
||||
ref('mrp_procurement.menu_mrp_procurement_action3'),
|
||||
ref('point_of_sale.menu_point_root')])]" name="menu_access"/>
|
||||
<field eval="[(6,0,[ref('point_of_sale.ir_rule_group_point0'),ref('point_of_sale.ir_rule_group_poslinecompany0'),ref('point_of_sale.ir_rule_group_posreporting0')])]" name="rule_groups"/>
|
||||
<field eva="[(6,0,[ref('res_users_shopuser0'),ref('res_users_shopuser1')])]" name="users"/>
|
||||
@@ -214,7 +214,7 @@
|
||||
</record>
|
||||
|
||||
<record id="ir_modelsmrp_pdt0" model="ir.model.access">
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement"/>
|
||||
<field eval="1" name="perm_read"/>
|
||||
<field eval=""""MRP - Procurement"""" name="name"/>
|
||||
<field eval="0" name="perm_unlink"/>
|
||||
@@ -557,7 +557,7 @@
|
||||
<field name="group_id" ref="res_groups_posuser0"/>
|
||||
</record>
|
||||
<record id="ir_model_access_procurement0" model="ir.model.access">
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement" />
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement" />
|
||||
<field eval="1" name="perm_read" />
|
||||
<field eval="1" name="perm_write" />
|
||||
<field eval="1" name="perm_create" />
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<field eval="1" name="global"/>
|
||||
</record>
|
||||
<record id="point_of_sale.res_groups_posuser0" model="res.groups">
|
||||
<field eval="[(6,0,[ref('product.menu_config_product'),ref('product.menu_product_category_action_form'),ref('point_of_sale.menu_point_ofsale'),ref('point_of_sale.menu_point_config'),ref('point_of_sale.menu_statement_tree_all'),ref('stock.menu_stock_root'),ref('stock.menu_action_location_form'),ref('stock.menu_action_location_tree'),ref('stock.menu_picking_waiting'),ref('stock.menu_action_picking_tree3'),ref('stock.menu_action_picking_tree5'),ref('stock.menu_action_picking_form'),ref('stock.menu_action_picking_tree7'),ref('stock.menu_action_picking_tree8'),ref('stock.menu_action_picking_tree9'),ref('mrp.menu_mrp_procurement_action3'),ref('mrp.menu_mrp_procurement_new'),ref('mrp.next_id_77'),ref('mrp.menu_report_workcenter_load'),ref('mrp.menu_report_in_out_picking'),ref('base.menu_sales'),ref('sale.menu_action_shop_form'),ref('sale.menu_sale_order'),ref('sale.menu_action_order_tree'),ref('sale.menu_action_order_tree_all'),ref('sale.menu_action_order_tree2'),ref('sale.menu_action_order_tree3'),ref('sale.menu_action_order_tree7'),ref('sale.menu_action_order_tree8'),ref('sale.menu_action_order_line_tree1'),ref('delivery.menu_action_delivery_carrier_form'),ref('delivery.menu_action_delivery_grid_form'),ref('point_of_sale.menu_point_root')])]" name="menu_access"/>
|
||||
<field eval="[(6,0,[ref('product.menu_config_product'),ref('product.menu_product_category_action_form'),ref('point_of_sale.menu_point_ofsale'),ref('point_of_sale.menu_point_config'),ref('point_of_sale.menu_statement_tree_all'),ref('stock.menu_stock_root'),ref('stock.menu_action_location_form'),ref('stock.menu_action_location_tree'),ref('stock.menu_picking_waiting'),ref('stock.menu_action_picking_tree3'),ref('stock.menu_action_picking_tree5'),ref('stock.menu_action_picking_form'),ref('stock.menu_action_picking_tree7'),ref('stock.menu_action_picking_tree8'),ref('stock.menu_action_picking_tree9'),ref('mrp_procurement.menu_mrp_procurement_action3'),ref('mrp_procurement.menu_mrp_procurement_new'),ref('mrp.next_id_77'),ref('mrp.menu_report_workcenter_load'),ref('mrp.menu_report_in_out_picking'),ref('base.menu_sales'),ref('sale.menu_action_shop_form'),ref('sale.menu_sale_order'),ref('sale.menu_action_order_tree'),ref('sale.menu_action_order_tree_all'),ref('sale.menu_action_order_tree2'),ref('sale.menu_action_order_tree3'),ref('sale.menu_action_order_tree7'),ref('sale.menu_action_order_tree8'),ref('sale.menu_action_order_line_tree1'),ref('delivery.menu_action_delivery_carrier_form'),ref('delivery.menu_action_delivery_grid_form'),ref('point_of_sale.menu_point_root')])]" name="menu_access"/>
|
||||
<field eval="[(6,0,[ref('ir_rule_group_bankstatementcompany0'),ref('ir_rule_group_bankstatementlinecompany0'),ref('point_of_sale.ir_rule_group_point0'),ref('point_of_sale.ir_rule_group_poslinecompany0'),ref('point_of_sale.ir_rule_group_posreporting0')])]" name="rule_groups"/>
|
||||
<field eval=""""POS_user"""" name="name"/>
|
||||
</record>
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-02-27 08:20+0000\n"
|
||||
"Last-Translator: Oktay Altunergil <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-05-10 16:32+0000\n"
|
||||
"Last-Translator: Angel Spy <melissadilara@yahoo.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:10+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-11 04:19+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: product
|
||||
@@ -90,7 +90,7 @@ msgstr ""
|
||||
#. module: product
|
||||
#: field:product.packaging,width:0
|
||||
msgid "Width"
|
||||
msgstr "En/Genişlik"
|
||||
msgstr "Genişlik"
|
||||
|
||||
#. module: product
|
||||
#: help:product.pricelist.item,product_tmpl_id:0
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<page string="Sales & Purchases" position="inside">
|
||||
<newline/>
|
||||
<group col="2" colspan="2" name="sale_list">
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Sales Properties" colspan="2"/>
|
||||
<field name="property_product_pricelist"/>
|
||||
</group>
|
||||
|
||||
@@ -25,6 +25,7 @@ import stock
|
||||
import wizard
|
||||
import report
|
||||
import stock
|
||||
import company
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
""",
|
||||
'author': 'Tiny',
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': ['base', 'account', 'stock', 'process'],
|
||||
'depends': ['base', 'account', 'stock', 'process', 'mrp_procurement'],
|
||||
'init_xml': [],
|
||||
'update_xml': [
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
'security/ir.model.access.csv',
|
||||
'purchase_workflow.xml',
|
||||
'purchase_sequence.xml',
|
||||
'company_view.xml',
|
||||
'purchase_data.xml',
|
||||
'wizard/purchase_order_group_view.xml',
|
||||
'wizard/purchase_installer.xml',
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import osv,fields
|
||||
|
||||
class company(osv.osv):
|
||||
_inherit = 'res.company'
|
||||
_columns = {
|
||||
'po_lead': fields.float('Purchase Lead Time', required=True,
|
||||
help="This is the leads/security time for each purchase order."),
|
||||
}
|
||||
_defaults = {
|
||||
'po_lead': lambda *a: 1.0,
|
||||
}
|
||||
company()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<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">
|
||||
<field name="po_lead"/>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -19,6 +19,7 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from mx import DateTime
|
||||
from osv import fields
|
||||
from osv import osv
|
||||
import time
|
||||
@@ -692,5 +693,86 @@ class purchase_order_line(osv.osv):
|
||||
return True
|
||||
purchase_order_line()
|
||||
|
||||
class mrp_procurement(osv.osv):
|
||||
_inherit = 'mrp.procurement'
|
||||
_columns = {
|
||||
'purchase_id': fields.many2one('purchase.order', 'Purchase Order'),
|
||||
}
|
||||
|
||||
def action_po_assign(self, cr, uid, ids, context={}):
|
||||
""" This is action which call from workflow to assign purchase order to procurements
|
||||
@return: True
|
||||
"""
|
||||
res = self.make_po(cr, uid, ids, context=context)
|
||||
res = res.values()
|
||||
return len(res) and res[0] or 0 #TO CHECK: why workflow is generated error if return not integer value
|
||||
|
||||
def make_po(self, cr, uid, ids, context={}):
|
||||
""" Make purchase order from procurement
|
||||
@return: New created Purchase Orders procurement wise
|
||||
"""
|
||||
res = {}
|
||||
company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
uom_obj = self.pool.get('product.uom')
|
||||
pricelist_obj = self.pool.get('product.pricelist')
|
||||
prod_obj = self.pool.get('product.product')
|
||||
acc_pos_obj = self.pool.get('account.fiscal.position')
|
||||
po_obj = self.pool.get('purchase.order')
|
||||
for procurement in self.browse(cr, uid, ids):
|
||||
res_id = procurement.move_id.id
|
||||
partner = procurement.product_id.seller_ids[0].name
|
||||
partner_id = partner.id
|
||||
address_id = partner_obj.address_get(cr, uid, [partner_id], ['delivery'])['delivery']
|
||||
pricelist_id = partner.property_product_pricelist_purchase.id
|
||||
|
||||
uom_id = procurement.product_id.uom_po_id.id
|
||||
|
||||
qty = uom_obj._compute_qty(cr, uid, procurement.product_uom.id, procurement.product_qty, uom_id)
|
||||
if procurement.product_id.seller_ids[0].qty:
|
||||
qty = max(qty,procurement.product_id.seller_ids[0].qty)
|
||||
|
||||
price = pricelist_obj.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 %H:%M:%S')
|
||||
newdate = newdate - DateTime.RelativeDateTime(days=company.po_lead)
|
||||
newdate = newdate - procurement.product_id.seller_ids[0].delay
|
||||
|
||||
#Passing partner_id to context for purchase order line integrity of Line name
|
||||
context.update({'lang': partner.lang, 'partner_id': partner_id})
|
||||
|
||||
product = prod_obj.browse(cr, uid, procurement.product_id.id, context=context)
|
||||
|
||||
line = {
|
||||
'name': product.partner_ref,
|
||||
'product_qty': qty,
|
||||
'product_id': procurement.product_id.id,
|
||||
'product_uom': uom_id,
|
||||
'price_unit': price,
|
||||
'date_planned': newdate.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'move_dest_id': res_id,
|
||||
'notes': product.description_purchase,
|
||||
}
|
||||
|
||||
taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id
|
||||
taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids)
|
||||
line.update({
|
||||
'taxes_id': [(6,0,taxes)]
|
||||
})
|
||||
purchase_id = po_obj.create(cr, uid, {
|
||||
'origin': procurement.origin,
|
||||
'partner_id': partner_id,
|
||||
'partner_address_id': address_id,
|
||||
'location_id': procurement.location_id.id,
|
||||
'pricelist_id': pricelist_id,
|
||||
'order_line': [(0,0,line)],
|
||||
'company_id': procurement.company_id.id,
|
||||
'fiscal_position': partner.property_account_position and partner.property_account_position.id or False
|
||||
})
|
||||
res[procurement.id] = purchase_id
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': purchase_id})
|
||||
return res
|
||||
mrp_procurement()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -322,7 +322,22 @@
|
||||
<field name="act_window_id" ref="purchase_line_form_action2"/>
|
||||
</record>
|
||||
<menuitem action="purchase_line_form_action2" id="menu_purchase_line_order_draft" parent="menu_procurement_management_invoice"/>
|
||||
|
||||
|
||||
<!--
|
||||
Procurements
|
||||
-->
|
||||
|
||||
<record id="view_procurement_form_inherit" model="ir.ui.view">
|
||||
<field name="name">mrp.procurement.form.inherit</field>
|
||||
<field name="model">mrp.procurement</field>
|
||||
<field name="inherit_id" ref="mrp_procurement.mrp_procurement_form_view"/>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/notebook/page/field[@name='close_move']" position="before">
|
||||
<field name="purchase_id"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -177,6 +177,33 @@
|
||||
<field name="act_from" ref="act_invoice_end"/>
|
||||
<field name="act_to" ref="act_done"/>
|
||||
</record>
|
||||
|
||||
<!-- Procurement -->
|
||||
<record id="act_buy" model="workflow.activity">
|
||||
<field name="wkf_id" ref="mrp_procurement.wkf_procurement"/>
|
||||
<field name="name">buy</field>
|
||||
<field name="kind">subflow</field>
|
||||
<field name="subflow_id" search="[('osv','=','purchase.order')]"/>
|
||||
<field name="action">action_po_assign()</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_confirm_mto_buy" model="workflow.transition">
|
||||
<field name="act_from" ref="mrp_procurement.act_confirm_mto"/>
|
||||
<field name="act_to" ref="act_buy"/>
|
||||
<field name="condition">check_buy()</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_buy_make_done" model="workflow.transition">
|
||||
<field name="act_from" ref="act_buy"/>
|
||||
<field name="act_to" ref="mrp_procurement.act_make_done"/>
|
||||
<field name="signal">subflow.delivery_done</field>
|
||||
</record>
|
||||
|
||||
<record id="trans_buy_cancel" model="workflow.transition">
|
||||
<field name="act_from" ref="act_buy"/>
|
||||
<field name="act_to" ref="mrp_procurement.act_cancel"/>
|
||||
<field name="signal">subflow.cancel</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -26,9 +26,10 @@
|
||||
import sale
|
||||
import stock
|
||||
import product
|
||||
import mrp
|
||||
#import mrp
|
||||
import wizard
|
||||
import report
|
||||
import company
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -42,13 +42,14 @@
|
||||
""",
|
||||
'author': 'Tiny',
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': ['product', 'stock', 'mrp', 'process'],
|
||||
'depends': ['product', 'stock', 'mrp_procurement', 'process'],
|
||||
'init_xml': [],
|
||||
'update_xml': [
|
||||
'wizard/sale_make_invoice_advance.xml',
|
||||
'wizard/sale_line_invoice.xml',
|
||||
'security/sale_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'company_view.xml',
|
||||
'sale_workflow.xml',
|
||||
'sale_sequence.xml',
|
||||
'sale_data.xml',
|
||||
@@ -56,7 +57,7 @@
|
||||
'report/sale_report_view.xml',
|
||||
'sale_report.xml',
|
||||
'stock_view.xml',
|
||||
'process/sale_process.xml',
|
||||
# 'process/sale_process.xml',
|
||||
],
|
||||
'demo_xml': ['sale_demo.xml'],
|
||||
'installable': True,
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import osv,fields
|
||||
|
||||
class company(osv.osv):
|
||||
_inherit = 'res.company'
|
||||
_columns = {
|
||||
'security_lead': fields.float('Security Days', required=True,
|
||||
help="This is the days added to what you promise to customers "\
|
||||
"for security purpose"),
|
||||
}
|
||||
_defaults = {
|
||||
'security_lead': lambda *a: 5.0,
|
||||
}
|
||||
company()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<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">
|
||||
<field name="security_lead"/>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -35,7 +35,7 @@
|
||||
<field eval=""""Sale Order Requisition"""" name="name"/>
|
||||
<field eval=""""Drives procurement orders for every sale order line."""" name="note"/>
|
||||
<field name="subflow_id" ref="process_process_salesprocess0"/>
|
||||
<field name="process_id" ref="mrp.process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field eval=""""object.state in ('draft', 'waiting_date', 'manual', 'progress', 'shipping_except', 'invoice_except', 'done', 'cancel')"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
</record>
|
||||
@@ -63,12 +63,12 @@
|
||||
</record>
|
||||
|
||||
<record id="process_node_saleprocurement0" model="process.node">
|
||||
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp.model_mrp_procurement"/>
|
||||
<field name="menu_id" ref="mrp_procurement.menu_mrp_procurement_action"/>
|
||||
<field name="model_id" ref="mrp_procurement.model_mrp_procurement"/>
|
||||
<field eval=""""subflow"""" name="kind"/>
|
||||
<field eval=""""Procurement Order"""" name="name"/>
|
||||
<field eval=""""One Procurement order for each sale order line and for each of the components."""" name="note"/>
|
||||
<field name="subflow_id" ref="mrp.process_process_procurementprocess0"/>
|
||||
<field name="subflow_id" ref="mrp_procurement.process_process_procurementprocess0"/>
|
||||
<field name="process_id" ref="process_process_salesprocess0"/>
|
||||
<field eval=""""object.state=='confirmed'"""" name="model_states"/>
|
||||
<field eval="1" name="flow_start"/>
|
||||
@@ -202,7 +202,7 @@
|
||||
<field eval="[(6,0,[])]" name="transition_ids"/>
|
||||
<field eval=""""Procurement of sold material"""" name="name"/>
|
||||
<field eval=""""For every sale order line, a procurement order is created to supply the sold product."""" name="note"/>
|
||||
<field model="process.node" name="target_node_id" ref="mrp.process_node_procureproducts0"/>
|
||||
<field model="process.node" name="target_node_id" ref="mrp_procurement.process_node_procureproducts0"/>
|
||||
<field model="process.node" name="source_node_id" ref="process_node_saleorderprocurement0"/>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<!--
|
||||
Resource: res.company
|
||||
-->
|
||||
<record id="res_company_shop_sale0" model="res.company">
|
||||
<field eval="5.0" name="security_lead"/>
|
||||
<field name="partner_id" ref="stock.res_partner_tinyshop0"/>
|
||||
<field name="parent_id" ref="stock.res_company_shop0"/>
|
||||
<field eval=""""Shop 1"""" name="name"/>
|
||||
</record>
|
||||
|
||||
<!--
|
||||
Resource: sale.order
|
||||
|
||||
@@ -163,8 +163,8 @@
|
||||
<field groups="product.group_uos" name="product_uos"/>
|
||||
<field name="th_weight"/>
|
||||
<field name="address_allotment_id"/>
|
||||
<separator colspan="4" string="Properties"/>
|
||||
<field colspan="4" name="property_ids" nolabel="1"/>
|
||||
<!-- <separator colspan="4" string="Properties"/>-->
|
||||
<!-- <field colspan="4" name="property_ids" nolabel="1"/>-->
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<field colspan="4" name="notes" nolabel="1"/>
|
||||
@@ -395,9 +395,9 @@
|
||||
icon="gtk-cancel" />
|
||||
</group>
|
||||
</page>
|
||||
<page string="Properties" groups="base.group_extended">
|
||||
<field name="property_ids" nolabel="1"/>
|
||||
</page>
|
||||
<!-- <page string="Properties" groups="base.group_extended">-->
|
||||
<!-- <field name="property_ids" nolabel="1"/>-->
|
||||
<!-- </page>-->
|
||||
<page string="Notes">
|
||||
<field colspan="4" name="notes" nolabel="1"/>
|
||||
</page>
|
||||
|
||||
@@ -11,10 +11,7 @@
|
||||
"access_account_analytic_account_salesman","account_analytic_account salesman","analytic.model_account_analytic_account","group_sale_user",1,1,1,1
|
||||
"access_stock_picking_salesman","stock_picking salesman","stock.model_stock_picking","group_sale_user",1,1,1,1
|
||||
"access_stock_move_salesman","stock_move salesman","stock.model_stock_move","group_sale_user",1,1,1,0
|
||||
"access_mrp_property_salesman","mrp.property salesman","mrp.model_mrp_property","group_sale_user",1,0,0,0
|
||||
"access_mrp_procurement_salesman","mrp.procurement salesman","mrp.model_mrp_procurement","group_sale_user",1,1,1,1
|
||||
"access_sale_order_mrp_user","sale.order mrp worker","model_sale_order","mrp.group_mrp_user",1,0,0,0
|
||||
"access_sale_order_line_mrp_user","sale.order.line mrp worker","model_sale_order_line","mrp.group_mrp_user",1,0,0,0
|
||||
"access_mrp_procurement_salesman","mrp.procurement salesman","mrp_procurement.model_mrp_procurement","group_sale_user",1,1,1,1
|
||||
"access_sale_order_stock_worker","sale.order stock worker","model_sale_order","stock.group_stock_user",1,1,0,0
|
||||
"access_sale_order_line_stock_worker","sale.order.line stock worker","model_sale_order_line","stock.group_stock_user",1,1,0,0
|
||||
"access_sale_order_manager","sale.order.manager","model_sale_order","group_sale_manager",1,1,1,1
|
||||
|
||||
|
@@ -0,0 +1,840 @@
|
||||
# German translation for openobject-addons
|
||||
# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-11-26 06:00+0000\n"
|
||||
"PO-Revision-Date: 2010-05-11 11:19+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: German <de@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-12 04:20+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,bcc:0
|
||||
msgid "BCC to"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "__number__ for Invoice / Sales Number"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,ssl:0
|
||||
msgid "Use SSL?"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Start Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.wizard,name:smtpclient.wizard_email_verifycode
|
||||
msgid "Verify Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,priority:0
|
||||
msgid "Server Priority"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.sendcode,init,emailto:0
|
||||
msgid "Enter the address Email where you want to get the Verification Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,auth_type:0
|
||||
msgid "Other Mail Servers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,to:0
|
||||
msgid "Mail to"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Message Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,name:0
|
||||
msgid "Server Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,header_ids:0
|
||||
msgid "Default Headers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: wizard_button:email.testemail,init,send:0
|
||||
msgid "Send Email"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:res.company.address,company_id:0
|
||||
msgid "Company"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Set to Draft"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/wizard/verifycode.py:0
|
||||
#, python-format
|
||||
msgid "Server already verified!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/wizard/sendcode.py:0
|
||||
#: code:addons/smtpclient/wizard/testemail.py:0
|
||||
#, python-format
|
||||
msgid "Verification Failed. Please check the Server Configuration!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "SMTP Server Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,auth_type:0
|
||||
#: field:email.smtpclient,type:0
|
||||
msgid "Server Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,from_email:0
|
||||
msgid "Email From"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "User Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "OpenERP SMTP server Email Registration Code!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.model,name:smtpclient.model_report_smtp_server
|
||||
#: view:report.smtp.server:0
|
||||
msgid "Server Statistics"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,type:0
|
||||
#: selection:res.company.address,name:0
|
||||
msgid "Sale"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.headers,value:0
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Access Permission"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.model,name:smtpclient.model_email_headers
|
||||
msgid "Email Headers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,delete_queue:0
|
||||
msgid "Queue Option"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Please configure Email Server Messages [Verification / Test]"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/wizard/verifycode.py:0
|
||||
#, python-format
|
||||
msgid "Verification failed. Invalid Verification Code!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.act_window,name:smtpclient.act_mail_server_2_mail_history
|
||||
msgid "Email History"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient.history:0
|
||||
msgid "Server History"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,auth_type:0
|
||||
msgid "Yahoo!!! Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
#: field:email.smtpclient,test_email:0
|
||||
msgid "Test Message"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:report.smtp.server,server_id:0
|
||||
msgid "Server ID"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.smtpclient,delete_queue_period:0
|
||||
msgid "delete emails/contents from email queue after specified no of days"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:report.smtp.server,no:0
|
||||
msgid "Total No."
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.smtpclient,process_id:0
|
||||
msgid "Mail Transport Agent Process"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "__user__ for User Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,date_create:0
|
||||
msgid "Date Create"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,state:0
|
||||
msgid "Server Status"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,error:0
|
||||
msgid "Last Error"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: wizard_view:email.sendcode,init:0
|
||||
#: wizard_button:email.sendcode,init,send:0
|
||||
msgid "Send Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,name:0
|
||||
msgid "Subject"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Read Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Unable to read Server Settings"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,server_statistics:0
|
||||
msgid "Statistics"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: wizard_view:email.testemail,init:0
|
||||
msgid "Test Email"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,server_id:0
|
||||
msgid "Smtp Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:res.company,addresses:0
|
||||
msgid "Email Addresses"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.act_window,name:smtpclient.action_email_smtpclient_history_tree
|
||||
#: model:ir.ui.menu,name:smtpclient.menu_smtpclient_administration_server_history
|
||||
msgid "Email Server History"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient.queue,state:0
|
||||
msgid "Waiting"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.testemail,init,emailto:0
|
||||
msgid "Enter the address Email where you want to get the Test Email"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,state:0
|
||||
msgid "Not Verified"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,email:0
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient.queue,state:0
|
||||
msgid "Sent"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,user_id:0
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:res.company.address,name:0
|
||||
msgid "Address Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Permission"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient.queue:0
|
||||
msgid "Message with All Headers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Message Headers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:ir.actions.server,report_id:0
|
||||
msgid "Report"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Other Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: constraint:ir.cron:0
|
||||
msgid "Invalid arguments"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
#: field:email.smtpclient,disclaimers:0
|
||||
msgid "Disclaimers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:report.smtp.server,name:0
|
||||
msgid "Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:res.company:0
|
||||
msgid "SMTP Settings"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.smtpclient,body:0
|
||||
msgid ""
|
||||
"The message text that will be send along with the email which is send "
|
||||
"through this server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.wizard,name:smtpclient.wizard_email_testemail
|
||||
msgid "Send Test Email"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.model,name:smtpclient.model_email_smtpclient_queue
|
||||
msgid "Email Queue"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Server Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.verifycode,init,code:0
|
||||
msgid "Enter the verification code thay you get in your verification Email"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.model,name:smtpclient.model_email_smtpclient_history
|
||||
msgid "Email Client History"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,delete_queue:0
|
||||
msgid "Never Delete Message"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "OpenERP Test Email!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
#: field:email.smtpclient,body:0
|
||||
#: view:email.smtpclient.queue:0
|
||||
#: field:email.smtpclient.queue,serialized_message:0
|
||||
msgid "Message"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,process_id:0
|
||||
msgid "MTA Process"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.headers,server_id:0
|
||||
#: view:email.smtpclient:0
|
||||
#: field:email.smtpclient,server:0
|
||||
#: field:email.smtpclient.queue,server_id:0
|
||||
#: model:ir.ui.menu,name:smtpclient.menu_smtpclient_administration_smtp_server
|
||||
msgid "SMTP Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,auth_type:0
|
||||
msgid "Google Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,state:0
|
||||
msgid "Verified"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: help:email.smtpclient,priority:0
|
||||
msgid ""
|
||||
"Priority between 0 to 10, will be used to define the MTA process priotiry"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,port:0
|
||||
msgid "SMTP Port"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Email TO Address not Defined !"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "SMTP Server Error !"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,auth:0
|
||||
msgid "Use Auth"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,pstate:0
|
||||
msgid "Server Statue"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,user:0
|
||||
msgid "User Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,verify_email:0
|
||||
msgid "Verify Message"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.model,name:smtpclient.model_email_smtpclient
|
||||
#: model:ir.module.module,shortdesc:smtpclient.module_meta_information
|
||||
msgid "Email Client"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Disclaimers Message"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "__code__ for Verification Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient.queue,state:0
|
||||
msgid "Queued"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,date_create:0
|
||||
#: field:email.smtpclient.queue,date_create:0
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,cc:0
|
||||
msgid "CC to"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:email.smtpclient,verify_email:smtpclient.email_smtpclient_sendmailserver0
|
||||
msgid ""
|
||||
"Verification Message. This is the code\n"
|
||||
"__code__ \n"
|
||||
"you must copy in the OpenERP Email Server (Verify Server wizard).\n"
|
||||
"Created by user __user__"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient.queue:0
|
||||
#: model:ir.actions.act_window,name:smtpclient.action_email_smtpclient_queue_tree
|
||||
#: model:ir.ui.menu,name:smtpclient.menu_smtpclient_administration_smtp_server_queue
|
||||
msgid "Message Queue"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,type:0
|
||||
#: selection:res.company.address,name:0
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,delete_queue:0
|
||||
msgid "Delete Content After"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "You have no permission to access SMTP Server : %s "
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,active:0
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.act_window,name:smtpclient.act_mail_server_2_mail_queue
|
||||
msgid "Message Queus"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/wizard/sendcode.py:0
|
||||
#: code:addons/smtpclient/wizard/testemail.py:0
|
||||
#: code:addons/smtpclient/wizard/verifycode.py:0
|
||||
#: view:email.smtpclient.queue:0
|
||||
#: selection:email.smtpclient.queue,state:0
|
||||
#, python-format
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Server Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,delete_queue:0
|
||||
msgid "Clear All After"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please verify Email Server, without verification you can not send Email(s)."
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,history_line:0
|
||||
#: field:report.smtp.server,history:0
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,priority:0
|
||||
msgid "Message Priority"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:ir.actions.server,file_ids:0
|
||||
msgid "Attachments"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "__name__ for Customer Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient.queue:0
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.headers,key:0
|
||||
msgid "Header"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Verification Message. This is the code\n"
|
||||
"\n"
|
||||
"__code__\n"
|
||||
"\n"
|
||||
"you must copy in the OpenERP Email Server (Verify Server wizard).\n"
|
||||
"\n"
|
||||
"Created by user __user__"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:res.company.address,name:0
|
||||
msgid "Invoice"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: wizard_view:email.verifycode,init:0
|
||||
#: wizard_button:email.verifycode,init,check:0
|
||||
msgid "Verify Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: wizard_button:email.sendcode,init,end:0
|
||||
#: wizard_button:email.testemail,init,end:0
|
||||
#: wizard_button:email.verifycode,init,end:0
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,delete_queue_period:0
|
||||
msgid "Delete after"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Server is not Verified, Please Verify the Server !"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,resource_id:0
|
||||
msgid "Resource ID"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "SMTP Data Error !"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,delete_queue:0
|
||||
msgid "Delete when Email Sent"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,type:0
|
||||
msgid "Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.module.module,description:smtpclient.module_meta_information
|
||||
msgid ""
|
||||
"Email Client module that provides:\n"
|
||||
" Sending Email\n"
|
||||
" Use Multiple Server\n"
|
||||
" Multi Threading\n"
|
||||
" Multi Attachment\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,type:0
|
||||
msgid "Stock"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,name:0
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,code:0
|
||||
#: wizard_field:email.verifycode,init,code:0
|
||||
msgid "Verification Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,pstate:0
|
||||
msgid "Stop"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,body:0
|
||||
msgid "Email Text"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:res.company.address,name:0
|
||||
msgid "Delivery"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,pstate:0
|
||||
msgid "Running"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient.queue:0
|
||||
msgid "Last Error occured"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: selection:email.smtpclient,state:0
|
||||
msgid "Waiting for Verification"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,password:0
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient,users_id:0
|
||||
msgid "Users Allowed"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/wizard/sendcode.py:0
|
||||
#, python-format
|
||||
msgid "Verification Code Already Generated !"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: wizard_field:email.sendcode,init,emailto:0
|
||||
#: field:email.smtpclient,email:0
|
||||
#: wizard_field:email.testemail,init,emailto:0
|
||||
#: view:res.company:0
|
||||
#: field:res.company.address,email:0
|
||||
msgid "Email Address"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Verification Message"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: view:email.smtpclient:0
|
||||
msgid "Stop Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.ui.menu,name:smtpclient.menu_smtpclient_administration_server
|
||||
msgid "Email Servers"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.wizard,name:smtpclient.wizard_email_sendcode
|
||||
msgid "Send Verification Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.history,model:0
|
||||
msgid "Model"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.actions.act_window,name:smtpclient.action_email_smtpclient_tree
|
||||
#: field:ir.actions.server,email_server:0
|
||||
msgid "Email Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: code:addons/smtpclient/smtpclient.py:0
|
||||
#, python-format
|
||||
msgid "Permission Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: model:ir.model,name:smtpclient.model_res_company_address
|
||||
msgid "res.company.address"
|
||||
msgstr ""
|
||||
|
||||
#. module: smtpclient
|
||||
#: field:email.smtpclient.queue,state:0
|
||||
msgid "Message Status"
|
||||
msgstr ""
|
||||
@@ -504,7 +504,7 @@ class stock_picking(osv.osv):
|
||||
'min_date': fields.function(get_min_max_date, fnct_inv=_set_minimum_date, multi="min_max_date",
|
||||
method=True, store=True, type='datetime', string='Expected Date', select=1, help="Expected date for Picking. Default it takes current date"),
|
||||
'date': fields.datetime('Order Date', help="Date of Order"),
|
||||
'date_done': fields.datetime('Date Done', help="Date of completion"),
|
||||
'date_done': fields.datetime('Date Done', help="Date of Completion"),
|
||||
'max_date': fields.function(get_min_max_date, fnct_inv=_set_maximum_date, multi="min_max_date",
|
||||
method=True, store=True, type='datetime', string='Max. Expected Date', select=2),
|
||||
'move_lines': fields.one2many('stock.move', 'picking_id', 'Entry lines', states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}),
|
||||
@@ -1228,7 +1228,7 @@ class stock_move(osv.osv):
|
||||
'origin': fields.related('picking_id','origin',type='char', size=64, relation="stock.picking", string="Origin"),
|
||||
'move_stock_return_history': fields.many2many('stock.move', 'stock_move_return_history', 'move_id', 'return_move_id', 'Move Return History',readonly=True),
|
||||
'delivered_id': fields.many2one('stock.delivery', 'Product delivered'),
|
||||
'scraped': fields.boolean('Scraped'),
|
||||
'scraped': fields.related('location_dest_id','scrap_location',type='boolean',relation='stock.location',string='Scraped'),
|
||||
}
|
||||
_constraints = [
|
||||
(_check_tracking,
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
<field name="usage">view</field>
|
||||
<field name="icon">terp-mrp</field>
|
||||
</record>
|
||||
<record id="stock_location_scraped" model="stock.location">
|
||||
<field name="name">Scraped</field>
|
||||
<field name="location_id" ref="stock_location_locations_virtual"/>
|
||||
<field name="scrap_location">True</field>
|
||||
</record>
|
||||
|
||||
<record id="location_inventory" model="stock.location">
|
||||
<field name="name">Inventory loss</field>
|
||||
|
||||
@@ -198,13 +198,9 @@
|
||||
<field eval="1" name="active"/>
|
||||
</record>
|
||||
<record id="res_company_shop0" model="res.company">
|
||||
<field eval="5.0" name="security_lead"/>
|
||||
<field name="currency_id" ref="base.EUR"/>
|
||||
<field eval="1.0" name="po_lead"/>
|
||||
<field name="partner_id" ref="res_partner_tinyshop0"/>
|
||||
<field eval="1.0" name="manufacturing_lead"/>
|
||||
<field name="parent_id" ref="base.main_company"/>
|
||||
<field eval="80.0" name="schedule_range"/>
|
||||
<field eval=""""Shop 1"""" name="name"/>
|
||||
</record>
|
||||
<record id="res_partner_tinyshop1" model="res.partner">
|
||||
|
||||
@@ -606,7 +606,7 @@
|
||||
<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}">
|
||||
<tree colors="grey:state in ('cancel');black:state not in ('cancel')" string="Stock Moves">
|
||||
<tree colors="grey:state in ('done','cancel');black:state not in ('cancel','done')" string="Stock Moves">
|
||||
<field name="name" string="Move Name"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
|
||||
@@ -756,7 +756,7 @@
|
||||
<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}">
|
||||
<tree colors="grey:state in ('cancel');black:state not in ('cancel')" string="Stock Moves">
|
||||
<tree colors="grey:state in ('done','cancel');black:state not in ('cancel','done')" string="Stock Moves">
|
||||
<field name="name" string="Move Name"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
|
||||
@@ -934,7 +934,7 @@
|
||||
<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}">
|
||||
<tree colors="grey:state in ('cancel');black:state not in ('cancel')" string="Stock Moves">
|
||||
<tree colors="grey:state in ('done','cancel');black:state not in ('cancel','done')" string="Stock Moves">
|
||||
<field name="name" string="Move Name"/>
|
||||
<field name="product_id"/>
|
||||
<field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
|
||||
@@ -952,7 +952,7 @@
|
||||
states="draft,waiting,confirmed,assigned" />
|
||||
<button
|
||||
name="%(stock.move_scrap)d"
|
||||
string="D" type="action"
|
||||
string="Scrap Products" type="action"
|
||||
icon="gtk-convert"
|
||||
states="draft,waiting,confirmed,assigned" />
|
||||
</tree>
|
||||
@@ -1109,7 +1109,7 @@
|
||||
<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_in_id': address_id}">
|
||||
<tree colors="grey:state in ('cancel');black:state not in ('cancel')" string="Stock Moves">
|
||||
<tree colors="grey:state in ('done','cancel');black:state not in ('cancel','done')" string="Stock Moves">
|
||||
<field name="product_id"/>
|
||||
<field name="product_qty"/>
|
||||
<field name="product_uom"/>
|
||||
|
||||
@@ -86,7 +86,9 @@ class stock_move_consume(osv.osv_memory):
|
||||
if 'product_uom' in fields:
|
||||
res.update({'product_uom': move.product_uom.id})
|
||||
if 'product_qty' in fields:
|
||||
res.update({'product_qty': move.product_qty})
|
||||
res.update({'product_qty': move.product_qty})
|
||||
if 'location_id' in fields:
|
||||
res.update({'location_id': move.location_id.id})
|
||||
|
||||
return res
|
||||
|
||||
@@ -120,9 +122,41 @@ class stock_move_scrap(osv.osv_memory):
|
||||
_inherit = "stock.move.consume"
|
||||
|
||||
_defaults = {
|
||||
'location_id': lambda *x: False
|
||||
'location_id': lambda *x: False
|
||||
}
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
"""
|
||||
Get default values
|
||||
|
||||
@param self: The object pointer.
|
||||
@param cr: A database cursor
|
||||
@param uid: ID of the user currently logged in
|
||||
@param fields: List of fields for default value
|
||||
@param context: A standard dictionary
|
||||
|
||||
@return: default values of fields
|
||||
|
||||
"""
|
||||
res = super(stock_move_consume, self).default_get(cr, uid, fields, context=context)
|
||||
move = self.pool.get('stock.move').browse(cr, uid, context['active_id'], context=context)
|
||||
location_obj = self.pool.get('stock.location')
|
||||
scrpaed_location_ids = location_obj.search(cr, uid, [('scrap_location','=',True)])
|
||||
|
||||
if 'product_id' in fields:
|
||||
res.update({'product_id': move.product_id.id})
|
||||
if 'product_uom' in fields:
|
||||
res.update({'product_uom': move.product_uom.id})
|
||||
if 'product_qty' in fields:
|
||||
res.update({'product_qty': move.product_qty})
|
||||
if 'location_id' in fields:
|
||||
if scrpaed_location_ids:
|
||||
res.update({'location_id': scrpaed_location_ids[0]})
|
||||
else:
|
||||
res.update({'location_id': False})
|
||||
|
||||
return res
|
||||
|
||||
def move_scrap(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
To move scraped products
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<form string="Consume Move">
|
||||
<separator string="Consume Products" colspan="4"/>
|
||||
<field name="product_id" colspan="4" readonly="1"/>
|
||||
<field name="location_id" colspan="4"/>
|
||||
<field name="location_id" colspan="4" widget="selection"/>
|
||||
<field name="product_qty" colspan="2"/>
|
||||
<field name="product_uom" nolabel="1" readonly="1"/>
|
||||
<newline/>
|
||||
@@ -73,7 +73,7 @@
|
||||
<form string="Scrap Move">
|
||||
<separator string="Scrap Products" colspan="4"/>
|
||||
<field name="product_id" colspan="4" readonly="1"/>
|
||||
<field name="location_id" colspan="4" string="Dest. Location" domain="[('usage','<>','view'),('scrap_location','=',True)]"/>
|
||||
<field name="location_id" colspan="4" string="Dest. Location" domain="[('usage','<>','view'),('scrap_location','=',True)]" widget="selection"/>
|
||||
<field name="product_qty" colspan="2"/>
|
||||
<field name="product_uom" nolabel="1" readonly="1"/>
|
||||
<newline/>
|
||||
|
||||
+19
-19
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-02-14 21:39+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-05-10 17:37+0000\n"
|
||||
"Last-Translator: Nurettin Ayarcı <nurettinx@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:18+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-11 04:19+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: wiki
|
||||
@@ -25,7 +25,7 @@ msgstr ""
|
||||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
msgstr "Nesne adı x_ ile başlamalı ve özel karakter içermemelidir!"
|
||||
|
||||
#. module: wiki
|
||||
#: model:ir.model,name:wiki.model_wiki_groups_link
|
||||
@@ -78,7 +78,7 @@ msgstr ""
|
||||
#. module: wiki
|
||||
#: field:wiki.wiki,text_area:0
|
||||
msgid "Content"
|
||||
msgstr ""
|
||||
msgstr "İçerik"
|
||||
|
||||
#. module: wiki
|
||||
#: model:ir.ui.menu,name:wiki.menu_document_configuration
|
||||
@@ -119,7 +119,7 @@ msgstr ""
|
||||
#. module: wiki
|
||||
#: view:wiki.groups:0
|
||||
msgid "Create a Menu"
|
||||
msgstr ""
|
||||
msgstr "Menü Oluştur"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.groups,notes:0
|
||||
@@ -195,7 +195,7 @@ msgstr "Görüntüleme mimarisi için Geçersiz XML"
|
||||
#. module: wiki
|
||||
#: field:wiki.wiki.history,text_area:0
|
||||
msgid "Text area"
|
||||
msgstr ""
|
||||
msgstr "Metin alanı"
|
||||
|
||||
#. module: wiki
|
||||
#: wizard_field:wiki.create.menu,init,menu_parent_id:0
|
||||
@@ -216,7 +216,7 @@ msgstr ""
|
||||
#: wizard_view:wiki.create.menu,init:0
|
||||
#: wizard_view:wiki.make.index,init:0
|
||||
msgid "Menu Information"
|
||||
msgstr ""
|
||||
msgstr "Menü Bilgisi"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.groups,parent_id:0
|
||||
@@ -228,12 +228,12 @@ msgstr ""
|
||||
#: field:wiki.wiki,summary:0
|
||||
#: field:wiki.wiki.history,summary:0
|
||||
msgid "Summary"
|
||||
msgstr ""
|
||||
msgstr "Özet"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.groups,create_date:0
|
||||
msgid "Created Date"
|
||||
msgstr ""
|
||||
msgstr "Oluşturulma Tarihi"
|
||||
|
||||
#. module: wiki
|
||||
#: model:ir.actions.act_window,name:wiki.action_history
|
||||
@@ -259,12 +259,12 @@ msgstr ""
|
||||
#. module: wiki
|
||||
#: wizard_field:wiki.create.menu,init,menu_name:0
|
||||
msgid "Menu Name"
|
||||
msgstr ""
|
||||
msgstr "Menu İsmi"
|
||||
|
||||
#. module: wiki
|
||||
#: view:wiki.wiki:0
|
||||
msgid "Modifications"
|
||||
msgstr ""
|
||||
msgstr "Değişiklikler"
|
||||
|
||||
#. module: wiki
|
||||
#: model:ir.actions.act_window,name:wiki.act_wiki_wiki_history
|
||||
@@ -275,18 +275,18 @@ msgstr ""
|
||||
#: model:ir.ui.menu,name:wiki.menu_document
|
||||
#: view:wiki.wiki:0
|
||||
msgid "Wiki"
|
||||
msgstr ""
|
||||
msgstr "Wiki"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.wiki,write_date:0
|
||||
msgid "Modification Date"
|
||||
msgstr ""
|
||||
msgstr "Değiştirilme Tarihi"
|
||||
|
||||
#. module: wiki
|
||||
#: model:ir.actions.wizard,name:wiki.wizard_make_index
|
||||
#: wizard_button:wiki.make.index,init,yes:0
|
||||
msgid "Create Index"
|
||||
msgstr ""
|
||||
msgstr "dizin yarat"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.wiki.history,minor_edit:0
|
||||
@@ -299,12 +299,12 @@ msgstr ""
|
||||
#: wizard_button:wiki.create.menu,init,create_menu:0
|
||||
#: wizard_view:wiki.make.index,init:0
|
||||
msgid "Create Menu"
|
||||
msgstr ""
|
||||
msgstr "Menü Oluştur"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.wiki,tags:0
|
||||
msgid "Tags"
|
||||
msgstr ""
|
||||
msgstr "Etiketler"
|
||||
|
||||
#. module: wiki
|
||||
#: model:ir.actions.act_window,name:wiki.action_wiki_groups
|
||||
@@ -330,12 +330,12 @@ msgstr ""
|
||||
#: wizard_button:wiki.create.menu,init,end:0
|
||||
#: wizard_button:wiki.make.index,init,end:0
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "Vazgeç"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wizard.wiki.history.show_diff,diff:0
|
||||
msgid "Diff"
|
||||
msgstr ""
|
||||
msgstr "Farklar"
|
||||
|
||||
#. module: wiki
|
||||
#: field:wiki.wiki,review:0
|
||||
|
||||
Reference in New Issue
Block a user