[MERGE] Merge the changes from main trunk branch.

bzr revid: jma@tinyerp.com-20100616114211-baomq9ypqtpbv3ck
This commit is contained in:
JMA (OpenERP) 2010-06-16 17:12:11 +05:30
commit 3fcdccbeca
111 changed files with 5478 additions and 518 deletions

View File

@ -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-06-04 16:42+0000\n"
"PO-Revision-Date: 2010-06-15 07:00+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-06-11 03:42+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
@ -1176,7 +1176,7 @@ msgstr ""
#. module: account
#: field:account.payment.term,line_ids:0
msgid "Terms"
msgstr "Periodi"
msgstr "Condizioni"
#. module: account
#: rml:account.vat.declaration:0

View File

@ -30,7 +30,7 @@ import invoice
import overdue
import aged_trial_balance
import tax_report
import account_tax_code
#import account_tax_code
import account_balance_landscape
import compare_account_balance
import account_invoice_report

View File

@ -400,13 +400,5 @@
src_model="res.partner.address"
/>
<menuitem icon="terp-purchase" id="base.menu_purchase_root"
name="Procurement Management" sequence="7" />
<menuitem id="base.menu_procurement_management_supplier"
name="Suppliers" parent="base.menu_purchase_root" sequence="3" />
<menuitem name="Contacts" id="menu_partner_contact_supplier_form"
action="action_partner_contact_form"
parent="base.menu_procurement_management_supplier" sequence="2" />
</data>
</openerp>

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-04-09 18:42+0000\n"
"Last-Translator: Nicola Pedron <Unknown>\n"
"PO-Revision-Date: 2010-06-15 12:50+0000\n"
"Last-Translator: Rinux <Unknown>\n"
"Language-Team: Italian <it@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-04-17 04:20+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_module_quality
@ -33,7 +33,7 @@ msgstr ""
#. module: base_module_quality
#: model:ir.module.module,shortdesc:base_module_quality.module_meta_information
msgid "Base module quality"
msgstr ""
msgstr "Modulo base di qualità"
#. module: base_module_quality
#: field:module.quality.check,name:0
@ -63,7 +63,7 @@ msgstr ""
#. module: base_module_quality
#: field:module.quality.detail,ponderation:0
msgid "Ponderation"
msgstr ""
msgstr "Ponderazione"
#. module: base_module_quality
#: help:module.quality.detail,ponderation:0
@ -110,7 +110,7 @@ msgstr ""
#. module: base_module_quality
#: wizard_field:quality_detail_save,init,module_file:0
msgid "Save report"
msgstr ""
msgstr "Salva report"
#. module: base_module_quality
#: wizard_field:quality_detail_save,init,name:0
@ -120,12 +120,12 @@ msgstr ""
#. module: base_module_quality
#: field:module.quality.detail,score:0
msgid "Score (%)"
msgstr ""
msgstr "Punteggio (%)"
#. module: base_module_quality
#: help:quality_detail_save,init,name:0
msgid "Save report as .html format"
msgstr ""
msgstr "Salva report come formato .html"
#. module: base_module_quality
#: view:module.quality.detail:0
@ -146,12 +146,12 @@ msgstr ""
#. module: base_module_quality
#: view:module.quality.detail:0
msgid "Save Report"
msgstr ""
msgstr "Salva report"
#. module: base_module_quality
#: model:ir.actions.wizard,name:base_module_quality.create_quality_check_id
msgid "Quality Check"
msgstr ""
msgstr "Controllo di qualità"
#. module: base_module_quality
#: model:ir.model,name:base_module_quality.model_module_quality_detail
@ -182,4 +182,4 @@ msgstr ""
#. module: base_module_quality
#: field:module.quality.detail,quality_check_id:0
msgid "Quality"
msgstr ""
msgstr "Qualità"

View File

@ -36,6 +36,7 @@ If you don't think you need any of these right now, you can easily install them
<field name="profile_association" on_change="onchange_moduleselection(crm,sale,project,knowledge,stock,mrp,account,purchase,hr,point_of_sale,marketing,misc_tools,report_designer,profile_association,profile_auction,profile_bookstore)"/>
<field name="profile_auction" on_change="onchange_moduleselection(crm,sale,project,knowledge,stock,mrp,account,purchase,hr,point_of_sale,marketing,misc_tools,report_designer,profile_association,profile_auction,profile_bookstore)"/>
<field name="profile_bookstore" on_change="onchange_moduleselection(crm,sale,project,knowledge,stock,mrp,account,purchase,hr,point_of_sale,marketing,misc_tools,report_designer,profile_association,profile_auction,profile_bookstore)"/>
<field name="product_expiry" on_change="onchange_moduleselection(crm,sale,project,knowledge,stock,mrp,account,purchase,hr,point_of_sale,marketing,misc_tools,report_designer,profile_association,profile_auction,profile_bookstore)"/>
</group>
</data>
</field>

View File

@ -75,6 +75,9 @@ class base_setup_installer(osv.osv_memory):
"OpenERP's report creation."),
'thunderbird' :fields.boolean('Thunderbird'),
# Vertical modules
'product_expiry':fields.boolean('Food Industry',
help="Installs a preselected set of OpenERP "
"applications which will help you manage foods."),
'profile_association':fields.boolean('Associations',
help="Installs a preselected set of OpenERP "
"applications which will help you manage your association "

View File

@ -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: 2009-04-24 15:45+0000\n"
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"PO-Revision-Date: 2010-06-15 14:17+0000\n"
"Last-Translator: Niels Huylebroeck <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:15+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: board
@ -26,50 +26,50 @@ msgstr ""
#. module: board
#: model:ir.model,name:board.model_board_board
msgid "board.board"
msgstr ""
msgstr "board.board"
#. module: board
#: field:board.note,user_id:0
msgid "Author"
msgstr ""
msgstr "Auteur"
#. module: board
#: model:ir.module.module,shortdesc:board.module_meta_information
msgid "Dashboard main module"
msgstr ""
msgstr "Algemene dashboard module"
#. module: board
#: view:board.note:0
#: field:board.note,note:0
msgid "Note"
msgstr ""
msgstr "Notitie"
#. module: board
#: field:board.board.line,width:0
msgid "Width"
msgstr ""
msgstr "Breedte"
#. module: board
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Ongeldige modelnaam in de actie-definitie."
#. module: board
#: field:board.board.line,name:0
msgid "Title"
msgstr ""
msgstr "Titel"
#. module: board
#: model:ir.actions.act_window,name:board.action_view_board_list_form
#: model:ir.ui.menu,name:board.menu_view_board_form
msgid "Dashboard Definition"
msgstr ""
msgstr "Dashboard definitie"
#. module: board
#: model:ir.actions.act_window,name:board.action_view_board_note_form
#: model:ir.ui.menu,name:board.menu_view_board_note_form
msgid "Publish a note"
msgstr ""
msgstr "Publiceer een opmerking"
#. module: board
#: wizard_view:board.board.menu.create,init:0

View File

@ -14,7 +14,7 @@
<field name="res_model">purchase.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('date_order','&gt;',time.strftime('%Y-01-01 00:00:00')),('date_order','&lt;',time.strftime('%Y-12-31 23:59:59')), ('state','=','draft')]</field>
<field name="domain">[('date_order','&gt;',time.strftime('%Y-01-01 00:00:00')),('date_order','&lt;',time.strftime('%Y-12-31 23:59:59')), ('state','=','draft')]</field>
<field name="search_view_id" ref="purchase.purchase_order_tree"/>
</record>
<record id="purchase_waiting" model="ir.actions.act_window">
@ -23,7 +23,7 @@
<field name="res_model">purchase.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('date_order','&gt;',time.strftime('%Y-01-01 00:00:00')),('date_order','&lt;',time.strftime('%Y-12-31 23:59:59')), ('state','in',('wait','confirmed'))]</field>
<field name="domain">[('date_order','&gt;',time.strftime('%Y-01-01 00:00:00')),('date_order','&lt;',time.strftime('%Y-12-31 23:59:59')), ('state','in',('wait','confirmed'))]</field>
<field name="search_view_id" ref="purchase.purchase_order_tree"/>
</record>
@ -39,8 +39,8 @@
<action colspan="4" height="220" name="%(purchase_waiting)d" string="Purchase Order in Waiting" width="510"/>
</child1>
<child2>
<action colspan="4" height="220" name="%(purchase.action_purchase_order_qty_amount_all)d" string="Total Qty and Amount by month" />
<action colspan="4" height="220" name="%(purchase.action_purchase_order_by_user_all)d" string="Total Orders by User per month" />
<action colspan="4" height="220" name="%(purchase.action_purchase_order_report_graph)d" string="Total Qty and Amount by month" />
<action colspan="4" height="220" name="%(purchase.action_purchase_order_by_user_all)d" string="Total Orders Lines by User per month" />
</child2>
</hpaned>
</form>

View File

@ -17,6 +17,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import claim_delivery
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,29 @@
# -*- 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 fields, osv
class stock_picking(osv.osv):
_inherit = "stock.picking"
_columns = {
'partner_id': fields.related('address_id','partner_id',type='many2one', relation="res.partner", string="Partner"),
}
stock_picking()

View File

@ -1,12 +1,32 @@
<openerp>
<data>
<record id="view_picking_delivery" model="ir.ui.view">
<field name="name">stock.picking.delivery.form20</field>
<field name="model">stock.picking</field>
<field name="type">form</field>
<field name="priority" eval="2"/>
<field name="inherit_id" ref="stock.view_picking_delivery_form"/>
<field name="arch" type="xml">
<xpath expr="//form/group/field[@name='date']" position="after">
<field name="partner_id" invisible="1"/>
</xpath>
</field>
</record>
<act_window
id="act_claim_from_delivery"
id="action_claim_from_delivery"
name="Claim"
domain="[]"
target="current"
view_mode="form"
res_model="crm.claim"
src_model="stock.picking"/>
<record id="action_claim_from_delivery" model="ir.actions.act_window">
<field name="context">{'default_partner_address_id': address_id, 'default_partner_id': partner_id}</field>
</record>
</data>
</openerp>

View File

@ -74,7 +74,8 @@ class crm_claim(osv.osv, crm.crm_case):
'company_id': fields.many2one('res.company', 'Company'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
domain="[('partner_id','=',partner_id)]"),
# domain="[('partner_id','=',partner_id)]"
),
'email_cc': fields.text('Watchers Emails', size=252, help="These people will receive a copy of the future communication between partner and users by email"),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
'partner_name': fields.char("Employee's Name", size=64),

View File

@ -92,11 +92,18 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Claims">
<group colspan="4" col="4">
<field name="name"/>
<field name="date" string="Date of Claim"/>
<field name="date_deadline" string="Deadline"/>
<group colspan="4" col="4">
<group colspan="1" col="2">
<field name="name" />
</group>
<group colspan="1" col="2">
<field name="date" string="Date of Claim"/>
</group>
<group colspan="1" col="2">
<field name="date_deadline" string="Deadline"/><newline/>
</group>
</group>
<group colspan="4" col="4">
<notebook>
@ -295,5 +302,22 @@
</field>
</record>
<act_window
domain="[('partner_id', '=', active_id)]"
context="{'default_partner_id': active_id}"
id="act_claim_partner"
name="Report a Claim"
res_model="crm.claim"
src_model="res.partner"/>
<act_window
domain="[('partner_address_id', '=', active_id)]"
context="{'default_partner_address_id': active_id}"
id="act_claim_partner_address"
name="Report a Claim"
res_model="crm.claim"
src_model="res.partner.address"/>
</data>
</openerp>

View File

@ -273,7 +273,7 @@
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="/form/notebook/page[@string='Sale Order']/group[1]/button[@name='button_dummy']" position="after">
<button name="%(action_delivery_cost)d" states="draft" string="Delivery Costs" type="action" icon="gtk-execute" context="{'order_id':id}"/>
<button name="%(action_delivery_cost)d" states="draft" string="Delivery Costs" type="action" icon="gtk-add" context="{'order_id':id}"/>
</xpath>
</field>
</record>

View File

@ -633,6 +633,18 @@ class email_template_preview(osv.osv_memory):
_name = "email_template.preview"
_description = "Email Template Preview"
def _get_model_recs(self, cr, uid, context=None):
if context is None:
context = {}
#Fills up the selection box which allows records from the selected object to be displayed
self.context = context
if 'template_id' in context.keys():
ref_obj_id = self.pool.get('email.template').read(cr, uid, context['template_id'], ['object_name'], context)
ref_obj_name = self.pool.get('ir.model').read(cr, uid, ref_obj_id['object_name'][0], ['model'], context)['model']
ref_obj_ids = self.pool.get(ref_obj_name).search(cr, uid, [], context=context)
ref_obj_recs = self.pool.get(ref_obj_name).name_get(cr, uid, ref_obj_ids, context)
return ref_obj_recs
def _default_model(self, cursor, user, context=None):
"""
Returns the default value for model field
@ -643,7 +655,7 @@ class email_template_preview(osv.osv_memory):
return self.pool.get('email.template').read(
cursor,
user,
context['active_id'],
context['template_id'],
['object_name'],
context)['object_name']
@ -652,6 +664,7 @@ class email_template_preview(osv.osv_memory):
'email.template',
'Template', readonly=True),
'rel_model':fields.many2one('ir.model', 'Model', readonly=True),
'rel_model_ref':fields.selection(_get_model_recs, 'Referred Document'),
'to':fields.char('To', size=250, readonly=True),
'cc':fields.char('CC', size=250, readonly=True),
'bcc':fields.char('BCC', size=250, readonly=True),
@ -661,10 +674,9 @@ class email_template_preview(osv.osv_memory):
'report':fields.char('Report Name', size=100, readonly=True),
}
_defaults = {
'ref_template': lambda self, cr, uid, ctx:ctx['active_id'],
'ref_template': lambda self, cr, uid, ctx:ctx['template_id'],
'rel_model': _default_model
}
# Need to check
def on_change_ref(self, cr, uid, ids, rel_model_ref, context=None):
if context is None:
context = {}
@ -673,13 +685,13 @@ class email_template_preview(osv.osv_memory):
vals = {}
if context == {}:
context = self.context
template = self.pool.get('email.template').browse(cr, uid, context['active_id'], context)
template = self.pool.get('email.template').browse(cr, uid, context['template_id'], context)
#Search translated template
lang = get_value(cr, uid, rel_model_ref, template.lang, template, context)
if lang:
ctx = context.copy()
ctx.update({'lang':lang})
template = self.pool.get('email.template').browse(cr, uid, context['active_id'], ctx)
template = self.pool.get('email.template').browse(cr, uid, context['template_id'], ctx)
vals['to'] = get_value(cr, uid, rel_model_ref, template.def_to, template, context)
vals['cc'] = get_value(cr, uid, rel_model_ref, template.def_cc, template, context)
vals['bcc'] = get_value(cr, uid, rel_model_ref, template.def_bcc, template, context)

View File

@ -20,19 +20,17 @@
<newline />
<field name="subject" />
<newline />
<field name="body_text" />
<newline />
<!-- <field name="body_html" widget="text_html" />-->
<!--
Removed text_html because it doesnt work in GTK
And TinyMCE messes up the HTML in Web Client
-->
<field name="body_html"/>
<separator string= "Body(Text)" colspan="2"/>
<newline/>
<field name="body_text" nolabel="1" colspan="2"/>
<newline/>
<separator string= "Body(Html)" colspan="2"/>
<newline/>
<field name="body_html" nolabel="1" colspan="2"/>
<newline />
<field name="report" />
<group>
<button icon="gtk-ok" special="cancel" string="OK" />
</group>
<newline/>
<button icon="gtk-ok" special="cancel" string="OK" colspan="2"/>
</form>
</field>
</record>
@ -46,7 +44,7 @@
<field name="view_mode">form</field>
<field name="auto_refresh" eval="1" />
<field name="target">new</field>
<field name="context">{'ids':active_id}</field>
<field name="context">{'template_id':active_id}</field>
</record>
<!--EMail client Form view -->

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-06-14 03:42+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: google_map

View File

@ -27,6 +27,7 @@ from dateutil.relativedelta import relativedelta
from osv import fields, osv
import netsvc
import tools
from tools.translate import _
_intervalTypes = {
'hours': lambda interval: relativedelta(hours=interval),
@ -207,10 +208,7 @@ class marketing_campaign_activity(osv.osv):
'start': fields.boolean('Start',help= "This activity is launched when the campaign starts."),
'condition': fields.char('Condition', size=256, required=True,
help="Python condition to know if the activity can be launched"),
'type': fields.selection([('email', 'E-mail'),
('paper', 'Paper'),
('action', 'Action'),
('subcampaign', 'Sub-Campaign')],
'type': fields.selection(_actions_type,
'Type', required=True,
help="Describe type of action to be performed on the Activity.Eg : Send email,Send paper.."),
'email_template_id': fields.many2one('email.template','Email Template'),
@ -278,41 +276,6 @@ class marketing_campaign_activity(osv.osv):
print 'Sending Email Init', activity.name
return self.pool.get('email.template').generate_mail(cr, uid, activity.email_template_id.id, [workitem.res_id], context=context)
#if not template.enforce_from_account:
# self.pool.get('marketing.campaign.workitem').write(cr, uid, [workitem.id], {
# 'error_msg': 'There is no account defined for the email',
# 'state': 'exception'
# })
# return False
#if not workitem.partner_id.email:
# self.pool.get('marketing.campaign.workitem').write(cr, uid, [workitem.id], {
# 'error_msg': "There is no email defined for the partner",
# 'state': 'exception'
# })
# return False
#vals = {
# 'email_from': tools.ustr(accounts.name) + "<" + tools.ustr(accounts.email_id) + ">",
# 'email_to': template.email_to,
# 'email_cc': template.email_cc,
# 'email_bcc': template.email_bcc,
# 'subject': template.def_subject,
# 'body_text': template.def_body_text,
# 'body_html': template.def_body_html,
# 'account_id': accounts.id,
# 'state':'na',
# 'mail_type':'multipart/alternative' #Options:'multipart/mixed','multipart/alternative','text/plain','text/html'
#}
# # if accounts.use_sign:
# # signature = self.pool.get('res.users').read(cr, uid, uid, ['signature'], context)['signature']
# # if signature:
# # vals['pem_body_text'] = tools.ustr(vals['pem_body_text'] or '') + signature
# # vals['pem_body_html'] = tools.ustr(vals['pem_body_html'] or '') + signature
##Create partly the mail and later update attachments
#print 'Sending Email', vals
#mail_id = self.pool.get('email_template.mailbox').create(cr, uid, vals, context)
return True
def process_wi_action(self, cr, uid, activity, workitem, context={}):
context = {}
server_obj = self.pool.get('ir.actions.server')
@ -446,7 +409,10 @@ class marketing_campaign_workitem(osv.osv):
self.write(cr, uid, wi.id, {'state': 'done'})
self.process_chain(cr, uid, wi.id, context)
else:
self.write(cr, uid, wi.id, {'state': 'exception'})
vals = {'state': 'exception'}
if type(result) == type({}) and 'error_msg' in result:
vals['error_msg'] = result['error_msg']
self.write(cr, uid, wi.id, vals)
except Exception,e:
self.write(cr, uid, wi.id, {'state': 'exception', 'error_msg': str(e)})
else :
@ -470,6 +436,42 @@ class marketing_campaign_workitem(osv.osv):
if workitem_ids:
self.process(cr, uid, workitem_ids, context)
def preview(self, cr, uid, ids, context):
res = {}
wi_obj = self.browse(cr, uid, ids)[0]
if wi_obj.activity_id.type == 'email':
data_obj = self.pool.get('ir.model.data')
data_id = data_obj._get_id(cr, uid, 'email_template', 'email_template_preview_form')
if data_id:
view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
res = {
'name': _('Email Preview'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'email_template.preview',
'view_id': False,
'context': context,
'views': [(view_id, 'form')],
'type': 'ir.actions.act_window',
'target': 'new',
'nodestroy':True,
'context': "{'template_id':%d,'rel_model_ref':%d}"%
(wi_obj.activity_id.email_template_id.id,
wi_obj.res_id)
}
elif wi_obj.activity_id.type == 'paper':
datas = {'ids': [wi_obj.res_id],
'model': wi_obj.object_id.model}
res = {
'type' : 'ir.actions.report.xml',
'report_name': wi_obj.activity_id.report_id.report_name,
'datas' : datas,
'nodestroy': True,
}
return res
marketing_campaign_workitem()
class email_template(osv.osv):
@ -478,6 +480,21 @@ class email_template(osv.osv):
'object_name': lambda obj, cr, uid, context: context.get('object_id',False),
}
email_template()
class email_template_preview(osv.osv_memory):
_inherit = "email_template.preview"
def _default_rel_model(self, cr, uid, context=None):
if 'rel_model_ref' in context :
return context['rel_model_ref']
else :
return False
_defaults = {
'rel_model_ref' : _default_rel_model
}
email_template_preview()
class report_xml(osv.osv):
_inherit = 'ir.actions.report.xml'

View File

@ -289,7 +289,7 @@
<field name="email_template_id" attrs="{'required':[('type','=','email')]}" />
</group>
<group colspan="4" attrs="{'invisible':[('type','!=','paper')]}" >
<field name="report_id" attrs="{'required':[('type','=','paper')]}"/>
<field name="report_id" attrs="{'required':[('type','=','paper')]}" context="{'object_id':object_id}"/>
<field name="report_directory_id" attrs="{'required':[('type','=','paper')]}" />
</group>
<group colspan="4" attrs="{'invisible':[('type','!=','action')]}" >

View File

@ -20,5 +20,5 @@
##############################################################################
import marketing_campaign_mailchimp
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -32,6 +32,7 @@
'init_xml': [],
'update_xml': [
'marketing_campaign_mailchimp_view.xml',
'wizard/create_list_view.xml',
],
'demo_xml': [],
'installable': True,

View File

@ -18,16 +18,19 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
import urllib
import urllib2
import simplejson as json
import time
from datetime import datetime
from osv import fields, osv
from marketing_campaign.marketing_campaign import _intervalTypes
mailchimp_url = 'http://%s.api.mailchimp.com/1.2'
class marketing_campaign_mailchimp_account(osv.osv): #{{{
_name = "marketing.campaign.mailchimp.account"
class mailchimp_account(osv.osv):
_name = "mailchimp.account"
_columns = {
'name': fields.char('Account Name', size=64),
@ -52,12 +55,10 @@ class marketing_campaign_mailchimp_account(osv.osv): #{{{
params['password'] = mailchimp_account.password
else :
params['apikey'] = mailchimp_account.apikey
params = '&'.join(map(lambda x : '%s=%s' %(x, params[x]), params))
url = mailchimp_url%mailchimp_account.data_center+ '/?method=%s'%method
req = urllib2.Request(url, params)
handle = urllib2.urlopen(req)
response = json.loads(handle.read())
return response
params = urllib.urlencode(params, doseq=True)
response = urllib2.urlopen(url, params)
return json.loads(response.read())
def button_approve(self, cr, uid, ids, context):
acc_obj = self.browse(cr, uid, ids)[0]
@ -80,33 +81,57 @@ class marketing_campaign_mailchimp_account(osv.osv): #{{{
def button_cancel(self, cr, uid, ids, context):
self.write(cr, uid, ids, {'state': 'cancelled'})
return True
marketing_campaign_mailchimp_account() #}}}
def add_partner_list(self, cr, uid, account_id, list_id, partner_ids):
vals = {} # just dictionary with partner_id and updated in list or not
for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids):
params = {'id' : list_id,
'email_address' : partner.email,
'email_type':'text',
'merge_vars[FNAME]':partner.name ,
'merge_vars[date]' : time.strftime('%Y-%m-%d'),
'merge_vars[phone]' : partner.phone,
'merge_vars[website]' : partner.website,
'merge_vars[address][country]' : partner.country.code,
'merge_vars[address][city]' : partner.city,
'double_optin':False}
vals[partner.id] = self.get_response(cr, uid, account_id,
'listSubscribe', params)
return vals
mailchimp_account()
#class marketing_campaign_mailchimp_list(osv.osv_memory): #{{{
# _name = "marketing.campaign.mailchimp.list"
#
# _columns = {
# 'name': fields.char('Name', size=64),
# 'mailchimp_account_id': fields.many2one('marketing.campaign.mailchimp.account', 'Account'),
# 'list_id': fields.char('List Id', size=64,),
# }
#
# _defaults = {
# 'state': lambda *a: 'draft'
# }
#
#marketing_campaign_mailchimp_list() #}}}
class mailchimp_list(osv.osv_memory):
_name = "mailchimp.list"
_description = "Mailchimp list"
_columns = {
'mailchimp_account_id': fields.many2one('mailchimp.account',
'Mailchimp Account', required=True),
'name': fields.char('Name', size=64)
}
mailchimp_list()
class marketing_campaign(osv.osv):
_inherit = "marketing.campaign"
class marketing_campaign_segment(osv.osv): #{{{
_inherit = "marketing.campaign.segment"
_columns = {
'synchro': fields.boolean('Mailchimp Synchro'),
'mailchimp_account_id': fields.many2one(
'marketing.campaign.mailchimp.account', 'Account'),
'mailchimp.account', 'Account'),
'mailchimp_campaign': fields.char('campaign', size=64),
}
marketing_campaign()
class marketing_campaign_activity(osv.osv):
_inherit = "marketing.campaign.activity"
_columns = {
'mailchimp_account_id': fields.many2one(
'mailchimp.account', 'Account'),
'mailchimp_list': fields.char('List', size=64),
}
}
def onchange_mailchimp(self, cr, uid, ids, mailchimp_account_id):
if mailchimp_account_id:
@ -116,16 +141,70 @@ class marketing_campaign_segment(osv.osv): #{{{
def onchange_mailchimp_list(self, cr, uid, ids, mailchimp_account_id,
mailchimp_list):
if mailchimp_account_id and mailchimp_list:
lists = self.pool.get('marketing.campaign.mailchimp.account').get_response(cr,
lists = self.pool.get('mailchimp.account').get_response(cr,
uid, mailchimp_account_id, 'lists')
list_names = [list['name'] for list in lists]
list_names = [l['name'] for l in lists]
if mailchimp_list not in list_names:
raise osv.except_osv('Error!!!',"Lists doesn't exists")
else :
return {}
return {'value':{}}
marketing_campaign_segment() #}}}
def process_wi_mailchimp(self, cr, uid, activity, workitem, context={}):
mailchimp_account_id = activity.mailchimp_account_id.id
list_name = activity.mailchimp_list
mc_acc_obj = self.pool.get('mailchimp.account')
lists = mc_acc_obj.get_response(cr, uid, mailchimp_account_id, 'lists')
list_id = ''
for l in lists :
if l['name'] == list_name:
list_id = l['id']
break;
res_model = workitem.object_id.model
res_id = workitem.res_id
model_obj = self.pool.get(res_model).browse(cr, uid, res_id)
params ={}
if res_model == 'res.partner' :
params.update({'email_address' : model_obj.email,
'merge_vars[FNAME]':model_obj.name and model_obj.name or '',
'merge_vars[website]' : model_obj.website,
'merge_vars[address][country]' : model_obj.country.code,
})
elif res_model == 'crm.lead' :
params.update({'email_address' : model_obj.email_from,
'merge_vars[FNAME]':model_obj.partner_name and \
model_obj.partner_name or '',
'merge_vars[address][country]' : model_obj.country_id and \
model_obj.country_id.code or ''
})
if params['email_address'] :
user = mc_acc_obj.get_response(cr, uid, mailchimp_account_id,
'listMemberInfo',
{'id' : list_id,
'email_address': params['email_address']})
# if there s no user with the specify email it will return error code
# and thus we add that user otherwise user is alredy subscribe and there
# is no need to subscribe user again
if 'error' in user:
params.update({'id' : list_id,
'email_type':'text',
'double_optin':False,
'merge_vars[date]' : time.strftime('%Y-%m-%d'),
'merge_vars[address][city]' : model_obj.city and model_obj.city or '',
'merge_vars[phone]' : model_obj.phone and model_obj.phone or '',
})
res = mc_acc_obj.get_response(cr, uid, mailchimp_account_id, 'listSubscribe', params)
# handle mailchimp error
return True
else :
return {'error_msg' : "Invalid Email Address"}
def __init__(self, *args):
res = super(marketing_campaign_activity, self).__init__(*args)
self._actions.update({'mailchimp' : self.process_wi_mailchimp})
self._actions_type.append(('mailchimp', 'Mailchimp'))
return res
marketing_campaign_activity()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -4,23 +4,38 @@
<!--
================================================================
Marketing Segments Inherited View - mailchimp
Marketing Activity Inherited View - mailchimp
================================================================
-->
<record model="ir.ui.view" id="view_marketing_campaign_segment_form_inherit">
<field name="name">marketing.campaign.segment.form.inherit</field>
<field name="model">marketing.campaign.segment</field>
<record model="ir.ui.view" id="view_marketing_campaign_activity_form_inherit">
<field name="name">marketing.campaign.activity.form.inherit</field>
<field name="model">marketing.campaign.activity</field>
<field name="type">form</field>
<field name="inherit_id" ref="marketing_campaign.view_marketing_campaign_segment_form"/>
<field name="inherit_id" ref="marketing_campaign.view_marketing_campaign_activity_form"/>
<field name="arch" type="xml">
<field name="date_done" position="after">
<separator string="Mailchimp Synchronization" colspan="4"/>
<field name="synchro"/>
<group colspan="2" attrs="{'invisible':[('synchro','!=',True)]}">
<field name="mailchimp_account_id" attrs="{'required':[('synchro','=',True)]}" domain="[('state','=','approved')]" on_change="onchange_mailchimp(mailchimp_account_id)"/>
<field name="mailchimp_list" attrs="{'required':[('synchro','=',True)]}" on_change="onchange_mailchimp_list(mailchimp_account_id,mailchimp_list)"/>
</group>
<field name="type" position="after">
<group colspan="2" ><!--attrs="{'invisible':[('type','!=','mailchimp')]}"-->
<field name="mailchimp_account_id" attrs="{'required':[('type','=','mailchimp')]}" domain="[('state','=','approved')]" on_change="onchange_mailchimp(mailchimp_account_id)"/>
<field name="mailchimp_list" attrs="{'required':[('type','=','mailchimp')]}" on_change="onchange_mailchimp_list(mailchimp_account_id,mailchimp_list)"/>
</group>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_marketing_campaign_form_inherit">
<field name="name">marketing.campaign.form.inherit</field>
<field name="model">marketing.campaign</field>
<field name="type">form</field>
<field name="inherit_id" ref="marketing_campaign.view_marketing_campaign_form"/>
<field name="arch" type="xml">
<field name="type" position="after">
<group colspan="2" attrs="{'invisible':[('type','!=','mailchimp')]}">
<field name="mailchimp_account_id" attrs="{'required':[('type','=','mailchimp')]}" domain="[('state','=','approved')]" on_change="onchange_mailchimp(mailchimp_account_id)"/>
<field name="mailchimp_list" attrs="{'required':[('type','=','mailchimp')]}" on_change="onchange_mailchimp_list(mailchimp_account_id,mailchimp_list)"/>
</group>
</field>
</field>
</record>
@ -35,9 +50,9 @@
<menuitem name="Tools" id="base.menu_tools" icon="STOCK_PREFERENCES" sequence="15"/>
<menuitem name="Mailchimps" id="menu_action_mailchimp" parent="base.menu_tools" />
<record model="ir.ui.view" id="view_marketing_campaign_mailchimp_account_tree">
<field name="name">marketing.campaign.mailchimp.account.tree</field>
<field name="model">marketing.campaign.mailchimp.account</field>
<record model="ir.ui.view" id="view_mailchimp_account_tree">
<field name="name">mailchimp.account.tree</field>
<field name="model">mailchimp.account</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="All Accounts">
@ -49,9 +64,9 @@
</field>
</record>
<record model="ir.ui.view" id="view_marketing_campaign_mailchimp_account_form">
<field name="name">marketing.campaign.mailchimp.account.form</field>
<field name="model">marketing.campaign.mailchimp.account</field>
<record model="ir.ui.view" id="view_mailchimp_account_form">
<field name="name">mailchimp.account.form</field>
<field name="model">mailchimp.account</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Account">
@ -71,16 +86,16 @@
</field>
</record>
<record model="ir.actions.act_window" id="action_marketing_campaign_mailchimp_account">
<record model="ir.actions.act_window" id="action_mailchimp_account">
<field name="name">All Mailchimp Accounts</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">marketing.campaign.mailchimp.account</field>
<field name="res_model">mailchimp.account</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_marketing_campaign_mailchimp_account_tree"/>
<field name="view_id" ref="view_mailchimp_account_tree"/>
</record>
<menuitem id="menu_action_marketing_campaign_mailchimp_account" parent="menu_action_mailchimp" action="action_marketing_campaign_mailchimp_account" sequence="40"/>
<menuitem id="menu_action_mailchimp_account" parent="menu_action_mailchimp" action="action_mailchimp_account" sequence="40"/>
</data>
</openerp>

View File

@ -0,0 +1,24 @@
# -*- 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 create_list
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,64 @@
# -*- 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 fields, osv
from tools.translate import _
import netsvc
class create_list(osv.osv_memory):
_name = "create.list"
_description = "Create List of mailchimp"
# crm.lead remain
_columns = {
'mailchimp_account_id': fields.many2one('mailchimp.account',
'Mailchimp Account', required=True),
'mailchimp_list_id': fields.many2one('mailchimp.list', 'List'),
'list_name': fields.char('Name',size = 64),
'partner_ids': fields.many2many('res.partner',
'create_list_partner_rel',
'cust_list_id', 'partner_id',
'Partner'),
}
def onchange_mailchimp_account_id(self, cr, uid, ids, mailchimp_account_id,
action):
print mailchimp_account_id,action,
return {'value':{}}
def create_list(self, cr, uid, ids, context=None):
create_list_obj = self.browse(cr, uid, ids[0])
print create_list_obj.id
mailchimp_account_obj = self.pool.get('mailchimp.account')
account_id = create_list_obj.mailchimp_account_id
lists = mailchimp_account_obj.get_response(cr, uid, account_id.id, 'lists')
lists = dict([(l['name'],l['id']) for l in lists])
print lists
if create_list_obj.list_name not in lists.keys():
raise osv.except_osv(_('UserError'),
_('There is no list define in account %s') % (account_id.name))
list_id = lists[create_list_obj.list_name]
mailchimp_account_obj.add_partner_list(cr, uid, account_id.id, list_id,
create_list_obj.partner_ids)
return {}
create_list()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,35 @@
<openerp>
<data>
<record id="view_create_list" model="ir.ui.view">
<field name="name">create.list.form</field>
<field name="model">create.list</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Update List">
<field name="mailchimp_account_id" on_change = "onchange_mailchimp_account_id(mailchimp_account_id,action)"/>
<field name="list_name" />
<newline/>
<separator string="Partner" colspan="4"/>
<field name="partner_ids" nolabel="1" colspan="4"/>
<!--group ">
<field name="mailchimp_list_id" />
</group-->
<group col="4" colspan="4">
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
<button name="create_list" string="Update" type="object" icon="gtk-ok"/>
</group>
</form>
</field>
</record>
<record id="action_create_list" model="ir.actions.act_window">
<field name="name">Update List</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">create.list</field>
<field name="view_type">form</field>
<field name="view_id" ref="view_create_list"/>
<field name="target">new</field>
</record>
<menuitem id="menu_action_mailchimp_create_list" parent="menu_action_mailchimp" action="action_create_list" sequence="40"/>
</data>
</openerp>

View File

@ -117,9 +117,9 @@ class mrp_bom(osv.osv):
"""
Defines bills of material for a product.
"""
_name = 'mrp.bom'
_name = 'mrp.bom'
_description = 'Bill of Material'
def _child_compute(self, cr, uid, ids, name, arg, context={}):
""" Gets child bom.
@param self: The object pointer
@ -140,14 +140,14 @@ class mrp_bom(osv.osv):
bom_id = ids[0]
bom_parent = bom_obj.browse(cr, uid, bom_id)
for bom in self.browse(cr, uid, ids, context=context):
if (bom_parent and bom_parent.multi_level_bom) or bom.id == bom_id:
if (bom_parent) or (bom.id == bom_id):
result[bom.id] = map(lambda x: x.id, bom.bom_lines)
else:
result[bom.id] = []
if bom.bom_lines:
continue
ok = ((name=='child_complete_ids') and (bom.product_id.supply_method=='produce'))
if (bom.type=='phantom' or ok) and bom_parent.multi_level_bom:
if (bom.type=='phantom' or ok):
sids = bom_obj.search(cr, uid, [('bom_id','=',False),('product_id','=',bom.product_id.id)])
if sids:
bom2 = bom_obj.browse(cr, uid, sids[0], context=context)
@ -203,7 +203,6 @@ class mrp_bom(osv.osv):
'revision_type': fields.selection([('numeric','numeric indices'),('alpha','alphabetical indices')], 'Index type'),
'child_complete_ids': fields.function(_child_compute,relation='mrp.bom', method=True, string="BoM Hierarchy", type='many2many'),
'company_id': fields.many2one('res.company','Company',required=True),
'multi_level_bom': fields.boolean('Multi-level BoM'),
}
_defaults = {
'active': lambda *a: 1,
@ -212,7 +211,6 @@ class mrp_bom(osv.osv):
'product_rounding': lambda *a: 1.0,
'type': lambda *a: 'normal',
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.bom', context=c),
'multi_level_bom': lambda *a: 0,
}
_order = "sequence"
_sql_constraints = [
@ -247,7 +245,7 @@ class mrp_bom(osv.osv):
v['name'] = prod.name
return {'value': v}
return {}
def _bom_find(self, cr, uid, product_id, product_uom, properties=[]):
""" Finds BoM for particular product and product uom.
@param product_id: Selected product.
@ -954,6 +952,3 @@ class mrp_production_product_line(osv.osv):
}
mrp_production_product_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -252,21 +252,29 @@
<field name="product_qty"/>
<field name="routing_id" groups="base.group_extended"/>
<newline/>
<field name="product_uos" groups="product.group_uos,base.group_extended" widget="selection"/>
<field name="product_uos_qty" groups="product.group_uos,base.group_extended" />
<field name="product_uos" groups="product.group_uos"/>
<field name="product_uos_qty" groups="product.group_uos" />
<newline/>
<field name="multi_level_bom"/>
<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="Components" attrs="{'invisible': [('multi_level_bom','=',False)]}">
<field colspan="4" name="bom_lines" nolabel="1" widget="one2many_list" />
<page string="Components">
<field colspan="4" name="bom_lines" nolabel="1" widget="one2many_list">
<tree string="Components" editable="bottom">
<field name="product_id" on_change="onchange_product_id(product_id, name)" select="1"/>
<field name="product_uom"/>
<field name="product_qty"/>
<field name="name" invisible="1"/>
<field name="date_start"/>
<field name="date_stop"/>
</tree>
</field>
</page>
<page string="Revisions" groups="base.group_extended" attrs="{'invisible': [('bom_id','!=',False),('multi_level_bom','=',False)]}">
<page string="Revisions" groups="base.group_extended" attrs="{'invisible': [('bom_id','!=',False)]}">
<field colspan="4" name="revision_ids" nolabel="1" widget="one2many_list"/>
</page>
<page string="Properties" groups="base.group_extended" attrs="{'invisible': [('bom_id','!=',False),('multi_level_bom','=',False)]}">
<page string="Properties" groups="base.group_extended">
<field name="position"/>
<field name="active"/>
<field name="sequence"/>
@ -499,15 +507,15 @@
<field name="product_id" on_change="product_id_change(product_id)"/>
<field name="product_qty"/>
<group colspan="2" col="3">
<field name="product_uom" widget="selection"/>
<field name="product_uom"/>
<button type="action"
name="%(mrp.action_change_production_qty)d"
string="Change Qty" states="ready,confirmed" />
</group>
<label string="" colspan="2"/>
<field name="product_uos_qty" groups="product.group_uos,base.group_extended"/>
<group colspan="2" col="3" groups="product.group_uos,base.group_extended">
<field name="product_uos" widget="selection"/>
<field name="product_uos_qty" groups="product.group_uos"/>
<group colspan="2" col="3" groups="product.group_uos">
<field name="product_uos"/>
<label string=""/>
</group>
</group>
@ -800,8 +808,8 @@
<field name="product_id"/>
<field name="product_qty"/>
<field name="product_uom"/>
<field name="product_uos_qty" groups="product.group_uos,base.group_extended"/>
<field name="product_uos" groups="product.group_uos,base.group_extended"/>
<field name="product_uos_qty" groups="product.group_uos"/>
<field name="product_uos" groups="product.group_uos"/>
</tree>
</field>
</record>

View File

@ -24,15 +24,17 @@ from tools.translate import _
class product_product(osv.osv):
_inherit = "product.product"
_inherit = "product.product"
_columns = {
"bom_ids": fields.one2many('mrp.bom', 'product_id','Bill of Materials'),
}
def do_change_standard_price(self, cr, uid, ids, datas, context={}):
""" Changes the Standard Price of Product and parent products and creates an account move accordingly.
@param datas: dict. contain default datas like new_price, stock_output_account, stock_input_account, stock_journal
@param context: A standard dictionary
@return:
"""
#TODO : TO Check
@param context: A standard dictionary
@return:
"""
#TODO : TO Check
res = super(product_product, self).do_change_standard_price(cr, uid, ids, datas, context=context)
bom_obj = self.pool.get('mrp.bom')
def _compute_price(bom):
@ -44,7 +46,7 @@ class product_product(osv.osv):
price += bom_line.product_qty * prod_price
accounts = self.get_product_accounts(cr, uid, bom.bom_id.product_id.id, context)
datas = {
'new_price': price,
'stock_output_account': accounts['stock_account_output'],
@ -54,9 +56,9 @@ class product_product(osv.osv):
super(product_product, self).do_change_standard_price(cr, uid, [bom.bom_id.product_id.id], datas, context)
_compute_price(bom.bom_id)
return price
bom_ids = bom_obj.search(cr, uid, [('product_id', 'in', ids)])
for bom in bom_obj.browse(cr, uid, bom_ids):
_compute_price(bom)

View File

@ -2,8 +2,8 @@
"access_mrp_workcenter","mrp.workcenter","model_mrp_workcenter","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
"access_mrp_bom_revision","mrp.bom.revision","model_mrp_bom_revision","mrp.group_mrp_user",1,0,0,0
"access_mrp_bom","mrp.bom","model_mrp_bom","group_mrp_user",1,0,0,0
"access_mrp_bom_revision","mrp.bom.revision","model_mrp_bom_revision","group_mrp_user",1,0,0,0
"access_mrp_production","mrp.production","model_mrp_production","mrp.group_mrp_user",1,1,1,1
"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

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mrp_workcenter mrp.workcenter model_mrp_workcenter mrp.group_mrp_user 1 0 0 0
3 access_mrp_routing mrp.routing model_mrp_routing mrp.group_mrp_user 1 0 0 0
4 access_mrp_routing_workcenter mrp.routing.workcenter model_mrp_routing_workcenter mrp.group_mrp_user 1 0 0 0
5 access_mrp_bom mrp.bom model_mrp_bom mrp.group_mrp_user group_mrp_user 1 0 0 0
6 access_mrp_bom_revision mrp.bom.revision model_mrp_bom_revision mrp.group_mrp_user group_mrp_user 1 0 0 0
7 access_mrp_production mrp.production model_mrp_production mrp.group_mrp_user 1 1 1 1
8 access_mrp_production_workcenter_line mrp.production.workcenter.line model_mrp_production_workcenter_line mrp.group_mrp_user 1 1 1 1
9 access_mrp_production_product_line mrp.production.product.line model_mrp_production_product_line mrp.group_mrp_user 1 1 1 1

View File

@ -182,14 +182,14 @@
-
!python {model: procurement.order}: |
from tools.translate import _
proc_ids = self.search(cr, uid, [('state','!=','cofirmed')])
proc_ids = self.search(cr, uid, [('state','!=','confirmed')])
assert proc_ids, _('No Procurements!')
-
The scheduler runs.
-
!function {model: procurement.order, name: run_scheduler}:
- model: procurement.order
search: "[('state','!=','cofirmed')]"
search: "[('state','!=','confirmed')]"
-
I am checking Internal picking. I see one picking for Orange juice and its
stock moves for Oranges, Sugar and Water made correctly.
@ -247,4 +247,4 @@
picking_ids = pick_obj.search(cr, uid, [('type','=','in')])
self.view_init(cr, uid, ['date','partner_id','address_id'],context={'active_ids': picking_ids})
self.do_partial(cr, uid, [1], context={'active_ids': picking_ids})

View File

@ -0,0 +1,439 @@
# Hindi 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-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-06-14 08:48+0000\n"
"Last-Translator: vir (Open ERP) <vir@tinyerp.com>\n"
"Language-Team: Hindi <hi@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-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: mrp_operations
#: model:process.node,name:mrp_operations.process_node_startoperation0
msgid "Start Operation"
msgstr "ऑपरेशन प्रारंभ करें"
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,state:0
msgid "In Progress"
msgstr "प्रगति में है"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
#: selection:mrp.production.workcenter.line,state:0
#: selection:mrp_operations.operation.code,start_stop:0
msgid "Pause"
msgstr "ठहरें (Pause)"
#. module: mrp_operations
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: mrp_operations
#: model:process.node,note:mrp_operations.process_node_startoperation0
msgid "Operation is started"
msgstr "ऑपरेशन शुरू कर दिया है"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Information"
msgstr "जानकारी"
#. module: mrp_operations
#: model:process.transition,name:mrp_operations.process_transition_startcanceloperation0
msgid "Start Cancel Operation"
msgstr "आरंभ रद्द संचालन"
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
msgid "In Production"
msgstr "उत्पादन में"
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_code_action
msgid "Operations Code"
msgstr "परिचालन संहिता"
#. module: mrp_operations
#: model:process.process,name:mrp_operations.process_process_mrpoperationprocess0
msgid "Mrp Operation Process"
msgstr "एमआरपी ऑपरेशन प्रक्रिया"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
#: field:mrp.production.workcenter.line,state:0
#: field:mrp_operations.operation.code,start_stop:0
msgid "Status"
msgstr "स्थिति"
#. module: mrp_operations
#: model:process.transition,name:mrp_operations.process_transition_startdoneoperation0
msgid "Start Done Operation"
msgstr ""
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
#: selection:mrp_operations.operation.code,start_stop:0
msgid "Start"
msgstr "प्रारंभ"
#. module: mrp_operations
#: field:mrp_operations.operation,production_id:0
msgid "Production"
msgstr "उत्पादन"
#. module: mrp_operations
#: view:mrp_operations.operation:0
msgid "Calendar View"
msgstr "कैलेंडर देखना"
#. module: mrp_operations
#: model:process.node,name:mrp_operations.process_node_workorder0
msgid "Work Center"
msgstr "कार्य केंद्र"
#. module: mrp_operations
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "कार्य की परिभाषा में मॉडल का नाम अमान्य है."
#. module: mrp_operations
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_operation_action
msgid "Work Order Events Using Bar Codes"
msgstr ""
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Set Draft"
msgstr "Set as Draft"
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_action_form
#: view:mrp.production.workcenter.line:0
msgid "Work Orders"
msgstr "काम के आदेश"
#. module: mrp_operations
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_code_action
msgid "Start - Stop Codes"
msgstr "शुरू और बंद कोड"
#. module: mrp_operations
#: field:mrp.production.workcenter.line,uom:0
msgid "UOM"
msgstr ""
#. module: mrp_operations
#: view:mrp_operations.operation.code:0
msgid "Production Operation Code"
msgstr ""
#. module: mrp_operations
#: field:mrp.production.workcenter.line,date_planned:0
msgid "Scheduled Date"
msgstr "अनुसूचित तिथि"
#. module: mrp_operations
#: model:process.transition,note:mrp_operations.process_transition_productionstart0
msgid "From production order, create the workorder"
msgstr "उत्पादन से आदेश, कार्य आदेश बनाने के लिए"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Hours by Workcenter"
msgstr ""
#. module: mrp_operations
#: help:mrp.production,allow_reorder:0
msgid ""
"Check this to be able to move independently all production orders, without "
"moving dependent ones."
msgstr ""
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_action
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_action
msgid "All Work Orders"
msgstr "सभी कार्य आदेश"
#. module: mrp_operations
#: rml:mrp.code.barcode:0
msgid "("
msgstr ""
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Product to Produce"
msgstr ""
#. module: mrp_operations
#: model:ir.actions.report.xml,name:mrp_operations.report_wc_barcode
msgid "Workcenters Barcode"
msgstr "कार्य केंद्र बारकोड"
#. module: mrp_operations
#: model:process.node,note:mrp_operations.process_node_doneoperation0
#: model:process.transition,note:mrp_operations.process_transition_startdoneoperation0
msgid "Operation is done"
msgstr "ऑपरेशन पूरा हो गया है"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Planned Date"
msgstr ""
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
msgid "Ready to Produce"
msgstr "Ready to Produce"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
#: selection:mrp_operations.operation.code,start_stop:0
msgid "Cancel"
msgstr "रद्द करना"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
#: selection:mrp.production.workcenter.line,state:0
msgid "Finished"
msgstr "समाप्त"
#. module: mrp_operations
#: field:mrp.production,allow_reorder:0
msgid "Free Serialisation"
msgstr "नि: शुल्क Serialisation"
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_action_planning
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_draft_action_planning
msgid "Work Orders Planning"
msgstr "कार्य योजना के आदेश"
#. module: mrp_operations
#: model:process.node,name:mrp_operations.process_node_productionorder0
msgid "Production Order"
msgstr "उत्पादन के आदेश"
#. module: mrp_operations
#: model:process.node,note:mrp_operations.process_node_productionorder0
msgid "Production order for any products"
msgstr "किसी भी उत्पाद के लिए उत्पादन के आदेश"
#. module: mrp_operations
#: field:stock.move,move_dest_id_lines:0
msgid "Children Moves"
msgstr ""
#. module: mrp_operations
#: field:mrp_operations.operation.code,name:0
msgid "Operation Name"
msgstr "संचालन नाम"
#. module: mrp_operations
#: model:ir.model,name:mrp_operations.model_mrp_operations_operation
msgid "mrp_operations.operation"
msgstr ""
#. module: mrp_operations
#: field:mrp.production.workcenter.line,date_finnished:0
#: field:mrp.production.workcenter.line,date_planned_end:0
#: field:mrp_operations.operation,date_finished:0
msgid "End Date"
msgstr "आखिरी दिनांक"
#. module: mrp_operations
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "संरचना देखने के लिए अमान्य XML!"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Real"
msgstr "वास्तविक"
#. module: mrp_operations
#: model:ir.module.module,shortdesc:mrp_operations.module_meta_information
msgid "Workcenter Production start end workflow"
msgstr "Workcenter उत्पादन आरंभ और अंत कार्यप्रवाह"
#. module: mrp_operations
#: help:mrp.production.workcenter.line,delay:0
msgid "This is delay between operation start and stop in this workcenter"
msgstr ""
#. module: mrp_operations
#: field:mrp.production.workcenter.line,product:0
msgid "Product"
msgstr "उत्पाद"
#. module: mrp_operations
#: model:process.transition,note:mrp_operations.process_transition_workstartoperation0
msgid "From work order, define the cycles and hour for creating product"
msgstr ""
#. module: mrp_operations
#: field:mrp.production.workcenter.line,delay:0
msgid "Working Hours"
msgstr "कार्य घंटे"
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_draft_action
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_draft_action
msgid "Future Work Orders"
msgstr "भविष्य के कार्य आदेश"
#. module: mrp_operations
#: field:mrp.production.workcenter.line,production_state:0
msgid "Prod.State"
msgstr ""
#. module: mrp_operations
#: field:mrp_operations.operation,order_date:0
msgid "Order Date"
msgstr "आदेश की तिथि"
#. module: mrp_operations
#: model:process.node,note:mrp_operations.process_node_workorder0
msgid "Production Work Center"
msgstr "उत्पादन कार्य केंद्र"
#. module: mrp_operations
#: model:process.transition,name:mrp_operations.process_transition_productionstart0
msgid "Production start Operation"
msgstr "उत्पादन ऑपरेशन शुरू"
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
msgid "Packing Exception"
msgstr "पैकिंग अपवाद"
#. module: mrp_operations
#: field:mrp_operations.operation,workcenter_id:0
msgid "Workcenter"
msgstr "Work center"
#. module: mrp_operations
#: field:mrp.production.workcenter.line,date_start:0
#: field:mrp.production.workcenter.line,date_start_date:0
#: field:mrp_operations.operation,date_start:0
msgid "Start Date"
msgstr "प्रारंभ दिनांक"
#. module: mrp_operations
#: model:ir.model,name:mrp_operations.model_mrp_operations_operation_code
msgid "mrp_operations.operation.code"
msgstr ""
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_operation_action
#: view:mrp.production.workcenter.line:0
msgid "Operations"
msgstr "संचालन"
#. module: mrp_operations
#: field:mrp_operations.operation,code_id:0
#: field:mrp_operations.operation.code,code:0
msgid "Code"
msgstr "कोड"
#. module: mrp_operations
#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_confirm_action
msgid "Confirmed Work Orders"
msgstr "काम के आदेश की पुष्टि की"
#. module: mrp_operations
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_confirm_action
msgid "Work Orders to Do"
msgstr ""
#. module: mrp_operations
#: model:process.node,name:mrp_operations.process_node_canceloperation0
msgid "Cancel Operation"
msgstr "संचालन रद्द"
#. module: mrp_operations
#: model:process.transition,name:mrp_operations.process_transition_workstartoperation0
msgid "Work start Operation"
msgstr "कार्य संचालन शुरू"
#. module: mrp_operations
#: model:ir.actions.report.xml,name:mrp_operations.report_code_barcode
msgid "Start/Stop Barcode"
msgstr "शुरू /बंद बारकोड"
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
#: selection:mrp_operations.operation.code,start_stop:0
msgid "Resume"
msgstr "पुनरारंभ"
#. module: mrp_operations
#: model:process.node,name:mrp_operations.process_node_doneoperation0
msgid "Done Operation"
msgstr ""
#. module: mrp_operations
#: field:mrp.production.workcenter.line,qty:0
msgid "Qty"
msgstr "मात्रा"
#. module: mrp_operations
#: rml:mrp.code.barcode:0
msgid ")"
msgstr ""
#. module: mrp_operations
#: view:mrp_operations.operation:0
msgid "Production Operation"
msgstr ""
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
#: selection:mrp_operations.operation.code,start_stop:0
msgid "Done"
msgstr ""
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
msgid "Waiting Goods"
msgstr ""
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Duration"
msgstr ""
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
#: selection:mrp.production.workcenter.line,state:0
msgid "Draft"
msgstr ""
#. module: mrp_operations
#: model:process.node,note:mrp_operations.process_node_canceloperation0
#: model:process.transition,note:mrp_operations.process_transition_startcanceloperation0
msgid "Operation is cancelled"
msgstr ""
#. module: mrp_operations
#: selection:mrp.production.workcenter.line,production_state:0
#: selection:mrp.production.workcenter.line,state:0
msgid "Canceled"
msgstr ""
#. module: mrp_operations
#: view:mrp.production.workcenter.line:0
msgid "Start working"
msgstr ""

View File

@ -0,0 +1,669 @@
# Hindi 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-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-06-15 06:37+0000\n"
"Last-Translator: vir (Open ERP) <vir@tinyerp.com>\n"
"Language-Team: Hindi <hi@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-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Fees Line"
msgstr "मुक्त लाइन"
#. module: mrp_repair
#: field:mrp.repair.fee,repair_id:0
#: field:mrp.repair.line,repair_id:0
msgid "Repair Order Ref"
msgstr "मरम्मत के आदेश संदर्भ"
#. module: mrp_repair
#: field:mrp.repair.line,move_id:0
msgid "Inventory Move"
msgstr ""
#. module: mrp_repair
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "कार्य की परिभाषा में मॉडल का नाम अमान्य है."
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Untaxed amount"
msgstr "कर राशि के बिना"
#. module: mrp_repair
#: field:mrp.repair,state:0
msgid "Repair State"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Printing Date"
msgstr "मुद्रण दिनांक"
#. module: mrp_repair
#: field:mrp.repair.fee,product_uom_qty:0
#: rml:repair.order:0
msgid "Quantity"
msgstr "मात्रा"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Set to Draft"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
msgid "Invoice Exception"
msgstr "चालान अपवाद"
#. module: mrp_repair
#: field:mrp.repair,address_id:0
msgid "Delivery Address"
msgstr "वितरण पता"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Make Invoice"
msgstr "चालान बनाएँ"
#. module: mrp_repair
#: field:mrp.repair.fee,price_subtotal:0
#: field:mrp.repair.line,price_subtotal:0
msgid "Subtotal"
msgstr "उप कुल"
#. module: mrp_repair
#: rml:repair.order:0
msgid "Invoice address :"
msgstr "चालान पता"
#. module: mrp_repair
#: field:mrp.repair,guarantee_limit:0
msgid "Guarantee limit"
msgstr "गारंटी की सीमा"
#. module: mrp_repair
#: field:mrp.repair,amount_tax:0
#: field:mrp.repair.fee,tax_id:0
#: field:mrp.repair.line,tax_id:0
msgid "Taxes"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Net Total :"
msgstr "नेट कुल:"
#. module: mrp_repair
#: rml:repair.order:0
msgid "VAT"
msgstr "वैट"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Operations"
msgstr "संचालन"
#. module: mrp_repair
#: field:mrp.repair,move_id:0
msgid "Move"
msgstr "स्थानान्तर"
#. module: mrp_repair
#: model:ir.actions.act_window,name:mrp_repair.action_repair_order_tree
msgid "Repair Orders"
msgstr "मरम्मत के आदेश"
#. module: mrp_repair
#: model:ir.actions.report.xml,name:mrp_repair.report_mrp_repair
msgid "Quotation / Order"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Extra Info"
msgstr "अतिरिक्त जानकारी"
#. module: mrp_repair
#: field:mrp.repair,partner_id:0
msgid "Partner"
msgstr "साथी"
#. module: mrp_repair
#: model:ir.actions.act_window,name:mrp_repair.action_repair_quotation_tree
#: model:ir.ui.menu,name:mrp_repair.menu_repair_quotation
msgid "Repairs in quotation"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
#: selection:mrp.repair.line,state:0
msgid "Confirmed"
msgstr "पुष्टि"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Recreate Invoice"
msgstr "फिर से चालान बनाने"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Repairs order"
msgstr "मरम्मत के आदेश"
#. module: mrp_repair
#: rml:repair.order:0
msgid "Repair Order N° :"
msgstr "मरम्मत के आदेश N °:"
#. module: mrp_repair
#: field:mrp.repair,prodlot_id:0
#: rml:repair.order:0
msgid "Lot Number"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
msgid "Under Repair"
msgstr "मरम्मत के तहत"
#. module: mrp_repair
#: field:mrp.repair,fees_lines:0
msgid "Fees Lines"
msgstr "फीस लाइन्स"
#. module: mrp_repair
#: model:ir.model,name:mrp_repair.model_mrp_repair_fee
msgid "Repair Fees line"
msgstr "मरम्मत शुल्क लाइन"
#. module: mrp_repair
#: rml:repair.order:0
msgid "Fees Line(s)"
msgstr "फीस लाइन (ओं)"
#. module: mrp_repair
#: selection:mrp.repair,state:0
msgid "To be Invoiced"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Shipping address :"
msgstr "शिपिंग का पता"
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Start Repair"
msgstr "मरम्मत शुरू"
#. module: mrp_repair
#: field:mrp.repair.line,product_uom_qty:0
msgid "Quantity (UoM)"
msgstr "मात्रा (UoM)"
#. module: mrp_repair
#: field:mrp.repair.fee,to_invoice:0
#: field:mrp.repair.line,to_invoice:0
msgid "To Invoice"
msgstr ""
#. module: mrp_repair
#: model:ir.ui.menu,name:mrp_repair.menu_repair_order
msgid "Repairs"
msgstr "मरम्मत"
#. module: mrp_repair
#: field:mrp.repair,picking_id:0
msgid "Packing"
msgstr "पैकिंग"
#. module: mrp_repair
#: rml:repair.order:0
msgid "Total :"
msgstr "कुल:"
#. module: mrp_repair
#: field:mrp.repair,pricelist_id:0
msgid "Pricelist"
msgstr "मूल्य सूची"
#. module: mrp_repair
#: help:mrp.repair,state:0
msgid "Gives the state of the Repair Order"
msgstr "मरम्मत के आदेश की स्थिति देना"
#. module: mrp_repair
#: view:mrp.repair:0
#: field:mrp.repair,quotation_notes:0
msgid "Quotation Notes"
msgstr ""
#. module: mrp_repair
#: model:ir.actions.act_window,name:mrp_repair.action_repair_progress_tree
#: model:ir.ui.menu,name:mrp_repair.menu_repair_progress
msgid "Repairs in progress"
msgstr "मरम्मत में प्रगति"
#. module: mrp_repair
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "संरचना देखने के लिए अमान्य XML!"
#. module: mrp_repair
#: help:mrp.repair,guarantee_limit:0
msgid ""
"The garantee limit is computed as: last move date + warranty defined on "
"selected product. If the current date is below the garantee limit, each "
"operation and fee you will add will be set as 'not to invoiced' by default. "
"Note that you can change manually afterwards."
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Repair Line"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "N° :"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,invoice_method:0
msgid "Invoice Method"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,repaired:0
msgid "Repaired"
msgstr ""
#. module: mrp_repair
#: wizard_field:mrp.repair.make_invoice,init,group:0
msgid "Group by partner invoice address"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.fee,invoice_line_id:0
#: field:mrp.repair.line,invoice_line_id:0
msgid "Invoice Line"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Total amount"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair.line,state:0
msgid "Canceled"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,invoice_method:0
msgid "Before Repair"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,location_id:0
msgid "Current Location"
msgstr ""
#. module: mrp_repair
#: wizard_button:mrp.repair.cancel,display,yes:0
msgid "Yes"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,invoiced:0
#: field:mrp.repair.fee,invoiced:0
#: field:mrp.repair.line,invoiced:0
msgid "Invoiced"
msgstr ""
#. module: mrp_repair
#: wizard_button:mrp.repair.cancel,display,end:0
msgid "No"
msgstr ""
#. module: mrp_repair
#: wizard_view:mrp.repair.make_invoice,init:0
#: wizard_button:mrp.repair.make_invoice,init,invoice:0
msgid "Create invoices"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair.line,type:0
#: rml:repair.order:0
msgid "Add"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair.line,state:0
msgid "Draft"
msgstr ""
#. module: mrp_repair
#: model:ir.actions.act_window,name:mrp_repair.action_repair_order_form
#: model:ir.ui.menu,name:mrp_repair.menu_repair_form
msgid "New Repair"
msgstr ""
#. module: mrp_repair
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,amount_untaxed:0
msgid "Untaxed Amount"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.line,state:0
msgid "Status"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Guarantee Limit"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,product_id:0
#: rml:repair.order:0
msgid "Product to Repair"
msgstr ""
#. module: mrp_repair
#: help:mrp.repair,pricelist_id:0
msgid "The pricelist comes from the selected partner, by default."
msgstr ""
#. module: mrp_repair
#: wizard_view:mrp.repair.cancel,display:0
msgid ""
"This operation will cancel the Repair process, but will not cancel it's "
"Invoice. Do you want to continue?"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
msgid "Quotation"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Compute"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Confirm Repair"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Repair Quotation"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "End Repair"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "History"
msgstr ""
#. module: mrp_repair
#: model:ir.model,name:mrp_repair.model_mrp_repair
msgid "Repairs Order"
msgstr ""
#. module: mrp_repair
#: model:ir.actions.act_window,name:mrp_repair.action_repair_ready_tree
#: model:ir.ui.menu,name:mrp_repair.menu_repair_ready
msgid "Repairs Ready to Start"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Qty"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
#: selection:mrp.repair.line,state:0
msgid "Done"
msgstr ""
#. module: mrp_repair
#: model:ir.actions.act_window,name:mrp_repair.action_repair_2binvoiced_tree
#: model:ir.ui.menu,name:mrp_repair.menu_repair_2binvoiced
msgid "Repairs to be invoiced"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,invoice_id:0
msgid "Invoice"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Fees"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
#: wizard_button:mrp.repair.make_invoice,init,end:0
msgid "Cancel"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.line,location_dest_id:0
msgid "Dest. Location"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Operation Line(s)"
msgstr ""
#. module: mrp_repair
#: model:ir.model,name:mrp_repair.model_mrp_repair_line
msgid "Repair Operations Lines"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,location_dest_id:0
msgid "Delivery Location"
msgstr ""
#. module: mrp_repair
#: model:ir.module.module,shortdesc:mrp_repair.module_meta_information
msgid "Products Repairs Module"
msgstr ""
#. module: mrp_repair
#: help:mrp.repair,invoice_method:0
msgid ""
"This field allow you to change the workflow of the repair order. If value "
"selected is different from 'No Invoice', it also allow you to select the "
"pricelist and invoicing address."
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.fee,price_unit:0
#: field:mrp.repair.line,price_unit:0
#: rml:repair.order:0
msgid "Unit Price"
msgstr ""
#. module: mrp_repair
#: wizard_view:mrp.repair.make_invoice,init:0
msgid "Do you really want to create the invoices ?"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.fee,name:0
#: field:mrp.repair.line,name:0
#: rml:repair.order:0
msgid "Description"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,operations:0
msgid "Operation Lines"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.fee,product_id:0
#: field:mrp.repair.line,product_id:0
msgid "Product"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Invoice Corrected"
msgstr ""
#. module: mrp_repair
#: help:mrp.repair,deliver_bool:0
msgid ""
"Check this box if you want to manage the delivery once the product is "
"repaired. If cheked, it will create a packing with selected product. Note "
"that you can select the locations in the Info tab, if you have the extended "
"view."
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.line,type:0
msgid "Type"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Price"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,deliver_bool:0
msgid "Deliver"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
#: field:mrp.repair,internal_notes:0
msgid "Internal Notes"
msgstr ""
#. module: mrp_repair
#: rml:repair.order:0
msgid "Taxes:"
msgstr ""
#. module: mrp_repair
#: model:ir.actions.wizard,name:mrp_repair.wizard_mrp_repair_make_invoice
msgid "Make invoices"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,name:0
msgid "Repair Ref"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "UoM"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair.line,type:0
#: rml:repair.order:0
msgid "Remove"
msgstr ""
#. module: mrp_repair
#: wizard_view:mrp.repair.cancel,display:0
msgid "Cancel Repair...??"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.fee,product_uom:0
#: field:mrp.repair.line,product_uom:0
msgid "Product UoM"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,partner_invoice_id:0
msgid "Invoicing Address"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,invoice_method:0
msgid "After Repair"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Invoicing"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair.line,location_id:0
msgid "Source Location"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "Quality"
msgstr ""
#. module: mrp_repair
#: model:ir.actions.wizard,name:mrp_repair.action_cancel_repair
#: view:mrp.repair:0
msgid "Cancel Repair"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,invoice_method:0
msgid "No Invoice"
msgstr ""
#. module: mrp_repair
#: view:mrp.repair:0
msgid "States"
msgstr ""
#. module: mrp_repair
#: help:mrp.repair,partner_id:0
msgid ""
"This field allow you to choose the parner that will be invoiced and delivered"
msgstr ""
#. module: mrp_repair
#: field:mrp.repair,amount_total:0
msgid "Total"
msgstr ""
#. module: mrp_repair
#: selection:mrp.repair,state:0
msgid "Ready to Repair"
msgstr ""

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-12-08 11:46+0000\n"
"PO-Revision-Date: 2010-01-26 11:01+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-06-15 12:42+0000\n"
"Last-Translator: Rinux <Unknown>\n"
"Language-Team: Italian <it@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-04-17 04:21+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: multi_company
@ -70,7 +70,7 @@ msgstr ""
#: model:ir.module.module,shortdesc:multi_company.module_meta_information
#: view:multi_company.default:0
msgid "Multi Company"
msgstr ""
msgstr "Multi Azienda"
#. module: multi_company
#: model:ir.module.module,description:multi_company.module_meta_information
@ -133,17 +133,17 @@ msgstr ""
#. module: multi_company
#: model:ir.model,name:multi_company.model_multi_company_default
msgid "multi_company.default"
msgstr ""
msgstr "multi_azienda.default"
#. module: multi_company
#: help:multi_company.default,company_id:0
msgid "Company where the user is connected"
msgstr ""
msgstr "Azienda con la quale l'utente è connesso"
#. module: multi_company
#: model:ir.actions.act_window,name:multi_company.action_inventory_form
msgid "Default Company per Object"
msgstr ""
msgstr "Azienda Predefinita per Oggetto"
#. module: multi_company
#: field:multi_company.default,expression:0
@ -173,12 +173,12 @@ msgstr ""
#. module: multi_company
#: help:multi_company.default,expression:0
msgid "Expression, must be True to match"
msgstr ""
msgstr "Espressione, deve essere Vero per corrispondere"
#. module: multi_company
#: model:ir.ui.menu,name:multi_company.menu_action_inventory_form
msgid "Default company per Object"
msgstr ""
msgstr "Azienda predefinitaa per Oggetto"
#. module: multi_company
#: code:addons/multi_company/multi_company.py:0

View File

@ -66,6 +66,7 @@ Main features :
'pos_report.xml',
# 'pos_wizard.xml',
'pos_view.xml',
'report/report_pos_order_view.xml',
'pos_sequence.xml',
'posrule_data.xml',
'pos_data.xml',

View File

@ -246,6 +246,9 @@ class account_bank_statement(osv.osv):
self.write(cr, uid, statement.id, {'balance_end_real':Decimal(str(val_statement_line))+Decimal(str(val2)),'closing_date':time.strftime("%Y-%m-%d %H:%M:%S"),'state':'draft'})
# self.write(cr, uid, statement.id, {'balance_end_real':bal_st+val_statement_line,'closing_date':time.strftime("%Y-%m-%d %H:%M:%S"),'state':'draft'})
return super(account_bank_statement, self).button_confirm(cr, uid, ids, context=None)
def button_cancel(self, cr, uid, ids, context={}):
self.write(cr, uid, ids, {'state':'draft'}, context=context)
account_bank_statement()

View File

@ -37,5 +37,6 @@ import pos_sales_user_today_current_user
import pos_receipt_with_remboursment
import pos_receipt_without_remboursment
import point_of_sale_report
import report_pos_order
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,89 @@
# -*- 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 tools
from osv import fields,osv
class report_pos_order(osv.osv):
_name = "report.pos.order"
_description = "Point of Sale Orders Statistics"
_auto = False
_columns ={
'date': fields.date('Date Order', readonly=True),
'date_validation': fields.date('Date Confirm', readonly=True),
'date_payment': fields.date('Date Confirm', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
'product_id':fields.many2one('product.product', 'Product', readonly=True),
'state': fields.selection([('draft', 'Draft'), ('payment', 'Payment'),
('advance','Advance'),
('paid', 'Paid'), ('done', 'Done'), ('invoiced', 'Invoiced'), ('cancel', 'Cancel')],
'State'),
'user_id':fields.many2one('res.users', 'Salesman', readonly=True),
'price_total':fields.float('Total Price', readonly=True),
'shop_id':fields.many2one('sale.shop', 'Shop', readonly=True),
'company_id':fields.many2one('res.company', 'Company', readonly=True),
'nbr':fields.integer('# of Lines', readonly=True),
'product_qty':fields.float('# of Qty', readonly=True),
'journal_id': fields.many2one('account.journal', 'Journal'),
}
_order = 'date desc'
def init(self, cr):
tools.drop_view_if_exists(cr, 'report_pos_order')
cr.execute("""
create or replace view report_pos_order as (
select el.*,
(select 1) as nbr,
to_date(to_char(po.date_order, 'dd-MM-YYYY'),'dd-MM-YYYY') as date,
po.date_validation as date_validation,
po.date_payment as date_payment,
to_char(po.date_order, 'YYYY') as year,
to_char(po.date_order, 'MM') as month,
to_char(po.date_order, 'YYYY-MM-DD') as day,
po.partner_id as partner_id,
po.state as state,
po.user_id as user_id,
po.shop_id as shop_id,
po.company_id as company_id,
po.sale_journal as journal_id
from
pos_order as po,
( select pl.id as id,
pl.product_id as product_id,
pl.qty as product_qty,
sum(pl.qty * pl.price_unit)- sum(pl.qty * pl.price_ded) as price_total,
pl.order_id
from
pos_order_line as pl
left join product_template pt on (pt.id=pl.product_id)
group by
pl.id,pl.order_id, pl.qty,pl.product_id) el
where po.id = el.order_id
)
""")
report_pos_order()

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_report_pos_order_tree" model="ir.ui.view">
<field name="name">report.pos.order.tree</field>
<field name="model">report.pos.order</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Point of Sale Analysis">
<field name="date" />
<field name="date_validation" invisible="1"/>
<field name="date_payment" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
<field name="day" invisible="1"/>
<field name="month" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="shop_id" invisible="1"/>
<field name="journal_id" invisible="1"/>
<field name="company_id" invisible="1" groups="base.group_multi_company"/>
<field name="nbr" sum="# of Lines"/>
<field name="product_qty" sum="# of Qty"/>
<field name="price_total" sum="Total Price"/>
<field name="state" invisible="1"/>
</tree>
</field>
</record>
<record id="view_report_pos_order_search" model="ir.ui.view">
<field name="name">report.pos.order.search</field>
<field name="model">report.pos.order</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Point of Sale Analysis">
<group>
<filter icon="terp-go-year" string=" 365 Days "
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created last 365 days"/>
<filter icon="terp-go-month" string=" 30 Days "
name="month"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created in last 30 days"/>
<filter icon="terp-go-week"
string=" 7 Days "
separator="1"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created last 7 days"/>
<separator orientation="vertical"/>
<filter icon="terp-document-new"
string="Draft"
domain="[('state','=','draft')]"/>
<filter icon="terp-dolar"
string="Paid"
domain="[('state','=',('paid'))]"/>
<filter icon="terp-dolar"
string="Invoiced"
domain="[('state','=',('invoiced'))]"/>
<separator orientation="vertical"/>
<field name="partner_id"/>
<field name="user_id" widget="selection">
<filter icon="terp-dolar"
string="My Sales"
help="My Sales"
domain="[('user_id','=',uid)]"/>
</field>
</group>
<newline/>
<group expand="0" string="Group By..." colspan="10" col="12">
<filter string="Salesman" icon="terp-personal" name="User" context="{'group_by':'user_id'}"/>
<filter string="Partner" icon="terp-personal" context="{'group_by':'partner_id'}"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/>
<filter string="Shop" icon="terp-go-home" context="{'group_by':'shop_id'}"/>
<filter string="Company" icon="terp-go-home" groups="base.group_multi_company" context="{'group_by':'company_id'}"/>
<separator orientation="vertical"/>
<filter string="Day" icon="terp-go-month" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
</group>
</search>
</field>
</record>
<record id="action_report_pos_order_all" model="ir.actions.act_window">
<field name="name">Point of Sale Analysis</field>
<field name="res_model">report.pos.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="search_view_id" ref="view_report_pos_order_search"/>
<field name="context">{'search_default_month':1,'search_default_User':1}</field>
</record>
<menuitem action="action_report_pos_order_all" id="menu_report_pos_order_all" parent="menu_point_rep" sequence="1"/>
</data>
</openerp>

View File

@ -37,3 +37,5 @@
"access_pos_make_payment","pos.make.payment","model_pos_make_payment","point_of_sale.group_pos_user",1,0,0,0
"access_pos_scan_product","pos.scan.product","model_pos_scan_product","point_of_sale.group_pos_user",1,0,0,0
"access_pos_payment_report","pos.payment.report","model_pos_payment_report","point_of_sale.group_pos_user",1,0,0,0
"access_report_pos_order","report.pos.order","model_report_pos_order","point_of_sale.group_pos_user",1,0,0,0
"access_pos_return","pos.return","model_pos_return","point_of_sale.group_pos_user",1,0,0,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
37 access_pos_make_payment pos.make.payment model_pos_make_payment point_of_sale.group_pos_user 1 0 0 0
38 access_pos_scan_product pos.scan.product model_pos_scan_product point_of_sale.group_pos_user 1 0 0 0
39 access_pos_payment_report pos.payment.report model_pos_payment_report point_of_sale.group_pos_user 1 0 0 0
40 access_report_pos_order report.pos.order model_report_pos_order point_of_sale.group_pos_user 1 0 0 0
41 access_pos_return pos.return model_pos_return point_of_sale.group_pos_user 1 0 0 0

View File

@ -24,7 +24,7 @@
<field name="model">account.bank.statement</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree colors="red:balance_end_real!=balance_end;blue:state=='draft' and (balance_end_real==balance_end)" string="Statement">
<tree colors="red:balance_end_real!=balance_end;blue:state=='draft' and (balance_end_real==balance_end);black:state in ('open');blue:state in ('draft')" string="Statement">
<field name="date"/>
<field name="name"/>
<field name="journal_id"/>
@ -34,6 +34,9 @@
<field name="balance_end"/>
<field name="user_id"/>
<field name="state"/>
<button type="object" string="Open" name="button_open" states="draft" icon="terp-camera_test"/>
<button type="object" string="Confirm" name="button_confirm" states="open" icon="terp-gtk-go-back-rtl"/>
<button type="object" string="Cancel" name="button_cancel" states="confirm" icon="terp-gtk-stop"/>
</tree>
</field>
</record>
@ -349,11 +352,43 @@
<menuitem action="action_bank_statement_treenew" id="menu_statement_tree2" parent="menu_statement_tree_all" sequence="1"/>
<record id="view_account_bank_statment_filter" model="ir.ui.view">
<field name="name">account.bank.statment.select</field>
<field name="model">account.bank.statement</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Cashbox">
<group col='9' colspan='4'>
<filter icon="terp-camera_test" string="Open"
domain="[('state','=','open')]"
help="All open cashboxes"/>
<filter icon="terp-dialog-close" string="To Close"
domain="[('state','=','draft')]"
help="All cashboxes to close"/>
<filter icon="terp-go-today" name="Today" string="Today"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d 23:59:59'))]"
help="All cashboxes to opened today"/>
<separator orientation="vertical"/>
<field name="name"/>
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="20">
<filter string="Journal" icon="terp-folder-blue" domain="[]" context="{'group_by':'journal_id'}"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
</group>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_pos_account_bank_statment">
<field name="name">All Cashboxes</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.bank.statement</field>
<field name="view_type">form</field>
<field name="view_id" eval="False"/>
<field name="context">{'search_default_Today':1}</field>
<field name="search_view_id" ref="view_account_bank_statment_filter"/>
</record>
<record model="ir.actions.act_window.view" id="act_statement_a1">
<field name="sequence" eval="1"/>
@ -367,7 +402,7 @@
<field name="view_id" ref="view_bank_statement_form3"/>
<field name="act_window_id" ref="action_pos_account_bank_statment"/>
</record>
<menuitem name="All Cashboxes" parent="menu_point_report_register"
<menuitem name="All Cashboxes" parent="menu_statement_tree_all"
action="action_pos_account_bank_statment" id="menu_pos_bank_statment_tree" groups="base.group_extended" sequence="4"/>
<record model="ir.actions.act_window" id="action_my_all_pos_account_bank_statment">
@ -414,8 +449,8 @@
<field name="act_window_id" ref="action_cashboxes_to_close"/>
</record>
<menuitem name="Cashboxes to Close" parent="menu_pos_bank_statment_tree"
action="action_cashboxes_to_close" id="menu_cashboxes_to_close_tree" groups="base.group_extended"/>
<!-- <menuitem name="Cashboxes to Close" parent="menu_statement_tree_all"-->
<!-- action="action_cashboxes_to_close" id="menu_cashboxes_to_close_tree" groups="base.group_extended"/>-->
<menuitem

View File

@ -37,7 +37,9 @@ class procurement_order(osv.osv):
context = {}
if use_new_cursor:
print 'Cursor New', cr,
cr = pooler.get_db(use_new_cursor).cursor()
print cr
wf_service = netsvc.LocalService("workflow")
procurement_obj = self.pool.get('procurement.order')
@ -122,6 +124,7 @@ class procurement_order(osv.osv):
})
if use_new_cursor:
cr.commit()
print 'Cursor Close', cr
cr.close()
return {}
@ -172,7 +175,9 @@ class procurement_order(osv.osv):
if not context:
context = {}
if use_new_cursor:
print 'Cursor New', cr,
cr = pooler.get_db(use_new_cursor).cursor()
print cr
orderpoint_obj = self.pool.get('stock.warehouse.orderpoint')
location_obj = self.pool.get('stock.location')
procurement_obj = self.pool.get('procurement.order')
@ -236,6 +241,7 @@ class procurement_order(osv.osv):
})
if use_new_cursor:
cr.commit()
print 'Cursor Close', cr
cr.close()
return {}
procurement_order()

View File

@ -1,9 +1,11 @@
"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",stock.group_stock_manager,1,1,1,1
"access_mrp_property","mrp.property","model_mrp_property",stock.group_stock_manager,1,1,1,1
"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_procurement","procurement.order","model_procurement_order",,1,0,0,0
"access_stock_warehouse_orderpoint","stock.warehouse.orderpoint","model_stock_warehouse_orderpoint",,1,0,0,0
"access_procurement_compute_all","procurement.order.compute.all","model_procurement_order_compute_all",,1,0,0,0
"access_procurement_orderpoint_compute","procurement.orderpoint.compute","model_procurement_orderpoint_compute",,1,0,0,0
"access_mrp_make_procurement","make.procurement","model_make_procurement",,1,0,0,0
"access_mrp_make_procurement","procurement.order.compute","model_procurement_order_compute",,1,0,0,0
"access_mrp_property","mrp.property","model_mrp_property",base.group_user,1,0,0,0
"access_procurement","procurement.order","model_procurement_order",base.group_user,1,0,0,0
"access_stock_warehouse_orderpoint","stock.warehouse.orderpoint","model_stock_warehouse_orderpoint",stock.group_stock_manager,1,1,1,1
"access_procurement_compute_all","procurement.order.compute.all","model_procurement_order_compute_all",stock.group_stock_manager,1,1,1,1
"access_procurement_orderpoint_compute","procurement.orderpoint.compute","model_procurement_orderpoint_compute",stock.group_stock_manager,1,1,1,1
"access_mrp_make_procurement","make.procurement","model_make_procurement",stock.group_stock_manager,1,1,1,1
"access_mrp_make_procurement","procurement.order.compute","model_procurement_order_compute",stock.group_stock_manager,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mrp_property_group mrp.property.group model_mrp_property_group stock.group_stock_manager 1 1 1 1
3 access_mrp_property mrp.property model_mrp_property stock.group_stock_manager 1 1 1 1
4 access_mrp_property_group mrp.property.group model_mrp_property_group 1 0 0 0
5 access_mrp_property mrp.property model_mrp_property base.group_user 1 0 0 0
6 access_procurement procurement.order model_procurement_order base.group_user 1 0 0 0
7 access_stock_warehouse_orderpoint stock.warehouse.orderpoint model_stock_warehouse_orderpoint stock.group_stock_manager 1 0 1 0 1 0 1
8 access_procurement_compute_all procurement.order.compute.all model_procurement_order_compute_all stock.group_stock_manager 1 0 1 0 1 0 1
9 access_procurement_orderpoint_compute procurement.orderpoint.compute model_procurement_orderpoint_compute stock.group_stock_manager 1 0 1 0 1 0 1
10 access_mrp_make_procurement make.procurement model_make_procurement stock.group_stock_manager 1 0 1 0 1 0 1
11 access_mrp_make_procurement procurement.order.compute model_procurement_order_compute stock.group_stock_manager 1 0 1 0 1 0 1

View File

@ -31,7 +31,8 @@ class procurement_compute(osv.osv_memory):
proc_obj = self.pool.get('procurement.order')
proc_obj._procure_confirm(cr, uid, use_new_cursor=cr.dbname, context=context)
finally:
cr.close()
pass
#cr.close()
return {}
def procure_calculation(self, cr, uid, ids, context):

View File

@ -45,10 +45,12 @@ class procurement_compute_all(osv.osv_memory):
"""
proc_obj = self.pool.get('procurement.order')
for proc in self.browse(cr, uid, ids):
print 'Cursor', cr
proc_obj.run_scheduler(cr, uid, automatic=proc.automatic, use_new_cursor=cr.dbname,\
context=context)
print 'Cursor', cr
return {}
def procure_calculation(self, cr, uid, ids, context):
"""
@param self: The object pointer.

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-06-14 03:42+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: product

View File

@ -45,7 +45,7 @@
<field name="name"/>
<field name="categ_id" invisible="1"/>
<field name="variants" groups="product.group_product_variant"/>
<field name="uom_id"/>
<field name="uom_id" string="UoM"/>
<field name="type"/>
<field name="qty_available"/>
<field name="virtual_available"/>

View File

@ -0,0 +1,25 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 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 product_expiry
import wizard
import report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,39 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 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" : "Products date of expiry",
"version" : "1.0",
"author" : "Tiny",
"category" : "Enterprise Specific Modules/Food Industries",
"depends" : ["base", "account", "product", "stock"],
"init_xml" : [],
"demo_xml" : ["product_expiry_demo.xml"],
"description": '''Track different dates on products and production lots:
- end of life
- best before date
- removal date
- alert date
Used, for example, in food industries.''',
"update_xml" : ["product_expiry_view.xml", "report/report_stock_view.xml", "wizard/stock_partial_view.xml"],
"active": False,
"installable": True
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,180 @@
# Catalan 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-06-30 15:09+0000\n"
"PO-Revision-Date: 2010-01-10 22:56+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Catalan <ca@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-21 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: product_expiry
#: field:product.product,life_time:0
msgid "Product lifetime"
msgstr "Cicle de vida producte"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_from_product_template
msgid "Ham"
msgstr "Pernil"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_lait_product_template
msgid "Cow milk"
msgstr "Llet de vaca"
#. module: product_expiry
#: model:ir.module.module,shortdesc:product_expiry.module_meta_information
msgid "Products date of expiry"
msgstr "Data de caducitat de productes"
#. module: product_expiry
#: constraint:product.template:0
msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
"Error: La UdM per defecte i la UdM de compra han d'estar en la mateixa "
"categoria."
#. module: product_expiry
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML no vàlid per a la definició de la vista!"
#. module: product_expiry
#: help:stock.production.lot,life_date:0
msgid "The date the lot may become dangerous and should not be consumed."
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,removal_date:0
msgid "Removal Date"
msgstr ""
#. module: product_expiry
#: model:ir.module.module,description:product_expiry.module_meta_information
msgid ""
"Track different dates on products and production lots:\n"
" - end of life\n"
" - best before date\n"
" - removal date\n"
" - alert date\n"
"Used, for example, in food industries."
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_pain_product_template
msgid "Bread"
msgstr "Pa"
#. module: product_expiry
#: model:product.uom,name:product_expiry.product_uom_ltr
#: model:product.uom.categ,name:product_expiry.product_uom_categ_vol
msgid "LTR"
msgstr ""
#. module: product_expiry
#: view:product.product:0
#: view:stock.production.lot:0
msgid "Dates"
msgstr "Dates"
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: UOS must be in a different category than the UOM"
msgstr "Error: La UdV ha d'estar en una categoria diferent que la UdM."
#. module: product_expiry
#: field:stock.production.lot,life_date:0
msgid "End of Life Date"
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,use_date:0
msgid "Best before Date"
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,use_date:0
msgid "The date the lot starts deteriorating without becoming dangerous."
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_jambon_product_template
msgid "French cheese Camenbert"
msgstr "Formatge Camembert francès"
#. module: product_expiry
#: help:product.product,removal_time:0
msgid "The number of days before a production lot should be removed."
msgstr ""
#. module: product_expiry
#: field:product.product,use_time:0
msgid "Product usetime"
msgstr "Temps d'ús producte"
#. module: product_expiry
#: field:stock.production.lot,alert_date:0
msgid "Alert Date"
msgstr ""
#. module: product_expiry
#: field:product.product,removal_time:0
msgid "Product removal time"
msgstr "Data eliminació producte"
#. module: product_expiry
#: help:product.product,use_time:0
msgid ""
"The number of days before a production lot starts deteriorating without "
"becoming dangerous."
msgstr ""
#. module: product_expiry
#: constraint:product.product:0
msgid "Error: Invalid ean code"
msgstr "Error: Codi EAN erroni"
#. module: product_expiry
#: help:product.product,life_time:0
msgid ""
"The number of days before a production lot may become dangerous and should "
"not be consumed."
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,removal_date:0
msgid "The date the lot should be removed."
msgstr ""
#. module: product_expiry
#: field:product.product,alert_time:0
msgid "Product alert time"
msgstr "Data alerta producte"
#~ msgid "Alert date"
#~ msgstr "Data alarma"
#~ msgid ""
#~ "Track different dates on products and lots. Used, for exampel, in food "
#~ "industries: expiry date, alert date, date of removal, eso."
#~ msgstr ""
#~ "Gestiona diferents dates per a productes i lots. Utilitzat, per exemple, en "
#~ "la indústria alimentària: Data de caducitat, data d'alarma, data "
#~ "d'eliminació, ..."
#~ msgid "DLUO"
#~ msgstr "Data caducitat"
#~ msgid "Removal date"
#~ msgstr "Data eliminació"

View File

@ -0,0 +1,180 @@
# Spanish 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-06-30 15:09+0000\n"
"PO-Revision-Date: 2010-04-29 04:43+0000\n"
"Last-Translator: Rhubeni Lopes de Andrade <rhube.itsasecret@gmail.com>\n"
"Language-Team: Spanish <es@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-21 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: product_expiry
#: field:product.product,life_time:0
msgid "Product lifetime"
msgstr "Ciclo de vida producto"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_from_product_template
msgid "Ham"
msgstr "Jamón"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_lait_product_template
msgid "Cow milk"
msgstr "Leche de vaca"
#. module: product_expiry
#: model:ir.module.module,shortdesc:product_expiry.module_meta_information
msgid "Products date of expiry"
msgstr "Fecha de caducidad de productos"
#. module: product_expiry
#: constraint:product.template:0
msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
"Error: La UdM por defecto y la UdM de compra deben estar en la misma "
"categoría."
#. module: product_expiry
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "¡XML no válido para la definición de la vista!"
#. module: product_expiry
#: help:stock.production.lot,life_date:0
msgid "The date the lot may become dangerous and should not be consumed."
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,removal_date:0
msgid "Removal Date"
msgstr ""
#. module: product_expiry
#: model:ir.module.module,description:product_expiry.module_meta_information
msgid ""
"Track different dates on products and production lots:\n"
" - end of life\n"
" - best before date\n"
" - removal date\n"
" - alert date\n"
"Used, for example, in food industries."
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_pain_product_template
msgid "Bread"
msgstr "Pan"
#. module: product_expiry
#: model:product.uom,name:product_expiry.product_uom_ltr
#: model:product.uom.categ,name:product_expiry.product_uom_categ_vol
msgid "LTR"
msgstr "LTR"
#. module: product_expiry
#: view:product.product:0
#: view:stock.production.lot:0
msgid "Dates"
msgstr "Fechas"
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: UOS must be in a different category than the UOM"
msgstr "Error: La UdV debe estar en una categoría diferente que la UdM."
#. module: product_expiry
#: field:stock.production.lot,life_date:0
msgid "End of Life Date"
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,use_date:0
msgid "Best before Date"
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,use_date:0
msgid "The date the lot starts deteriorating without becoming dangerous."
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_jambon_product_template
msgid "French cheese Camenbert"
msgstr "Queso Camembert francés"
#. module: product_expiry
#: help:product.product,removal_time:0
msgid "The number of days before a production lot should be removed."
msgstr ""
#. module: product_expiry
#: field:product.product,use_time:0
msgid "Product usetime"
msgstr "Tiempo de uso producto"
#. module: product_expiry
#: field:stock.production.lot,alert_date:0
msgid "Alert Date"
msgstr ""
#. module: product_expiry
#: field:product.product,removal_time:0
msgid "Product removal time"
msgstr "Fecha eliminación producto"
#. module: product_expiry
#: help:product.product,use_time:0
msgid ""
"The number of days before a production lot starts deteriorating without "
"becoming dangerous."
msgstr ""
#. module: product_expiry
#: constraint:product.product:0
msgid "Error: Invalid ean code"
msgstr "Error: Código EAN erróneo"
#. module: product_expiry
#: help:product.product,life_time:0
msgid ""
"The number of days before a production lot may become dangerous and should "
"not be consumed."
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,removal_date:0
msgid "The date the lot should be removed."
msgstr ""
#. module: product_expiry
#: field:product.product,alert_time:0
msgid "Product alert time"
msgstr "Fecha alerta producto"
#~ msgid "Alert date"
#~ msgstr "Fecha alarma"
#~ msgid ""
#~ "Track different dates on products and lots. Used, for exampel, in food "
#~ "industries: expiry date, alert date, date of removal, eso."
#~ msgstr ""
#~ "Gestiona distintas fechas para productos y lotes. Utilizado, por ejemplo, en "
#~ "industria alimentaria: Fecha de caducidad, fecha de alarma, fecha de "
#~ "eliminación, ..."
#~ msgid "DLUO"
#~ msgstr "Fecha caducidad"
#~ msgid "Removal date"
#~ msgstr "Fecha eliminación"

View File

@ -0,0 +1,178 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * product_expiry
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-06-30 15:09+0000\n"
"PO-Revision-Date: 2010-01-04 18:19+0000\n"
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.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-05-21 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: product_expiry
#: field:product.product,life_time:0
msgid "Product lifetime"
msgstr "Durée limite de consommation"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_from_product_template
msgid "Ham"
msgstr "Jambon"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_lait_product_template
msgid "Cow milk"
msgstr "Lait de vache"
#. module: product_expiry
#: model:ir.module.module,shortdesc:product_expiry.module_meta_information
msgid "Products date of expiry"
msgstr "Dates de péremption des produits"
#. module: product_expiry
#: constraint:product.template:0
msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
"Erreur: l'unité de mesure par défaut et l'unité de mesure d'achat doivent "
"faire partie de la même catégorie"
#. module: product_expiry
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML non valide pour l'architecture de la vue"
#. module: product_expiry
#: help:stock.production.lot,life_date:0
msgid "The date the lot may become dangerous and should not be consumed."
msgstr ""
"La date à laquelle le lot peut devenir dangereux et ne doit plus être "
"consommé."
#. module: product_expiry
#: field:stock.production.lot,removal_date:0
msgid "Removal Date"
msgstr "Date de retrait"
#. module: product_expiry
#: model:ir.module.module,description:product_expiry.module_meta_information
msgid ""
"Track different dates on products and production lots:\n"
" - end of life\n"
" - best before date\n"
" - removal date\n"
" - alert date\n"
"Used, for example, in food industries."
msgstr ""
"Suit les différentes dates des produits et des lots de production\n"
" - Date limite de consommation\n"
" - DLUO\n"
" - Date de retrait\n"
" - Date d'alerte\n"
"Utilisé par exemple dans les industries alimentaires"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_pain_product_template
msgid "Bread"
msgstr "Pain"
#. module: product_expiry
#: model:product.uom,name:product_expiry.product_uom_ltr
#: model:product.uom.categ,name:product_expiry.product_uom_categ_vol
msgid "LTR"
msgstr "LTR"
#. module: product_expiry
#: view:product.product:0
#: view:stock.production.lot:0
msgid "Dates"
msgstr "Dates"
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: UOS must be in a different category than the UOM"
msgstr ""
"Erreur: l'unité de vente doit appartenir à une catégorie différente que "
"l'unité de mesure"
#. module: product_expiry
#: field:stock.production.lot,life_date:0
msgid "End of Life Date"
msgstr "Date limite de consommation"
#. module: product_expiry
#: field:stock.production.lot,use_date:0
msgid "Best before Date"
msgstr "Date limite d'utilisation optimale"
#. module: product_expiry
#: help:stock.production.lot,use_date:0
msgid "The date the lot starts deteriorating without becoming dangerous."
msgstr ""
"La date à laquelle le lot commencera à se déteriorer sans devenir dangereux."
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_jambon_product_template
msgid "French cheese Camenbert"
msgstr "Fromage Camembert Français"
#. module: product_expiry
#: help:product.product,removal_time:0
msgid "The number of days before a production lot should be removed."
msgstr ""
"Le nombre de jours après lesquels un lot de production doit être retiré."
#. module: product_expiry
#: field:product.product,use_time:0
msgid "Product usetime"
msgstr "Durée limite d'utilisation optimale"
#. module: product_expiry
#: field:stock.production.lot,alert_date:0
msgid "Alert Date"
msgstr "Date d'alerte"
#. module: product_expiry
#: field:product.product,removal_time:0
msgid "Product removal time"
msgstr "Durée avant retrait"
#. module: product_expiry
#: help:product.product,use_time:0
msgid ""
"The number of days before a production lot starts deteriorating without "
"becoming dangerous."
msgstr ""
"Le nombre de jours après lesquels un lot de production commencera à se "
"déteriorer sans devenir dangereux"
#. module: product_expiry
#: constraint:product.product:0
msgid "Error: Invalid ean code"
msgstr "Erreur: code EAN invalide"
#. module: product_expiry
#: help:product.product,life_time:0
msgid ""
"The number of days before a production lot may become dangerous and should "
"not be consumed."
msgstr ""
"Nombre de jours après lesquels un lot de production peut devenir dangereux "
"et ne doit plus être consommé."
#. module: product_expiry
#: help:stock.production.lot,removal_date:0
msgid "The date the lot should be removed."
msgstr "La date à laquelle le lot doit être retiré."
#. module: product_expiry
#: field:product.product,alert_time:0
msgid "Product alert time"
msgstr "Durée avant alerte"

View File

@ -0,0 +1,159 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * product_expiry
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-06-30 15:09:36+0000\n"
"PO-Revision-Date: 2009-06-30 15:09:36+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: product_expiry
#: field:product.product,life_time:0
msgid "Product lifetime"
msgstr "Durée limite de consommation"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_from_product_template
msgid "Ham"
msgstr "Jambon"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_lait_product_template
msgid "Cow milk"
msgstr "Lait de vache"
#. module: product_expiry
#: model:ir.module.module,shortdesc:product_expiry.module_meta_information
msgid "Products date of expiry"
msgstr "Dates de péremption des produits"
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: The default UOM and the purchase UOM must be in the same category."
msgstr "Erreur: l'unité de mesure par défaut et l'unité de mesure d'achat doivent faire partie de la même catégorie"
#. module: product_expiry
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML non valide pour l'architecture de la vue"
#. module: product_expiry
#: help:stock.production.lot,life_date:0
msgid "The date the lot may become dangerous and should not be consumed."
msgstr "La date à laquelle le lot peut devenir dangereux et ne doit plus être consommé."
#. module: product_expiry
#: field:stock.production.lot,removal_date:0
msgid "Removal Date"
msgstr "Date de retrait"
#. module: product_expiry
#: model:ir.module.module,description:product_expiry.module_meta_information
msgid "Track different dates on products and production lots:\n"
" - end of life\n"
" - best before date\n"
" - removal date\n"
" - alert date\n"
"Used, for example, in food industries."
msgstr "Suit les différentes dates des produits et des lots de production\n"
" - Date limite de consommation\n"
" - DLUO\n"
" - Date de retrait\n"
" - Date d'alerte\n"
"Utilisé par exemple dans les industries alimentaires"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_pain_product_template
msgid "Bread"
msgstr "Pain"
#. module: product_expiry
#: model:product.uom,name:product_expiry.product_uom_ltr
#: model:product.uom.categ,name:product_expiry.product_uom_categ_vol
msgid "LTR"
msgstr "LTR"
#. module: product_expiry
#: view:product.product:0
#: view:stock.production.lot:0
msgid "Dates"
msgstr "Dates"
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: UOS must be in a different category than the UOM"
msgstr "Erreur: l'unité de vente doit appartenir à une catégorie différente que l'unité de mesure"
#. module: product_expiry
#: field:stock.production.lot,life_date:0
msgid "End of Life Date"
msgstr "Date limite de consommation"
#. module: product_expiry
#: field:stock.production.lot,use_date:0
msgid "Best before Date"
msgstr "Date limite d'utilisation optimale"
#. module: product_expiry
#: help:stock.production.lot,use_date:0
msgid "The date the lot starts deteriorating without becoming dangerous."
msgstr "La date à laquelle le lot commencera à se déteriorer sans devenir dangereux."
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_jambon_product_template
msgid "French cheese Camenbert"
msgstr "Fromage Camembert Français"
#. module: product_expiry
#: help:product.product,removal_time:0
msgid "The number of days before a production lot should be removed."
msgstr "Le nombre de jours après lesquels un lot de production doit être retiré."
#. module: product_expiry
#: field:product.product,use_time:0
msgid "Product usetime"
msgstr "Durée limite d'utilisation optimale"
#. module: product_expiry
#: field:stock.production.lot,alert_date:0
msgid "Alert Date"
msgstr "Date d'alerte"
#. module: product_expiry
#: field:product.product,removal_time:0
msgid "Product removal time"
msgstr "Durée avant retrait"
#. module: product_expiry
#: help:product.product,use_time:0
msgid "The number of days before a production lot starts deteriorating without becoming dangerous."
msgstr "Le nombre de jours après lesquels un lot de production commencera à se déteriorer sans devenir dangereux"
#. module: product_expiry
#: constraint:product.product:0
msgid "Error: Invalid ean code"
msgstr "Erreur: code EAN invalide"
#. module: product_expiry
#: help:product.product,life_time:0
msgid "The number of days before a production lot may become dangerous and should not be consumed."
msgstr "Nombre de jours après lesquels un lot de production peut devenir dangereux et ne doit plus être consommé."
#. module: product_expiry
#: help:stock.production.lot,removal_date:0
msgid "The date the lot should be removed."
msgstr "La date à laquelle le lot doit être retiré."
#. module: product_expiry
#: field:product.product,alert_time:0
msgid "Product alert time"
msgstr "Durée avant alerte"

View File

@ -0,0 +1,154 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * product_expiry
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-06-30 15:09:08+0000\n"
"PO-Revision-Date: 2009-06-30 15:09:08+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: product_expiry
#: field:product.product,life_time:0
msgid "Product lifetime"
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_from_product_template
msgid "Ham"
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_lait_product_template
msgid "Cow milk"
msgstr ""
#. module: product_expiry
#: model:ir.module.module,shortdesc:product_expiry.module_meta_information
msgid "Products date of expiry"
msgstr ""
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
#. module: product_expiry
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,life_date:0
msgid "The date the lot may become dangerous and should not be consumed."
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,removal_date:0
msgid "Removal Date"
msgstr ""
#. module: product_expiry
#: model:ir.module.module,description:product_expiry.module_meta_information
msgid "Track different dates on products and production lots:\n"
" - end of life\n"
" - best before date\n"
" - removal date\n"
" - alert date\n"
"Used, for example, in food industries."
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_pain_product_template
msgid "Bread"
msgstr ""
#. module: product_expiry
#: model:product.uom,name:product_expiry.product_uom_ltr
#: model:product.uom.categ,name:product_expiry.product_uom_categ_vol
msgid "LTR"
msgstr ""
#. module: product_expiry
#: view:product.product:0
#: view:stock.production.lot:0
msgid "Dates"
msgstr ""
#. module: product_expiry
#: constraint:product.template:0
msgid "Error: UOS must be in a different category than the UOM"
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,life_date:0
msgid "End of Life Date"
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,use_date:0
msgid "Best before Date"
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,use_date:0
msgid "The date the lot starts deteriorating without becoming dangerous."
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_jambon_product_template
msgid "French cheese Camenbert"
msgstr ""
#. module: product_expiry
#: help:product.product,removal_time:0
msgid "The number of days before a production lot should be removed."
msgstr ""
#. module: product_expiry
#: field:product.product,use_time:0
msgid "Product usetime"
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,alert_date:0
msgid "Alert Date"
msgstr ""
#. module: product_expiry
#: field:product.product,removal_time:0
msgid "Product removal time"
msgstr ""
#. module: product_expiry
#: help:product.product,use_time:0
msgid "The number of days before a production lot starts deteriorating without becoming dangerous."
msgstr ""
#. module: product_expiry
#: constraint:product.product:0
msgid "Error: Invalid ean code"
msgstr ""
#. module: product_expiry
#: help:product.product,life_time:0
msgid "The number of days before a production lot may become dangerous and should not be consumed."
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,removal_date:0
msgid "The date the lot should be removed."
msgstr ""
#. module: product_expiry
#: field:product.product,alert_time:0
msgid "Product alert time"
msgstr ""

View File

@ -0,0 +1,91 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 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 datetime
from osv import fields, osv
import pooler
import time
class stock_production_lot(osv.osv):
_name = 'stock.production.lot'
_inherit = 'stock.production.lot'
def name_get(self, cr, uid, ids, context=None):
if not len(ids):
return []
result = []
for line in self.browse(cr, uid, ids, context):
if line.life_date:
result.append((line.id, (line.name or '')+' ('+line.life_date+')'))
else:
result.append((line.id, line.name))
return result
def _get_date(dtype):
"""Return a function to compute the limit date for this type"""
def calc_date(self, cr, uid, context=None):
"""Compute the limit date for a given date"""
if context is None:
context = {}
if not context.get('product_id', False):
date = False
else:
product = pooler.get_pool(cr.dbname).get('product.product').browse(
cr, uid, context['product_id'])
duration = getattr(product, dtype)
# set date to False when no expiry time specified on the product
date = duration and (datetime.datetime.today()
+ datetime.timedelta(days=duration))
return date and date.strftime('%Y-%m-%d')
return calc_date
_columns = {
'life_date': fields.date('End of Life Date',
help='The date the lot may become dangerous and should not be consumed.'),
'use_date': fields.date('Best before Date',
help='The date the lot starts deteriorating without becoming dangerous.'),
'removal_date': fields.date('Removal Date',
help='The date the lot should be removed.'),
'alert_date': fields.date('Alert Date'),
}
_defaults = {
# 'life_date': _get_date('life_time'),
# 'use_date': _get_date('use_time'),
# 'removal_date': _get_date('removal_time'),
# 'alert_date': _get_date('alert_time'),
}
stock_production_lot()
class product_product(osv.osv):
_inherit = 'product.product'
_name = 'product.product'
_columns = {
'life_time': fields.integer('Product lifetime',
help='The number of days before a production lot may become dangerous and should not be consumed.'),
'use_time': fields.integer('Product usetime',
help='The number of days before a production lot starts deteriorating without becoming dangerous.'),
'removal_time': fields.integer('Product removal time',
help='The number of days before a production lot should be removed.'),
'alert_time': fields.integer('Product alert time'),
}
product_product()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,128 @@
<openerp>
<data noupdate="1">
<record id="product_uom_categ_vol" model="product.uom.categ">
<field name="name">LTR</field>
</record>
<record id="product_uom_ltr" model="product.uom">
<field name="category_id" ref="product_uom_categ_vol"/>
<field name="name">LTR</field>
</record>
<record id="product_product_jambon" model="product.product">
<field name="supply_method">buy</field>
<field name="list_price">7.0</field>
<field name="standard_price">5.0</field>
<field name="uom_id" ref="product.product_uom_unit"/>
<field name="uom_po_id" ref="product.product_uom_unit"/>
<field name="uos_id" ref="product.product_uom_kgm" />
<field name="uos_coeff">3</field>
<field name="name">French cheese Camenbert</field>
<field name="life_time">15</field>
<field name="use_time">10</field>
<field name="removal_time">6</field>
<field name="alert_time">5</field>
<field name="default_code">JKB</field>
<field name="ean13">3307630302014</field>
<field name="categ_id" search="[]" model="product.category"/>
</record>
<record model="product.packaging">
<field name="name">box of 10</field>
<field name="qty">12</field>
<field name="ul" ref="product.product_ul_box" />
<field name="ul_qty">6</field>
<field name="rows">4</field>
<field name="product_id" ref="product_product_jambon" />
<field name="ean">12345678901234</field>
<field name="weight">10</field>
<field name="weight_ul">240</field>
</record>
<record id="product_product_from" model="product.product">
<field name="supply_method">buy</field>
<field name="list_price">8.0</field>
<field name="standard_price">6.0</field>
<field name="uom_id" ref="product.product_uom_unit"/>
<field name="uom_po_id" ref="product.product_uom_unit"/>
<field name="uos_id" ref="product.product_uom_kgm" />
<field name="uos_coeff">0.5</field>
<field name="name">Ham</field>
<field name="life_time">30</field>
<field name="use_time">25</field>
<field name="removal_time">20</field>
<field name="alert_time">19</field>
<field name="default_code">FKS</field>
<field name="ean13">3307631101876</field>
<field name="categ_id" search="[]" model="product.category"/>
</record>
<record model="product.packaging">
<field name="name">Box of 5</field>
<field name="qty">12</field>
<field name="ul" ref="product.product_ul_box" />
<field name="ul_qty">6</field>
<field name="rows">4</field>
<field name="product_id" ref="product_product_from" />
<field name="ean">12345678901234</field>
<field name="weight">10</field>
<field name="weight_ul">240</field>
</record>
<record id="product_product_pain" model="product.product">
<field name="supply_method">buy</field>
<field name="list_price">8.0</field>
<field name="standard_price">6.0</field>
<field name="uom_id" ref="product.product_uom_unit"/>
<field name="uom_po_id" ref="product.product_uom_unit"/>
<field name="uos_id" ref="product.product_uom_kgm" />
<field name="uos_coeff">0.5</field>
<field name="name">Bread</field>
<field name="life_time">30</field>
<field name="use_time">25</field>
<field name="removal_time">20</field>
<field name="alert_time">19</field>
<field name="default_code">PKB</field>
<field name="ean13">3307631102323</field>
<field name="categ_id" search="[]" model="product.category"/>
</record>
<record model="product.packaging">
<field name="name">Bag of 2</field>
<field name="qty">6</field>
<field name="ul" ref="product.product_ul_box" />
<field name="ul_qty">6</field>
<field name="rows">4</field>
<field name="product_id" ref="product_product_pain" />
<field name="ean">12345678901234</field>
<field name="weight">10</field>
<field name="weight_ul">240</field>
</record>
<record id="product_product_lait" model="product.product">
<field name="supply_method">buy</field>
<field name="list_price">8.0</field>
<field name="standard_price">6.0</field>
<field name="uom_id" ref="product.product_uom_unit"/>
<field name="uom_po_id" ref="product.product_uom_unit"/>
<field name="uos_id" ref="product_uom_ltr" />
<field name="uos_coeff">0.5</field>
<field name="name">Cow milk</field>
<field name="life_time">30</field>
<field name="use_time">25</field>
<field name="removal_time">20</field>
<field name="alert_time">19</field>
<field name="default_code">LEX</field>
<field name="ean13">3307630302045</field>
<field name="categ_id" search="[]" model="product.category"/>
</record>
<record model="product.packaging">
<field name="name">Boxes of 1 liter</field>
<field name="qty">4</field>
<field name="ul" ref="product.product_ul_box" />
<field name="ul_qty">6</field>
<field name="rows">4</field>
<field name="product_id" ref="product_product_lait" />
<field name="ean">12345678901234</field>
<field name="weight">10</field>
<field name="weight_ul">240</field>
</record>
</data>
</openerp>

View File

@ -0,0 +1,39 @@
<?xml version="1.0" ?>
<openerp>
<data>
<record model="ir.ui.view" id="view_move_form_expiry">
<field name="name">stock.production.lot.form</field>
<field name="model">stock.production.lot</field>
<field name="inherit_id" ref="stock.view_production_lot_form" />
<field name="type">form</field>
<field name="arch" type="xml">
<field name="date" position="after">
<separator string="Dates" colspan="4" />
<field name="life_date" />
<field name="use_date" />
<field name="removal_date" />
<field name="alert_date" />
</field>
</field>
</record>
<record model="ir.ui.view" id="view_product_form_expiry">
<field name="name">product.normal.form</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view" />
<field name="type">form</field>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Dates">
<separator string="Dates" colspan="4" />
<field name="life_time" />
<field name="use_time" />
<field name="removal_time" />
<field name="alert_time" />
</page>
</notebook>
</field>
</record>
</data>
</openerp>

View File

@ -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 report_stock
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,121 @@
# -*- 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
from tools.translate import _
import tools
from tools.sql import drop_view_if_exists
class stock_report_prodlots(osv.osv):
_name = "stock.report.prodlots1"
_description = "Stock report by production lots"
_auto = False
_columns = {
'name': fields.float('Quantity', readonly=True),
'location_id': fields.many2one('stock.location', 'Location', readonly=True, select=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True, select=True),
'prodlot_id': fields.many2one('stock.production.lot', 'Production lot', readonly=True, select=True),
'life_date': fields.date('End of Life Date',
help='The date the lot may become dangerous and should not be consumed.'),
'use_date': fields.date('Best before Date',
help='The date the lot starts deteriorating without becoming dangerous.'),
'removal_date': fields.date('Removal Date',
help='The date the lot should be removed.'),
'alert_date': fields.date('Alert Date'),
}
def init(self, cr):
drop_view_if_exists(cr, 'stock_report_prodlots1')
cr.execute("""
create or replace view stock_report_prodlots1 as (
select max(id) as id,
location_id,
product_id,
prodlot_id,
life_date,
use_date,
removal_date,
alert_date,
sum(qty) as name
from (
select -max(sm.id) as id,
sm.location_id,
sm.product_id,
sm.prodlot_id,
spl.life_date,
spl.use_date,
spl.removal_date,
spl.alert_date,
-sum(sm.product_qty /uo.factor) as qty
from stock_move as sm
left join stock_location sl
on (sl.id = sm.location_id)
left join stock_production_lot spl
on (sm.prodlot_id=spl.id)
left join product_uom uo
on (uo.id=sm.product_uom)
where state = 'done'
group by sm.location_id, sm.product_id, sm.product_uom, sm.prodlot_id,
spl.life_date,
spl.use_date,
spl.removal_date,
spl.alert_date
union all
select max(sm.id) as id,
sm.location_dest_id as location_id,
sm.product_id,
sm.prodlot_id,
spl.life_date,
spl.use_date,
spl.removal_date,
spl.alert_date,
sum(sm.product_qty /uo.factor) as qty
from stock_move as sm
left join stock_location sl
on (sl.id = sm.location_dest_id)
left join stock_production_lot spl
on (sm.prodlot_id=spl.id)
left join product_uom uo
on (uo.id=sm.product_uom)
where sm.state = 'done'
group by sm.location_dest_id, sm.product_id, sm.product_uom, sm.prodlot_id,
spl.life_date,
spl.use_date,
spl.removal_date,
spl.alert_date
) as report
group by location_id, product_id, prodlot_id,
life_date,
use_date,
removal_date,
alert_date
)""")
def unlink(self, cr, uid, ids, context={}):
raise osv.except_osv(_('Error !'), _('You cannot delete any record!'))
stock_report_prodlots()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_stock_report_prodlots_filter" model="ir.ui.view">
<field name="name">stock.report.prodlots.filter</field>
<field name="model">stock.report.prodlots1</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Location">
<group col="10" colspan="4">
<filter icon="terp-go-home" name="internal_locations" string="Internal Locations" domain="[('location_id.usage', '=', 'internal')]" help="Internal Locations"/>
<filter icon="terp-go-home" string="Customer Locations" domain="[('location_id.usage', '=', 'customer')]" help="Customer Locations" />
<filter icon="terp-go-home" string="Supplier Locations" domain="[('location_id.usage', '=', 'supplier')]" help="Supplier Locations" />
<separator orientation="vertical"/>
<field name="location_id"/>
<field name="product_id"/>
<newline/>
<field name="use_date" />
<field name="life_date" string="End of Life" />
<field name="alert_date" />
<field name="removal_date" string="Removal D." />
</group>
<newline/>
<group expand="1" string="Group By..." colspan="4" col="10">
<filter string="Location" icon="terp-go-home" domain="[]" context="{'group_by':'location_id'}"/>
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
</group>
</search>
</field>
</record>
<record id="stock_report_prodlots_form" model="ir.ui.view">
<field name="name">stock.report.prodlots.view</field>
<field name="model">stock.report.prodlots1</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Stock by Lots">
<field name="location_id"/>
<field name="product_id"/>
<field name="prodlot_id" groups="base.group_extended"/>
<field name="name"/>
<field name="use_date" />
<field name="life_date" string="End of Life" />
<field name="alert_date" />
<field name="removal_date" string="Removal D." />
</form>
</field>
</record>
<record id="stock_report_prodlots_tree" model="ir.ui.view">
<field name="name">stock.report.prodlots.view</field>
<field name="model">stock.report.prodlots1</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Stock by Lots">
<field name="location_id"/>
<field name="product_id"/>
<field name="prodlot_id" groups="base.group_extended"/>
<field name="name"/>
<field name="use_date" />
<field name="life_date" string="End of Life" />
<field name="alert_date" />
<field name="removal_date" string="Removal D." />
</tree>
</field>
</record>
<record id="stock_report_prodlots_graph" model="ir.ui.view">
<field name="name">stock.report.prodlots.view</field>
<field name="model">stock.report.prodlots1</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Stock by Lots" type="bar">
<field name="product_id"/>
<field name="name"/>
</graph>
</field>
</record>
<record id="stock.action_stock_report_prodlots_form" model="ir.actions.act_window">
<field name="name">Inventory by Location</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">stock.report.prodlots1</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'full':'1','search_default_internal_locations':1}</field>
<field name="search_view_id" ref="view_stock_report_prodlots_filter" />
</record>
<act_window
domain="[('product_id','=',active_id)]"
id="stock.act_product_product_2_stock_report_prodlots"
name="Stock by Lots"
res_model="stock.report.prodlots1"
src_model="product.product"
groups="base.group_extended"/>
</data>
</openerp>

View File

@ -0,0 +1 @@
import stock_partial

View File

@ -0,0 +1,80 @@
# -*- 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 fields, osv
from service import web_services
from tools.misc import UpdateableStr, UpdateableDict
from tools.translate import _
import netsvc
import pooler
import time
import datetime
import wizard
class stock_partial_lot_picking(osv.osv_memory):
_inherit = "stock.partial.picking"
_name = "stock.partial.picking"
_description = "Partial Picking"
def do_partial(self, cr, uid, ids, context):
res = super(stock_partial_lot_picking, self).do_partial(cr, uid, ids, context=context)
prodlot_obj = self.pool.get('stock.production.lot')
pick_obj = self.pool.get('stock.picking')
picking_ids = context.get('active_ids', False)
partial = self.browse(cr, uid, ids[0], context)
for pick in pick_obj.browse(cr, uid, picking_ids):
for m in pick.move_lines:
for pick in pick_obj.browse(cr, uid, picking_ids):
for m in pick.move_lines:
res = {}
if (pick.type == 'in') and m.prodlot_id:
if not m.prodlot_id.life_date:
date_life = (datetime.datetime.strptime(partial.date, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=m.product_id.life_time))
res['life_date'] = date_life.strftime('%Y-%m-%d')
if not m.prodlot_id.use_date:
date_use = (datetime.datetime.strptime(partial.date, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=m.product_id.use_time))
res['use_date'] = date_use.strftime('%Y-%m-%d')
if not m.prodlot_id.removal_date:
date_removal = (datetime.datetime.strptime(partial.date, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=m.product_id.removal_time))
res['removal_date'] = date_removal.strftime('%Y-%m-%d')
if not m.prodlot_id.alert_date:
date_alert = (datetime.datetime.strptime(partial.date, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(days=m.product_id.alert_time))
res['alert_date'] = date_alert.strftime('%Y-%m-%d')
prodlot_obj.write(cr, uid, [m.prodlot_id.id], res)
return res
stock_partial_lot_picking()
class stock_move_split_lines_exist(osv.osv_memory):
_name = "stock.move.split.lines.exist"
_inherit = "stock.move.split.lines.exist"
_columns = {
'date': fields.date('Expiry Date'),
}
def on_change_product(self, cr, uid, ids, product_id):
if not product_id:
return {'value':{'date': False}}
day_life = self.pool.get('product.product').browse(cr, uid, product_id).life_time
date_life = (datetime.datetime.now() + datetime.timedelta(days=day_life))
return {'value':{'date': date_life.strftime('%Y-%m-%d')
}}
stock_move_split_lines_exist()

View File

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="view_split_in_lots" model="ir.ui.view">
<field name="name">Split in lots</field>
<field name="model">stock.move.split</field>
<field name="type">form</field>
<field name="inherit_id" ref="stock.view_split_in_lots"/>
<field name="arch" type="xml">
<data>
<xpath expr="//form/group/field[@name='line_exist_ids']/tree/field[@name='prodlot_id']" position="replace">
<field name="prodlot_id" on_change="on_change_product(parent.product_id)"/>
</xpath>
<xpath expr="//form/group/field[@name='line_exist_ids']/tree/field[@name='quantity']" position="after">
<field name="date"/>
</xpath>
</data>
</field>
</record>
</data>
</openerp>

View File

@ -0,0 +1,23 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 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 product_manufacturer
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,34 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 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" : "Products Attributes & Manufacturers",
"version" : "1.0",
"author" : "Tiny",
"category" : "Enterprise Specific Modules/Industries",
"depends" : ["base", "account", "product", "stock"],
"init_xml" : [],
"demo_xml" : [],
"description": "A module that add manufacturers and attributes on the product form",
"update_xml" : ["security/ir.model.access.csv","product_manufacturer_view.xml"],
"active": False,
"installable": True
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,103 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * product_electronic
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.6\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-11-25 13:27:55+0000\n"
"PO-Revision-Date: 2009-11-25 13:27:55+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: product_electronic
#: model:ir.module.module,description:product_electronic.module_meta_information
msgid "A module that add manufacturers and attributes on the product form"
msgstr ""
#. module: product_electronic
#: field:product.product,manufacturer_pref:0
msgid "Manufacturer product code"
msgstr ""
#. module: product_electronic
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: product_electronic
#: view:product.electronic.attribute:0
msgid "Product Template Name"
msgstr ""
#. module: product_electronic
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: product_electronic
#: model:ir.model,name:product_electronic.model_product_electronic_attribute
msgid "Product attributes"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Manufacturing data"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Product reference"
msgstr ""
#. module: product_electronic
#: field:product.electronic.attribute,name:0
msgid "Attribute"
msgstr ""
#. module: product_electronic
#: field:product.electronic.attribute,product_id:0
msgid "Product"
msgstr ""
#. module: product_electronic
#: field:product.electronic.attribute,value:0
msgid "Value"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Manufacturing Data"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Product name"
msgstr ""
#. module: product_electronic
#: view:product.product:0
#: field:product.product,attribute_ids:0
msgid "Attributes"
msgstr ""
#. module: product_electronic
#: model:ir.module.module,shortdesc:product_electronic.module_meta_information
msgid "Products Attributes & Manufacturers"
msgstr ""
#. module: product_electronic
#: field:product.product,manufacturer_pname:0
msgid "Manufacturer product name"
msgstr ""
#. module: product_electronic
#: field:product.product,manufacturer:0
msgid "Manufacturer"
msgstr ""

View File

@ -0,0 +1,103 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * product_electronic
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.6\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-11-25 13:27:55+0000\n"
"PO-Revision-Date: 2009-11-25 13:27:55+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: product_electronic
#: model:ir.module.module,description:product_electronic.module_meta_information
msgid "A module that add manufacturers and attributes on the product form"
msgstr ""
#. module: product_electronic
#: field:product.product,manufacturer_pref:0
msgid "Manufacturer product code"
msgstr ""
#. module: product_electronic
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: product_electronic
#: view:product.electronic.attribute:0
msgid "Product Template Name"
msgstr ""
#. module: product_electronic
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: product_electronic
#: model:ir.model,name:product_electronic.model_product_electronic_attribute
msgid "Product attributes"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Manufacturing data"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Product reference"
msgstr ""
#. module: product_electronic
#: field:product.electronic.attribute,name:0
msgid "Attribute"
msgstr ""
#. module: product_electronic
#: field:product.electronic.attribute,product_id:0
msgid "Product"
msgstr ""
#. module: product_electronic
#: field:product.electronic.attribute,value:0
msgid "Value"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Manufacturing Data"
msgstr ""
#. module: product_electronic
#: view:product.product:0
msgid "Product name"
msgstr ""
#. module: product_electronic
#: view:product.product:0
#: field:product.product,attribute_ids:0
msgid "Attributes"
msgstr ""
#. module: product_electronic
#: model:ir.module.module,shortdesc:product_electronic.module_meta_information
msgid "Products Attributes & Manufacturers"
msgstr ""
#. module: product_electronic
#: field:product.product,manufacturer_pname:0
msgid "Manufacturer product name"
msgstr ""
#. module: product_electronic
#: field:product.product,manufacturer:0
msgid "Manufacturer"
msgstr ""

View File

@ -0,0 +1,59 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 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 fields,osv
class product_product(osv.osv):
_inherit = 'product.product'
_name = 'product.product'
_columns = {
'attribute_ids': fields.one2many('product.manufacturer.attribute', 'product_id', 'Attributes'),
'manufacturer_ids': fields.one2many('res.partner.manufacturer', 'product_id', 'Manufacturers'),
}
product_product()
class res_partner_manufacturer(osv.osv):
_name = 'res.partner.manufacturer'
_rec_name = 'manufacturer_id'
_columns = {
'manufacturer_id' : fields.many2one('res.partner', 'Manufacturer'),
'country_id' : fields.many2one('res.country', 'Country'),
'authorized' : fields.boolean('Authorized'),
'product_id': fields.many2one('product.product', 'Product', ondelete='cascade'),
}
_defaults = {
'authorized': lambda *a: True,
}
res_partner_manufacturer()
class product_attribute(osv.osv):
_name = "product.manufacturer.attribute"
_description = "Product attributes"
_columns = {
'name' : fields.char('Attribute', size=64, required=True),
'value' : fields.char('Value', size=64),
'product_id': fields.many2one('product.product', 'Product', ondelete='cascade'),
}
product_attribute()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,72 @@
<?xml version="1.0" ?>
<openerp>
<data>
<record model="ir.ui.view" id="view_product_form_expiry">
<field name="name">product.normal.form</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view" />
<field name="type">form</field>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Manufacturing Data">
<separator string="Manufacturing data" colspan="4" />
<field name="manufacturer_ids" colspan="4" nolabel="1" widget="one2many_list"/>
<separator string="Attributes" colspan="4"/>
<field name="attribute_ids" colspan="4" nolabel="1" widget="one2many_list" />
</page>
</notebook>
</field>
</record>
<record model="ir.ui.view" id="product_manufacturer_attribute_tree_view">
<field name="name">product.manufacturer.attribute.tree</field>
<field name="model">product.manufacturer.attribute</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Product Template Name">
<field name="name"/>
<field name="value"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="product_manufacturer_attribute_form_view">
<field name="name">product.manufacturer.attribute.form</field>
<field name="model">product.manufacturer.attribute</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Product Template Name">
<field name="name" select="1"/>
<field name="value" select="1"/>
</form>
</field>
</record>
<record model="ir.ui.view" id="product_manufacturer_manufact_tree_view">
<field name="name">res.partner.manufacturer.tree</field>
<field name="model">res.partner.manufacturer</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Manufacturers" editable="top">
<field name="manufacturer_id"/>
<field name="country_id"/>
<field name="authorized"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="product_manufacturer_manufa_form_view">
<field name="name">res.partner.manufacturer.form</field>
<field name="model">res.partner.manufacturer</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Manufacturers">
<field name="manufacturer_id" colspan="4"/>
<field name="country_id"/>
<field name="authorized"/>
</form>
</field>
</record>
</data>
</openerp>

View File

@ -0,0 +1,5 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_product_manufacturer_attribute","product.manufacturer.attribute","model_product_manufacturer_attribute","product.group_uos",1,0,0,0
"access_product_manufacturer_attribute_manager","product.manufacturer.attribute","model_product_manufacturer_attribute","product.group_product_manager",1,1,1,1
"access_partner_manufacturer","res.partner.manufacturer","model_res_partner_manufacturer","product.group_uos",1,0,0,0
"access_partner_manufacturer_manager","res.partner.manufacturer","model_res_partner_manufacturer","product.group_uos",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_product_manufacturer_attribute product.manufacturer.attribute model_product_manufacturer_attribute product.group_uos 1 0 0 0
3 access_product_manufacturer_attribute_manager product.manufacturer.attribute model_product_manufacturer_attribute product.group_product_manager 1 1 1 1
4 access_partner_manufacturer res.partner.manufacturer model_res_partner_manufacturer product.group_uos 1 0 0 0
5 access_partner_manufacturer_manager res.partner.manufacturer model_res_partner_manufacturer product.group_uos 1 1 1 1

View File

@ -19,9 +19,6 @@
"access_task_by_days","task.by.days","model_task_by_days","project.group_project_user",1,1,1,1
"access_close_task","close.task","model_close_task","project.group_project_user",1,1,1,1
"access_close_task_manager","close.task manager","model_close_task","project.group_project_manager",1,1,1,1
"access_resource_calendar_project_user","resource.resource.calendar project user","resource.model_resource_calendar","project.group_project_user",1,0,0,0
"access_resource_calendar_project_manager","resource.resource.calendar project manager","resource.model_resource_calendar","project.group_project_manager",1,1,1,1
"access_fiscalyear_sequence_project_manager","account.sequence.fiscalyear project manager","account.model_account_sequence_fiscalyear","project.group_project_manager",1,1,0,0
"access_partner_task user","base.res.partner user","base.model_res_partner","project.group_project_user",1,0,0,0
"access_partner_task manager","base.res.partner manager","base.model_res_partner","project.group_project_manager",1,0,0,0
"access_partner_address_task user","base.res.partner.address user","base.model_res_partner_address","project.group_project_user",1,0,0,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
19 access_task_by_days task.by.days model_task_by_days project.group_project_user 1 1 1 1
20 access_close_task close.task model_close_task project.group_project_user 1 1 1 1
21 access_close_task_manager close.task manager model_close_task project.group_project_manager 1 1 1 1
access_resource_calendar_project_user resource.resource.calendar project user resource.model_resource_calendar project.group_project_user 1 0 0 0
access_resource_calendar_project_manager resource.resource.calendar project manager resource.model_resource_calendar project.group_project_manager 1 1 1 1
access_fiscalyear_sequence_project_manager account.sequence.fiscalyear project manager account.model_account_sequence_fiscalyear project.group_project_manager 1 1 0 0
22 access_partner_task user base.res.partner user base.model_res_partner project.group_project_user 1 0 0 0
23 access_partner_task manager base.res.partner manager base.model_res_partner project.group_project_manager 1 0 0 0
24 access_partner_address_task user base.res.partner.address user base.model_res_partner_address project.group_project_user 1 0 0 0

View File

@ -164,10 +164,10 @@
<group col="8" colspan="4">
<filter icon="terp-check" string="Current Plannings" domain="[('date_from','&lt;=',time.strftime('%%Y-%%m-%%d')),('date_to','&gt;=',time.strftime('%%Y-%%m-%%d'))]" help="Current Plannings"/>
<separator orientation="vertical"/>
<field name="name">
<field name="code">
<field name="user_id">
<field name="state">
<field name="name"/>
<field name="code"/>
<field name="user_id"/>
<field name="state"/>
</group>
</search>
</field>

View File

@ -93,7 +93,6 @@
<field name="price_unit"/>
<field name="price_subtotal" groups="base.group_extended"/>
<field name="invoiced"/>
<field name="state"/>
</tree>
<!-- default form view -->
</field>

View File

@ -112,6 +112,33 @@
</field>
</record>
<record model="ir.ui.view" id="view_purchase_order_qty_amount_graph">
<field name="name">purchase.order.qty.amount.graph</field>
<field name="model">purchase.report</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Total Qty and Amount by month" type="bar">
<field name="month"/>
<field name="quantity" operator="+"/>
<field name="price_total" operator="+"/>
</graph>
</field>
</record>
<record model="ir.ui.view" id="view_purchase_order_by_user_graph">
<field name="name">purchase.order.by.user.graph</field>
<field name="model">purchase.report</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Total Orders Lines by User per month" orientation="vertical" type="bar">
<field name="month" />
<field name="nbr" operator="+"/>
<field name="user_id" group="True" />
</graph>
</field>
</record>
<record id="action_purchase_order_report_all" model="ir.actions.act_window">
<field name="name">Purchase Orders</field>
<field name="res_model">purchase.report</field>
@ -120,6 +147,23 @@
<field name="context">{'search_default_month':1,'search_default_group_partner_id':1,'search_default_group_product_id': 1, 'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]}</field>
</record>
<record id="action_purchase_order_report_graph" model="ir.actions.act_window">
<field name="name">Total Qty and Amount by month</field>
<field name="res_model">purchase.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="view_id" ref="view_purchase_order_qty_amount_graph"></field>
</record>
<record id="action_purchase_order_by_user_all" model="ir.actions.act_window">
<field name="name">Total Orders by User per month</field>
<field name="res_model">purchase.report</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="view_id" ref="view_purchase_order_by_user_graph"></field>
</record>
<menuitem id="base.next_id_73" name="Reporting" parent="base.menu_purchase_root" sequence="8"/>
<menuitem action="action_purchase_order_report_all" id="menu_action_purchase_order_report_all" parent="base.next_id_73" sequence="3"/>

View File

@ -2,4 +2,5 @@
"access_resource_calendar","resource.calendar","model_resource_calendar","base.group_system",1,1,1,1
"access_resource_calendar_week","resource.calendar.week","model_resource_calendar_week","base.group_system",1,1,1,1
"access_resource_resource","resource.resource","model_resource_resource","base.group_system",1,1,1,1
"access_resource_resource_all","resource.resource all","model_resource_resource",,1,0,0,0
"access_resource_calendar_leaves","resource.calendar.leaves","model_resource_calendar_leaves","base.group_system",1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_resource_calendar resource.calendar model_resource_calendar base.group_system 1 1 1 1
3 access_resource_calendar_week resource.calendar.week model_resource_calendar_week base.group_system 1 1 1 1
4 access_resource_resource resource.resource model_resource_resource base.group_system 1 1 1 1
5 access_resource_resource_all resource.resource all model_resource_resource 1 0 0 0
6 access_resource_calendar_leaves resource.calendar.leaves model_resource_calendar_leaves base.group_system 1 1 1 1

View File

@ -100,7 +100,7 @@ class sale_report(osv.osv):
u.name as uom_name,
sum(l.product_uom_qty * u.factor) as product_uom_qty,
sum(l.product_uom_qty*l.price_unit) as price_total,
(sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty * u.factor))::decimal(16,2) as price_average,
(sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty * u.factor)*count(l.product_id))::decimal(16,2) as price_average,
pt.categ_id, l.order_id
from
sale_order_line l

View File

@ -200,7 +200,7 @@
<field name="amount_untaxed" sum="Untaxed amount"/>
<field name="amount_tax"/>
<field name="amount_total"/>
<button name="button_dummy" states="draft" string="Compute" type="object" icon="gtk-execute"/>
<button name="button_dummy" states="draft" string="" type="object" icon="gtk-execute"/>
<button name="%(action_view_sale_advance_payment_inv)d" string="Deposit" type="action" icon="gtk-execute"/>
</group>
<group col="13" colspan="4">
@ -287,7 +287,6 @@
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="context">{"search_default_user_id":uid}</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
</record>
<menuitem action="action_order_form" id="menu_sale_order" parent="base.menu_sales" sequence="3"/>

View File

@ -2,9 +2,7 @@
In order to test the sale order working with procurements I will create some
products with different supply method and procurement method.
-
I create two products.
-
I create one product Table.
I create one product Table as MTO.
-
!record {model: product.product, id: product_product_table0}:
categ_id: product.cat1
@ -15,7 +13,7 @@
uom_id: product.product_uom_unit
uom_po_id: product.product_uom_unit
-
I create another product Wood.
I create another product Wood as MTS.
-
!record {model: product.product, id: product_product_wood0}:
categ_id: product.cat1
@ -26,7 +24,7 @@
uom_id: product.product_uom_kgm
uom_po_id: product.product_uom_kgm
-
I define Minimum stock rule for my stockable product wood
I define Minimum stock rule for my stockable product Wood (qty between 10 and 15)
-
!record {model: stock.warehouse.orderpoint, id: stock_warehouse_orderpoint_op0}:
company_id: base.main_company
@ -77,19 +75,16 @@
proc_ids = self.search(cr, uid, [('state','=','confirmed')])
assert proc_ids, _('No Procurements!')
-
The scheduler runs.
I run the scheduler.
-
!function {model: procurement.order, name: run_scheduler}:
- model: procurement.order
search: "[('state','=','confirmed')]"
-
I check that the procurement for the product table is in exception state.
As my product's supply method is produce and mrp module is yet not installed.
As my product's supply method is produce and the BoM is not defined.
-
!python {model: procurement.order}: |
from tools.translate import _
proc_ids = self.search(cr, uid, [('state','=','exception')])
assert proc_ids, _('No Procurements are in exception state!')
proc_ids = self.search(cr, uid, [('state','=','exception'),('product_id','=',ref('sale.product_product_table0'))])
assert proc_ids, _('No Procurements are in exception state for the table!')

View File

@ -1,5 +1,5 @@
-
In order to test the sale module in the Open-ERP, I need to configure details regarding product & customer.
In order to test the sale module, I need to configure details regarding product & customer.
-
I am going to sell my Mobile products to the customer with name Cleartrail
-

View File

@ -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 sale
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,44 @@
# -*- 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': 'Customer & Sales',
'version': '1.0',
'category': 'Generic Modules/CRM & SRM',
'description': """Sale Orders Dates""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
'depends': ["sale"],
'init_xml': [
],
'update_xml': [
'sale_view.xml',
],
'demo_xml': [
],
'test': [],
'installable': True,
'active': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,68 @@
# -*- 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 fields, osv
import time
from mx import DateTime
class sale_order_dates(osv.osv):
_inherit = 'sale.order'
_name = 'sale.order'
def _get_effective_date(self, cr, uid, ids, name, arg, context={}):
res = {}
dates_list = []
for order in self.browse(cr, uid, ids):
dates_list = []
for pick in order.picking_ids:
dates_list.append(pick.date)
if dates_list:
res[order.id] = min(dates_list)
else:
res[order.id] =False
return res
def _get_commitment_date(self, cr, uid, ids, name, arg, context={}):
res = {}
dates_list = []
for order in self.browse(cr, uid, ids):
dates_list = []
for line in order.order_line:
dt=DateTime.strptime(order.date_order, '%Y-%m-%d') + DateTime.RelativeDateTime(days=line.delay or 0.0)
dt_s = dt.strftime('%Y-%m-%d')
dates_list.append(dt_s)
res[order.id] = min(dates_list)
return res
_columns = {
'commitment_date': fields.function(_get_commitment_date, method=True,store=True, type='date', string='Commitment Date'),
'requested_date': fields.date('Requested Date'),
'effective_date': fields.function(_get_effective_date, method=True, type='date', store=True,string='Effective Date'),
}
sale_order_dates()
"""
- date_commitment: min(fields.function using delay on SO lines +
date_order)
- date_requested: fields.date
- Effective date: fields.function the first picking done.
"""
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,23 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="view_sale_orderfor" model="ir.ui.view">
<field name="name">sale.order.form.inherit5</field>
<field name="model">sale.order</field>
<field name="type">form</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="date_confirm" position="after">
<separator string="Dates" colspan="4"/>
<field name="commitment_date"/>
<newline/>
<field name="effective_date"/>
<field name="requested_date"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@ -50,6 +50,7 @@ Thanks to the double entry management, the inventory controlling is powerful and
"wizard/stock_invoice_onshipping_view.xml",
"wizard/stock_inventory_merge_view.xml",
"wizard/stock_location_product_view.xml",
"wizard/stock_splitinto_view.xml",
"wizard/stock_inventory_line_split_view.xml",
"wizard/stock_change_standard_price_view.xml",
"wizard/stock_traceability_view.xml",

View File

@ -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: 2009-11-17 10:48+0000\n"
"Last-Translator: Marcel van der Boom (HS-Development BV) <mrb@hsdev.com>\n"
"PO-Revision-Date: 2010-06-14 13:39+0000\n"
"Last-Translator: Marcel van der Boom (HS-Development BV) <marcel@hsdev.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 03:55+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: stock
@ -44,13 +44,13 @@ msgstr "terp-account"
#. module: stock
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Ongeldige modelnaam in de definitie van de actie."
#. module: stock
#: model:ir.module.module,shortdesc:stock.module_meta_information
#: model:ir.ui.menu,name:stock.menu_stock_root
msgid "Inventory Management"
msgstr ""
msgstr "Voorraadbeheer"
#. module: stock
#: selection:stock.location,icon:0
@ -70,7 +70,7 @@ msgstr "STOCK_MEDIA_FORWARD"
#. module: stock
#: rml:lot.location:0
msgid "Total :"
msgstr ""
msgstr "Totaal :"
#. module: stock
#: selection:stock.location,icon:0
@ -81,7 +81,7 @@ msgstr "STOCK_ZOOM_100"
#: rml:lot.stock.overview:0
#: rml:lot.stock.overview_all:0
msgid "UoM"
msgstr ""
msgstr "Meeteenheid"
#. module: stock
#: model:ir.actions.wizard,name:stock.return_picking
@ -109,7 +109,7 @@ msgstr "Paklijst"
#: rml:lot.stock.overview:0
#: rml:lot.stock.overview_all:0
msgid "Amount"
msgstr ""
msgstr "Hoeveelheid"
#. module: stock
#: view:stock.picking:0
@ -141,8 +141,7 @@ msgstr "Relatie"
#. module: stock
#: help:product.product,track_incoming:0
msgid "Force to use a Production Lot during receptions"
msgstr ""
"Forceer om een productie-eenheid te gebruiken tijdens goederenontvangst."
msgstr "Forceer het gebruik van een batchnummer bij goederenontvangst"
#. module: stock
#: field:stock.move,move_history_ids:0
@ -155,7 +154,7 @@ msgstr "Notatie"
#: field:stock.production.lot.revision,lot_id:0
#: field:stock.report.prodlots,prodlot_id:0
msgid "Production lot"
msgstr "Seriegrootte"
msgstr "Batchnummer"
#. module: stock
#: selection:stock.location,icon:0
@ -306,7 +305,7 @@ msgstr "STOCK_FLOPPY"
#. module: stock
#: view:stock.production.lot.revision:0
msgid "Production Lot Revisions"
msgstr "Herziening productie-eenheden"
msgstr "Batchnummer herzieningen"
#. module: stock
#: view:stock.location:0
@ -371,7 +370,7 @@ msgstr "Leveringslocatie"
#: model:ir.actions.act_window,name:stock.action_production_lot_form
#: model:ir.ui.menu,name:stock.menu_action_production_lot_form
msgid "Production Lots"
msgstr "Productie-eenheden"
msgstr "Batchnummers"
#. module: stock
#: rml:stock.picking.list:0
@ -425,9 +424,7 @@ msgstr "Locatieadres"
#. module: stock
#: help:stock.move,prodlot_id:0
msgid "Production lot is used to put a serial number on the production"
msgstr ""
"Productie-eenheid wordt gebruikt om een serienummer aan de productie toe te "
"voegen."
msgstr "Batchnummers worden gebruikt om productie-eenheden te identificeren."
#. module: stock
#: model:stock.location,name:stock.stock_location_13
@ -493,8 +490,7 @@ msgstr "Voorraadlocatie"
#. module: stock
#: help:product.product,track_production:0
msgid "Force to use a Production Lot during production order"
msgstr ""
"Forceer deze op een productie-eenheid te gebruiken tijdens de productieorder"
msgstr "Forceer het gebruik van een batchnummer bij productieorders"
#. module: stock
#: selection:stock.location,icon:0
@ -537,7 +533,7 @@ msgstr "Leveringskalender"
#. module: stock
#: field:product.product,track_incoming:0
msgid "Track Incomming Lots"
msgstr "Traceer inkomende pakketten"
msgstr "Traceer binnenkomende batches"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_stock_product_location_open
@ -552,7 +548,7 @@ msgstr "STOCK_SAVE_AS"
#. module: stock
#: model:ir.model,name:stock.model_stock_report_prodlots
msgid "Stock report by production lots"
msgstr "Voorraadrapport met productie-eenheden"
msgstr "Voorraadrapport met batchnummers"
#. module: stock
#: field:stock.location,stock_virtual:0
@ -598,7 +594,7 @@ msgstr "Nieuw ontvangstbon aanmaken"
#. module: stock
#: wizard_field:stock.move.track,init,quantity:0
msgid "Quantity per lot"
msgstr "Aantal per eenheid"
msgstr "Aantal per batch"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_move_form2
@ -661,7 +657,7 @@ msgstr "Verwachte verzenddatum"
#. module: stock
#: rml:stock.picking.list:0
msgid "Shipping Address :"
msgstr ""
msgstr "Afleveradres :"
#. module: stock
#: view:stock.tracking:0
@ -727,7 +723,7 @@ msgstr "Van"
#. module: stock
#: rml:stock.picking.list:0
msgid "weight"
msgstr ""
msgstr "gewicht"
#. module: stock
#: rml:stock.picking.list:0
@ -742,7 +738,7 @@ msgstr "Factuurcontrole"
#. module: stock
#: model:ir.model,name:stock.model_stock_production_lot_revision
msgid "Production lot revisions"
msgstr "Heroverweeg productie-eenheden"
msgstr "Batchnummer herzieningen"
#. module: stock
#: view:stock.picking:0
@ -1554,7 +1550,7 @@ msgstr "Revisiedatum"
#. module: stock
#: rml:stock.picking.list:0
msgid "Lot"
msgstr "Overdoos"
msgstr "Batch"
#. module: stock
#: wizard_view:inventory.merge.stock.zero,init:0
@ -1628,7 +1624,7 @@ msgstr "Leveringsvoorwaarden"
#: rml:lot.stock.overview:0
#: rml:lot.stock.overview_all:0
msgid "Total:"
msgstr ""
msgstr "Totaal:"
#. module: stock
#: selection:stock.location,icon:0
@ -1731,7 +1727,7 @@ msgstr "Magazijnen"
#. module: stock
#: help:product.product,track_outgoing:0
msgid "Force to use a Production Lot during deliveries"
msgstr "Forceer om productie-eenheiden te gebruiken om te leveren"
msgstr "Forceer het gebruik van batchnummers bij leveringen"
#. module: stock
#: view:stock.picking:0
@ -1790,7 +1786,7 @@ msgstr "Product eenh."
#: rml:lot.stock.overview:0
#: rml:lot.stock.overview_all:0
msgid "Variants"
msgstr ""
msgstr "Varianten"
#. module: stock
#: field:stock.location,posx:0
@ -1870,7 +1866,7 @@ msgstr "STOCK_MEDIA_PAUSE"
#. module: stock
#: view:product.product:0
msgid "Lots"
msgstr "Aantallen"
msgstr "Batches"
#. module: stock
#: selection:stock.picking,move_type:0
@ -1880,7 +1876,7 @@ msgstr "Allen te gelijk"
#. module: stock
#: field:product.product,track_outgoing:0
msgid "Track Outging Lots"
msgstr "Uitgaande voorraadeenheden"
msgstr "Traceer uitgaande batches"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_line_date
@ -1903,7 +1899,7 @@ msgstr "STOCK_FIND"
#. module: stock
#: view:stock.inventory:0
msgid "Lot Inventory"
msgstr "Partijvoorraad"
msgstr "Batchvoorraad"
#. module: stock
#: help:stock.location,chained_auto_packing:0
@ -2088,7 +2084,7 @@ msgstr "terp-project"
#: model:ir.ui.menu,name:stock.menu_stock_report_prodlots
#: view:stock.report.prodlots:0
msgid "Stock by Lots"
msgstr "In voorraad per verpakkingseenheid"
msgstr "Voorraad per batch"
#. module: stock
#: field:stock.move,auto_validate:0
@ -2199,7 +2195,7 @@ msgstr "STOCK_REVERT_TO_SAVED"
#. module: stock
#: field:product.product,track_production:0
msgid "Track Production Lots"
msgstr "Traceerd productie-eenheden"
msgstr "Traceer productiebatches"
#. module: stock
#: view:stock.picking:0
@ -2232,7 +2228,7 @@ msgstr "stock.picking.move.wizard"
#: field:stock.move,prodlot_id:0
#: view:stock.production.lot:0
msgid "Production Lot"
msgstr "Productie-eenheid."
msgstr "Productie batch"
#. module: stock
#: model:ir.ui.menu,name:stock.menu_traceability

View File

@ -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-06-13 15:17+0000\n"
"PO-Revision-Date: 2010-06-14 14:56+0000\n"
"Last-Translator: Grzegorz Grzelak (Cirrus.pl) <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-06-14 03:42+0000\n"
"X-Launchpad-Export-Date: 2010-06-16 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: stock
@ -86,7 +86,7 @@ msgstr "JM"
#. module: stock
#: model:ir.actions.wizard,name:stock.return_picking
msgid "Return packing"
msgstr "Lista przesunięć zwrotnych"
msgstr "Zwrot"
#. module: stock
#: field:product.category,property_stock_journal:0
@ -103,7 +103,7 @@ msgstr "Wypełnij inwentaryzację dla podanej strefy mag."
#: view:stock.picking:0
#: field:stock.picking.move.wizard,picking_id:0
msgid "Packing list"
msgstr "Lista przesunięć"
msgstr "Pobranie"
#. module: stock
#: rml:lot.stock.overview:0
@ -206,7 +206,7 @@ msgstr "Wykonaj paczkę (przesunięcie)"
#. module: stock
#: wizard_view:stock.partial_picking,end2:0
msgid "Packing result"
msgstr "Rezultat listy przesunięć"
msgstr "Rezultat pobrania"
#. module: stock
#: selection:stock.location,icon:0
@ -708,7 +708,7 @@ msgstr "terp-stock"
#. module: stock
#: rml:stock.picking.list:0
msgid "Packing List:"
msgstr "Lista przesunięć:"
msgstr "Pobranie:"
#. module: stock
#: selection:stock.location,icon:0
@ -748,7 +748,7 @@ msgstr "Wersja partii produkcyjnej"
#. module: stock
#: view:stock.picking:0
msgid "Packing Done"
msgstr "Listę przesunięć wykonano"
msgstr "Pobranie wykonane"
#. module: stock
#: selection:stock.move,state:0
@ -762,7 +762,7 @@ msgstr "Oczekiwanie"
#: model:ir.ui.menu,name:stock.menu_action_picking_tree7
#: model:ir.ui.menu,name:stock.menu_picking_waiting
msgid "Available Packing"
msgstr "Dostępne listy przesunięć"
msgstr "Dostępne pobrania"
#. module: stock
#: model:ir.model,name:stock.model_stock_warehouse
@ -815,7 +815,7 @@ msgstr ""
#: model:ir.ui.menu,name:stock.menu_action_picking_all
#: wizard_field:stock.picking.make,init,pickings:0
msgid "Packing"
msgstr "Listy przesunięć"
msgstr "Pobrania"
#. module: stock
#: selection:stock.location,icon:0
@ -988,7 +988,7 @@ msgstr ""
#. module: stock
#: wizard_view:stock.partial_picking,end2:0
msgid "The packing has been successfully made !"
msgstr "Lista przesunięć zostało poprawnie wykonana !"
msgstr "Pobranie wykonano poprawnie !"
#. module: stock
#: field:stock.move,address_id:0
@ -1158,13 +1158,13 @@ msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Input Packing List"
msgstr "Lista przesunięć wchodzących"
msgstr "Przyjęcie zewnętrzne"
#. module: stock
#: model:ir.model,name:stock.model_stock_picking
#: field:stock.move,picking_id:0
msgid "Packing List"
msgstr "Lista przesunięć"
msgstr "Pobranie"
#. module: stock
#: selection:stock.location,icon:0
@ -1205,7 +1205,7 @@ msgstr ""
#. module: stock
#: selection:stock.picking,invoice_state:0
msgid "Not from Packing"
msgstr "Nie z listy przesunięć"
msgstr "Nie z pobrania"
#. module: stock
#: view:stock.location:0
@ -1299,7 +1299,7 @@ msgstr "Metoda dostawy"
#. module: stock
#: model:ir.actions.wizard,name:stock.partial_picking
msgid "Partial packing"
msgstr "Częściowa lista przesunięć"
msgstr "Pobranie częściowe"
#. module: stock
#: selection:stock.location,icon:0
@ -1370,7 +1370,7 @@ msgstr "Strefa magazynowa"
#. module: stock
#: field:stock.picking,invoice_state:0
msgid "Invoice Status"
msgstr "Stan faktury"
msgstr "Fakturowanie"
#. module: stock
#: rml:lot.location:0
@ -1572,7 +1572,7 @@ msgstr "Ilość (JS)"
#: model:ir.actions.act_window,name:stock.action_picking_tree5
#: model:ir.ui.menu,name:stock.menu_action_picking_tree5
msgid "Packing to Process"
msgstr "Listy przesunięć do obróbki"
msgstr "Pobrania do wykonania"
#. module: stock
#: selection:stock.location,icon:0
@ -1588,12 +1588,12 @@ msgstr "Ustaw jako dostępne"
#: model:ir.actions.wizard,name:stock.make_picking
#: wizard_view:stock.picking.make,init:0
msgid "Make packing"
msgstr "Wykonaj listę przesunięć"
msgstr "Wykonaj pobranie"
#. module: stock
#: field:stock.picking,backorder_id:0
msgid "Back Order"
msgstr "Zamówienie zaległe"
msgstr "Pobranie częściowe"
#. module: stock
#: selection:stock.location,icon:0
@ -1770,7 +1770,7 @@ msgstr "Zwrot"
#. module: stock
#: field:stock.picking,auto_picking:0
msgid "Auto-Packing"
msgstr "Auto-przesunięcie"
msgstr "Auto-pobranie"
#. module: stock
#: field:stock.move,product_uos:0
@ -2172,7 +2172,7 @@ msgstr ""
#: model:ir.ui.menu,name:stock.menu_action_picking_tree3
#: model:ir.ui.menu,name:stock.menu_action_picking_tree8
msgid "Confirmed Packing Waiting Availability"
msgstr "Potwierdzone listy przesunięć oczekujące na dostępność"
msgstr "Potwierdzone pobrania oczekujące na dostępność"
#. module: stock
#: field:stock.location,posy:0
@ -2257,7 +2257,7 @@ msgstr "Data zamówienia"
#. module: stock
#: selection:stock.invoice_onshipping,init,type:0
msgid "Supplier Invoice"
msgstr "Faktura dostawcy"
msgstr "Faktura od dostawcy"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_location_form

View File

@ -0,0 +1,317 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Test" author="Martin Simon" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="0.0" y1="57.0" width="538" height="728"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="Standard_Outline">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table_Address_detail">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Table_Title_String">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
</blockTableStyle>
<blockTableStyle id="Header_Order_Reference_Tbl">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,0" stop="0,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="0,0" stop="0,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="1,0" stop="1,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="1,0" stop="1,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="2,0" stop="2,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="2,0" stop="2,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="3,0" stop="3,-1"/>
<lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="3,0" stop="3,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="3,0" stop="3,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/>
</blockTableStyle>
<blockTableStyle id="Content_Order_Reference_Table">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,0" stop="0,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="0,0" stop="0,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="1,0" stop="1,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="1,0" stop="1,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="2,0" stop="2,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="2,0" stop="2,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="3,0" stop="3,-1"/>
<lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="3,0" stop="3,-1"/>
<lineStyle kind="LINEABOVE" colorName="#e6e6e6" start="3,0" stop="3,0"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/>
</blockTableStyle>
<blockTableStyle id="Move_Line_Header">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="5,-1" stop="5,-1"/>
</blockTableStyle>
<blockTableStyle id="Move_Line_Contect_Assign_State">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="5,-1" stop="5,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="6,-1" stop="6,-1"/>
</blockTableStyle>
<blockTableStyle id="Move_Line_Content_Other_State">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="4,-1" stop="4,-1"/>
<lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="5,-1" stop="5,-1"/>
</blockTableStyle>
<initialize>
<paraStyle name="all" alignment="justify"/>
</initialize>
<paraStyle name="Standard" fontName="Times-Roman"/>
<paraStyle name="Heading" fontName="Helvetica" fontSize="14.0" leading="17" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="Text body" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="List" fontName="Times-Roman" spaceBefore="0.0" spaceAfter="6.0"/>
<paraStyle name="Caption" fontName="Times-Italic" fontSize="12.0" leading="15" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="Index" fontName="Times-Roman"/>
<paraStyle name="terp_header" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="12.0" leading="15" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_tblheader_Details" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_tblheader_Details_Centre" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_tblheader_General" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_General_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="Table Contents" fontName="Times-Roman"/>
<paraStyle name="Footer" fontName="Times-Roman"/>
<paraStyle name="Table Heading" fontName="Times-Roman" alignment="CENTER"/>
<paraStyle name="Horizontal Line" fontName="Times-Roman" fontSize="6.0" leading="8" spaceBefore="0.0" spaceAfter="14.0"/>
<paraStyle name="Heading 9" fontName="Helvetica-Bold" fontSize="75%" leading="NaN" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_tblheader_General_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_tblheader_Details_Right" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_header_Right" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_address" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_2" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_5cm_Above_Space" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_1cm_above_space" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="3.0" spaceAfter="0.0"/>
</stylesheet>
<images/>
<story>
<para style="terp_default_8">[[ repeatIn(objects,'picking') ]] </para>
<para style="terp_default_9">
<font color="white"> </font>
</para>
<blockTable colWidths="269.0,269.0" style="Table_Address_detail">
<tr>
<td>
<para style="terp_default_9">
<font color="white"> </font>
</para>
</td>
<td>
<para style="terp_default_9">[[ (picking.address_id and picking.address_id.partner_id and picking.address_id.partner_id.title) or '' ]] [[ picking.address_id and picking.address_id.partner_id and picking.address_id.partner_id.name ]]</para>
<para style="terp_default_9">[[ picking.address_id and picking.address_id.street or '' ]]</para>
<para style="terp_default_9">[[ picking.address_id and picking.address_id.zip or '' ]] [[ picking.address_id and picking.address_id.city or '']]</para>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<para style="terp_default_2">
<font color="white"> </font>
</para>
</td>
</tr>
<tr>
<td>
<para style="terp_default_9">
<font color="white"> </font>
</para>
</td>
<td>
<para style="terp_tblheader_Details">[[ picking.sale_id and picking.sale_id.partner_shipping_id and 'Shipping Address :' or removeParentNode('para') ]] </para>
<para style="terp_default_9">[[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.title) or '' ]] [[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.name) or '' ]] </para>
<para style="terp_default_9">[[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.street) or '' ]] </para>
<para style="terp_default_9">[[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.zip) or '' ]] [[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.city) or '' ]] [[ (picking.address_id and picking.address_id.state_id and picking.address_id.state_id.name) or '' ]] </para>
<para style="terp_default_9">[[ (picking.address_id and picking.address_id.country_id and picking.address_id.country_id.name) or '' ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_5cm_Above_Space">
<font color="white"> </font>
</para>
<para style="terp_default_5cm_Above_Space">
<font color="white"> </font>
</para>
<para style="terp_default_5cm_Above_Space">
<font color="white"> </font>
</para>
<blockTable colWidths="538.0" style="Table_Title_String">
<tr>
<td>
<para style="terp_header">Packing List: [[ picking.name ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_5cm_Above_Space">
<font color="white"> </font>
</para>
<para style="terp_default_5cm_Above_Space">
<font color="white"> </font>
</para>
<blockTable colWidths="123.0,134.0,133.0,134.0" style="Header_Order_Reference_Tbl">
<tr>
<td>
<para style="terp_tblheader_General_Centre">Order(Origin)</para>
</td>
<td>
<para style="terp_tblheader_General_Centre">Recipient</para>
</td>
<td>
<para style="terp_tblheader_General_Centre">Expected Shipping Date </para>
</td>
<td>
<para style="terp_tblheader_General_Centre"> Weight</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="123.0,134.0,133.0,134.0" style="Content_Order_Reference_Table">
<tr>
<td>
<para style="terp_default_Centre_8">[[ picking.origin ]]</para>
</td>
<td>
<para style="terp_default_Centre_8">[[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.title) or '' ]] [[ (picking.sale_id and picking.sale_id.partner_shipping_id and picking.sale_id.partner_shipping_id.name) or '' ]] </para>
</td>
<td>
<para style="terp_default_Centre_8">[[ formatLang(picking.min_date,date_time = True) ]]</para>
</td>
<td>
<para style="terp_default_Centre_8">[[ 'weight' in picking._columns.keys() and picking.weight or '']] </para>
</td>
</tr>
</blockTable>
<para style="terp_default_5cm_Above_Space">
<font color="white"> </font>
</para>
<blockTable colWidths="196.0,68.0,56.0,61.0,73.0,70.0" repeatRows="1" style="Move_Line_Header">
<tr>
<td>
<para style="terp_tblheader_Details">Description</para>
</td>
<td>
<para style="terp_tblheader_Details_Centre">Tracking Lot</para>
</td>
<td>
<para style="terp_tblheader_Details_Centre">Lot</para>
</td>
<td>
<para style="terp_tblheader_Details">State</para>
</td>
<td>
<para style="terp_tblheader_Details_Centre">Quantity</para>
</td>
<td>
<para style="terp_tblheader_Details">Location</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<para style="terp_default_2">
<font color="white"> </font>
</para>
<section>
<para style="terp_default_8">[[ repeatIn([line for line in picking.move_lines if (line.state == 'assigned' )],'move_lines') ]]</para>
<blockTable colWidths="197.0,68.0,61.0,57,46.0,26.0,74.0" style="Move_Line_Contect_Assign_State">
<tr>
<td>
<para style="terp_default_9">[ [[ move_lines.product_id.default_code ]] ] [[ move_lines.product_id.name ]] [[ move_lines.product_id.variants or '']] </para>
</td>
<td>
<para style="terp_default_9">[[ move_lines.tracking_id and move_lines.tracking_id.name or '' ]]</para>
</td>
<td>
<para style="terp_default_9">[[ (move_lines.prodlot_id and move_lines.prodlot_id.name) or '' ]]</para>
</td>
<td>
<para style="terp_default_9">[[ move_lines.state ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ move_lines.product_qty ]] </para>
</td>
<td>
<para style="terp_default_9">[[ move_lines.product_uom.name ]]</para>
</td>
<td>
<para style="terp_default_9">[[ (move_lines.location_id and move_lines.location_id.name) or '' ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
</section>
<para style="terp_default_5cm_Above_Space">[[ (line.state == 'done' or line.state == 'confirmed') and removeParentNode('para') ]]</para>
<para style="terp_default_Bold_9">Non Assigned Products: [[ ( line.state == 'assigned' or line.state == 'done' or line.state == 'confirmed' ) and removeParentNode('para') ]]</para>
<para style="terp_default_1cm_above_space">[[ (line.state == 'done' or line.state == 'confirmed') and removeParentNode('para') ]]</para>
<section>
<para style="terp_default_8">[[ repeatIn([line for line in picking.move_lines if (line.state != 'assigned' )],'move_lines') ]]</para>
<blockTable colWidths="257.0,57.0,62.0,46.0,26.0,74.0" style="Move_Line_Content_Other_State">
<tr>
<td>
<para style="terp_default_9">[ [[ move_lines.product_id.default_code ]] ] [[ move_lines.product_id.name ]] [[ move_lines.product_id.variants or '']]</para>
</td>
<td>
<para style="terp_default_9">[[ (move_lines.prodlot_id and move_lines.prodlot_id.name) or '' ]]</para>
</td>
<td>
<para style="terp_default_9">[[ move_lines.state ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ move_lines.product_qty ]] </para>
</td>
<td>
<para style="terp_default_9">[[ move_lines.product_uom.name ]]</para>
</td>
<td>
<para style="terp_default_9">[[ (move_lines.location_id and move_lines.location_id.name) or '' ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_2">
<font color="white"> </font>
</para>
</section>
<para style="terp_default_9">
<font color="white"> </font>
</para>
<para style="Standard">
<font color="white"> </font>
</para>
</story>
</document>

View File

@ -32,4 +32,5 @@ class picking(report_sxw.rml_parse):
})
report_sxw.report_sxw('report.stock.picking.list','stock.picking','addons/stock/report/picking.rml',parser=picking)
report_sxw.report_sxw('report.stock.packing.list','stock.picking','addons/stock/report/packing.rml',parser=picking)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

0
addons/stock/report/report_stock_move.py Executable file → Normal file
View File

10
addons/stock/report/report_stock_move_view.xml Executable file → Normal file
View File

@ -84,7 +84,6 @@
<separator orientation="vertical"/>
<field name="product_id"/>
<field name="partner_id" context="{'contact_display':'partner'}"/>
<field name="date_planned"/>
</group>
<newline/>
<group expand="0" string="Group By...">
@ -97,6 +96,8 @@
<filter string="Dest. Location" name="dest_location" icon="terp-gtk-jump-to-ltr" context="{'group_by':'location_dest_id'}"/>
<filter string="State" name="group_state" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Company" name="group_state" icon="terp-stock_effects-object-colorize" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical"/>
<filter string="Day" icon="terp-go-month" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'date_planned'}"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
@ -105,7 +106,10 @@
<group expand="0" string="Extended options..." groups="base.group_extended">
<field name="location_id" widget = "selection"/>
<field name="location_dest_id" widget = "selection"/>
<field name="state"/>
<separator orientation="vertical"/>
<field name="company_id" groups="base.group_multi_company"/>
<newline/>
<field name="date_planned"/>
</group>
</search>
@ -169,7 +173,7 @@
domain="[('state','=','done')]"
help="Analysis on real stock."/>
<filter string="Virtual"
<filter string="Future"
icon="terp-camera_test"
domain="[('state','in',('assigned','done','waiting','confirmed'))]"
help = "Analysis including future operations."/>

View File

@ -0,0 +1,110 @@
# -*- 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 fields,osv
import tools
class report_stock_picking(osv.osv):
_name = "report.stock.picking"
_description = "Stock Picking Report"
_auto = False
_columns = {
'year': fields.char('Year',size=64,required=False, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'nbr': fields.integer('# of Lines', readonly=True),
'nbp': fields.integer('# of Picking', readonly=True),
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
'product_qty': fields.float('# of Products', readonly=True),
'product_uos_qty': fields.float('# of Products', readonly=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True),
'date': fields.date('Date', readonly=True),
'avg_days_to_deliver': fields.float('Avg Days to Deliver', digits=(16,2), readonly=True, group_operator="avg",
help="Number of Avg Days to deliver"),
'state': fields.selection([('draft', 'Draft'),('auto', 'Waiting'),('confirmed', 'Confirmed'),('assigned', 'Available'),('done', 'Done'),('cancel', 'Cancelled')], 'State'),
'type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal'), ('delivery', 'Delivery')], 'Shipping Type', required=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'invoice_state': fields.selection([
("invoiced", "Invoiced"),
("2binvoiced", "To Be Invoiced"),
("none", "Not from Picking")], "Invoice Status",readonly=True),
'min_date': fields.date('Expected Date',help="Expected date for Picking. Default it takes current date"),
'order_date': fields.date('Order Date', help="Date of Order"),
'date_done': fields.date('Date Done', help="Date of completion"),
'location_id': fields.many2one('stock.location', 'Source Location', help="Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations."),
'location_dest_id': fields.many2one('stock.location', 'Dest. Location', help="Location where the system will stock the finished products."),
'max_date': fields.date('Max.Expected Date'),
'product_uos': fields.many2one('product.uom', 'Product UOS'),
'product_uom': fields.many2one('product.uom', 'Product UOM'),
}
def init(self, cr):
tools.drop_view_if_exists(cr, 'report_stock_picking')
cr.execute("""
create or replace view report_stock_picking as (
select
min(sm.id) as id,
date_trunc('day',sp.min_date) as min_date,
date_trunc('day',sp.date) as order_date,
date_trunc('day',sp.date_done) as date_done,
date_trunc('day',sp.max_date) as max_date,
to_char(sp.create_date, 'YYYY') as year,
to_char(sp.create_date, 'MM') as month,
to_char(sp.create_date, 'YYYY-MM-DD') as day,
sp.address_id as partner_id,
to_date(to_char(sp.create_date, 'MM-dd-YYYY'),'MM-dd-YYYY') as date,
count(sm.id) as nbr,
count(distinct sp.id) as nbp,
sum(sm.product_qty) as product_qty,
sum(sm.product_uos_qty) as product_uos_qty,
sm.product_id as product_id,
sm.location_dest_id as location_dest_id,
sm.location_id as location_id,
sp.type,
sm.product_uos,
sm.product_uom,
sp.invoice_state,
sp.company_id as company_id,
avg(extract('epoch' from (sp.date_done-sp.create_date)))/(3600*24) as avg_days_to_deliver,
sp.state
from stock_move as sm
left join stock_picking as sp ON (sm.picking_id=sp.id)
group by sp.type,
sp.create_date,
sp.address_id,
sm.product_id,
to_char(sp.create_date, 'YYYY'),
sm.location_dest_id,
sm.location_id,
to_char(sp.create_date, 'MM'),
to_char(sp.create_date, 'YYYY-MM-DD'),
sm.product_uos,
sm.product_uom,
date_trunc('day',sp.min_date),
date_trunc('day',sp.date),
date_trunc('day',sp.date_done),
date_trunc('day',sp.max_date),
sp.invoice_state,
sp.company_id,
sp.state
)""")
report_stock_picking()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--
Stock Picking Report
-->
<record id="view_report_report_stock_picking_tree" model="ir.ui.view">
<field name="name">report.stock.picking.tree</field>
<field name="model">report.stock.picking</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Picking">
<field name="year" invisible="1"/>
<field name="month" invisible="1"/>
<field name="day" invisible="1"/>
<field name="date" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="min_date" invisible="1"/>
<field name="order_date" invisible="1"/>
<field name="date_done" invisible="1"/>
<field name="max_date" invisible="1"/>
<field name="type" invisible="1"/>
<field name="invoice_state" invisible="1"/>
<field name="state" invisible="1"/>
<field name="product_qty" sum="# of Products" />
<field name="nbp" sum="# of Pickings" />
<field name="nbr" sum="# of Lines" />
<field name="avg_days_to_deliver" avg='Avg Days to Deliver'/>
</tree>
</field>
</record>
<record id="view_report_report_stock_picking_graph" model="ir.ui.view">
<field name="name">report.stock.picking.graph</field>
<field name="model">report.stock.picking</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph orientation="horizontal" string="Picking" type="bar">
<field name="partner_id"/>
<field name="nbr" operator="+"/>
<field name="product_qty" operator="+"/>
<field name="nbp" operator="+"/>
</graph>
</field>
</record>
<record id="view_report_report_stock_picking_filter" model="ir.ui.view">
<field name="name">report.stock.picking.select</field>
<field name="model">report.stock.picking</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search">
<group col="16" colspan="6">
<filter icon="terp-go-year" string=" 365 Days "
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="Picking in last 365 days"/>
<filter icon="terp-go-month" string=" 30 Days "
name="month"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Picking in last 30 days"/>
<filter icon="terp-go-week"
string=" 7 Days "
separator="1"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="Picking during last 7 days"/>
<separator orientation="vertical"/>
<filter string="Todo" icon="terp-gtk-go-back-rtl" domain="[('state','in',('draft','auto','confirmed','assigned'))]"/>
<filter string="Done" icon="terp-dialog-close" domain="[('state','=','done')]"/>
<separator orientation="vertical"/>
<field name="partner_id"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<newline/>
<group expand="0" string="Group By...">
<filter string="Partner" name="Partner" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Shipping Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type'}"/>
<separator orientation="vertical"/>
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<filter string="Invoice Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'invoice_state'}"/>
<separator orientation="vertical"/>
<filter string="Day" icon="terp-go-month" domain="[]" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-go-month" domain="[]" context="{'group_by':'month'}"/>
<filter string="Year" icon="terp-go-year" domain="[]" context="{'group_by':'year'}"/>
</group>
<newline/>
<group expand="0" string="Extended options..." groups="base.group_extended">
<field name="type"/>
<separator orientation="vertical"/>
<field name="min_date"/>
<separator orientation="vertical"/>
<field name="max_date"/>
<newline/>
<field name="invoice_state"/>
<separator orientation="vertical"/>
<field name="order_date"/>
<separator orientation="vertical"/>
<field name="date_done"/>
</group>
</search>
</field>
</record>
<record id="action_report_report_stock_picking" model="ir.actions.act_window">
<field name="name">Picking</field>
<field name="res_model">report.stock.picking</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="view_id" ref="view_report_report_stock_picking_tree"/>
<field name="search_view_id" ref="view_report_report_stock_picking_filter"/>
<field name="context">{'search_default_Partner':1,'search_default_month':1,'group_by_no_leaf':1,'group_by':[]}</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_report_stock_picking_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_report_stock_picking_tree"/>
<field name="act_window_id" ref="action_report_report_stock_picking"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_report_stock_picking_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_report_stock_picking_graph"/>
<field name="act_window_id" ref="action_report_report_stock_picking"/>
</record>
<menuitem name="Picking" action="action_report_report_stock_picking" id="menu_report_report_stock_pickings_tree" parent="next_id_61"/>
</data>
</openerp>

View File

@ -5,6 +5,8 @@
"access_stock_warehouse_user","stock.warehouse.user","model_stock_warehouse","base.group_user",1,0,0,0
"access_stock_location_manager","stock.location.manager","model_stock_location","stock.group_stock_manager",1,1,1,1
"access_stock_location_user","stock.location.user","model_stock_location","base.group_user",1,0,0,0
"access_stock_journal_user","stock.journal.user","model_stock_journal","base.group_user",1,0,0,0
"access_stock_journal_manager","stock.journal.manager","model_stock_journal","stock.group_stock_manager",1,1,1,1
"access_stock_picking_move_wizard","stock.picking.move.wizard","model_stock_picking_move_wizard","stock.group_stock_user",1,1,1,1
"access_stock_tracking","stock.tracking","model_stock_tracking","stock.group_stock_user",1,1,1,0
"access_stock_picking","stock.picking","model_stock_picking","stock.group_stock_user",1,1,1,1
@ -14,7 +16,7 @@
"access_stock_inventory","stock.inventory","model_stock_inventory","stock.group_stock_user",1,1,1,1
"access_stock_inventory_line","stock.inventory.line","model_stock_inventory_line","stock.group_stock_user",1,1,1,1
"access_stock_report_prodlots","stock.report.prodlots","model_stock_report_prodlots","stock.group_stock_manager",1,0,0,0
"access_stock_location_product_manager","stock.location product manager","model_stock_location","product.group_product_manager",1,0,0,0
"access_stock_location_product_manager","stock.location product manager","model_stock_location","product.group_product_manager",1,1,1,1
"access_stock_lines_date","report.stock.lines.date all","model_report_stock_lines_date",stock.group_stock_user,1,0,0,0
"access_stock_report_tracklots","stock.report.tracklots","model_stock_report_tracklots","stock.group_stock_user",1,1,1,1
"access_report_products_to_received_planned","report.products.to.received.planned","model_report_products_to_received_planned","stock.group_stock_user",1,1,1,1
@ -24,17 +26,28 @@
"access_stock_move_scrap","stock.move.scrap","model_stock_move_scrap","stock.group_stock_user",1,1,1,1
"access_stock_move_split","stock.move.split","model_stock_move_split","stock.group_stock_user",1,1,1,1
"access_stock_move_split_lines","stock.move.split.lines","model_stock_move_split_lines","stock.group_stock_user",1,1,1,1
"access_stock_move_split_lines_exist","stock.move.split.lines.exist","model_stock_move_split_lines_exist","stock.group_stock_user",1,1,1,1
"access_stock_inventory_set_stock_zero","stock.inventory.set.stock.zero","model_stock_inventory_set_stock_zero","stock.group_stock_user",1,1,1,1
"access_stock_fill_inventory","stock.fill.inventory","model_stock_fill_inventory","stock.group_stock_user",1,1,1,1
"access_stock_inventory_line_split","stock.inventory.line.split","model_stock_inventory_line_split","stock.group_stock_user",1,1,1,1
"access_stock_invoice_onshipping","stock.invoice.onshipping","model_stock_invoice_onshipping","stock.group_stock_user",1,1,1,1
"access_stock_location_product","stock.location.product","model_stock_location_product","stock.group_stock_user",1,0,0,0
"access_stock_traceability_upstream","stock.traceability.upstream","model_stock_traceability_upstream","stock.group_stock_user",1,0,0,0
"access_stock_traceability_downstream","stock.traceability.downstream","model_stock_traceability_downstream","stock.group_stock_user",1,0,0,0
"access_stock_traceability_lot_upstream","stock.traceability.lot.upstream","model_stock_traceability_lot_upstream","stock.group_stock_user",1,0,0,0
"access_stock_traceability_lot_downstream","stock.traceability.lot.downstream","model_stock_traceability_lot_downstream","stock.group_stock_user",1,0,0,0
"access_stock_location_product","stock.location.product","model_stock_location_product","stock.group_stock_user",1,1,1,1
"access_stock_location_product_manager","stock.location.product manager","model_stock_location_product","stock.group_stock_manager",1,1,1,1
"access_stock_traceability_upstream","stock.traceability.upstream","model_stock_traceability_upstream","stock.group_stock_user",1,1,1,1
"access_stock_traceability_downstream","stock.traceability.downstream","model_stock_traceability_downstream","stock.group_stock_user",1,1,1,1
"access_stock_traceability_lot_upstream","stock.traceability.lot.upstream","model_stock_traceability_lot_upstream","stock.group_stock_user",1,1,1,1
"access_stock_traceability_lot_downstream","stock.traceability.lot.downstream","model_stock_traceability_lot_downstream","stock.group_stock_user",1,1,1,1
"access_stock_partial_picking",stock.partial.picking","model_stock_partial_picking",,1,1,1,1
"access_stock_partial_move","stock.partial.move","model_stock_partial_move",,1,1,1,1
"access_stock_inventory_merge","stock.inventory.merge","model_stock_inventory_merge","stock.group_stock_user",1,0,0,0
"access_stock_change_standard_price","stock.change.standard.price","model_stock_change_standard_price","stock.group_stock_user",1,0,0,0
"access_action_traceability","action.traceability","model_action_traceability","stock.group_stock_user",1,0,0,0
"access_stock_split_into","stock.split.into","model_stock_split_into","stock.group_stock_user",1,0,0,0
"access_stock_split_into_manager","stock.split.into","model_stock_split_into","stock.group_stock_manager",1,1,1,1
"access_report_stock_move","report.stock.move","model_report_stock_move","stock.group_stock_user",1,1,1,1
"access_report_stock_inventory","report.stock.inventory","model_report_stock_inventory","stock.group_stock_user",1,1,1,1
"access_stock_replacement","stock.replacement","model_stock_replacement","stock.group_stock_user",1,1,1,1
"access_stock_replacement_result","stock.replacement.result","model_stock_replacement_result","stock.group_stock_user",1,1,1,1
"access_stock_ups","stock.ups","model_stock_ups","stock.group_stock_user",1,1,1,1
"access_stock_ups_final","stock.ups.final","model_stock_ups_final","stock.group_stock_user",1,1,1,1
"access_stock_ups_upload","stock.ups.upload","model_stock_ups_upload","stock.group_stock_user",1,1,1,1
Can't render this file because it contains an unexpected character in line 40 and column 53.

View File

@ -49,6 +49,17 @@ class stock_incoterms(osv.osv):
stock_incoterms()
class stock_journal(osv.osv):
_name = "stock.journal"
_description = "Stock Journal"
_columns = {
'name': fields.char('Stock Journal', size=32, required=True),
'user_id': fields.many2one('res.users','Responsible'),
}
_defaults = {
'user_id': lambda s,c,u,ctx: u
}
stock_journal()
#----------------------------------------------------------
# Stock Location
@ -159,7 +170,6 @@ class stock_location(osv.osv):
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the stock location without removing it."),
'usage': fields.selection([('supplier', 'Supplier Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location for Inter-Companies Transfers')], 'Location Type', required=True),
'allocation_method': fields.selection([('fifo', 'FIFO'), ('lifo', 'LIFO'), ('nearest', 'Nearest')], 'Allocation Method', required=True),
'complete_name': fields.function(_complete_name, method=True, type='char', size=100, string="Location Name"),
'stock_real': fields.function(_product_qty_available, method=True, type='float', string='Real Stock', multi="stock"),
@ -169,6 +179,7 @@ class stock_location(osv.osv):
'location_id': fields.many2one('stock.location', 'Parent Location', select=True, ondelete='cascade'),
'child_ids': fields.one2many('stock.location', 'location_id', 'Contains'),
'chained_journal_id': fields.many2one('stock.journal', 'Chained Journal'),
'chained_location_id': fields.many2one('stock.location', 'Chained Location If Fixed'),
'chained_location_type': fields.selection([('none', 'None'), ('customer', 'Customer'), ('fixed', 'Fixed Location')],
'Chained Location Type', required=True),
@ -181,6 +192,8 @@ class stock_location(osv.osv):
"validated automatically. With 'Manual Operation', the stock move has to be validated "\
"by a worker. With 'Automatic No Step Added', the location is replaced in the original move."
),
'chained_picking_type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal'), ('delivery', 'Delivery')], 'Shipping Type', help="Shipping type specify of the chained move, goods coming in or going out."),
'chained_company_id': fields.many2one('res.company', 'Chained Company', help='Set here the belonging company of the chained move'),
'chained_delay': fields.integer('Chained lead time (days)'),
'address_id': fields.many2one('res.partner.address', 'Location Address'),
'icon': fields.selection(tools.icons, 'Icon', size=64),
@ -225,7 +238,7 @@ class stock_location(osv.osv):
elif location.chained_location_type == 'fixed':
result = location.chained_location_id
if result:
return result, location.chained_auto_packing, location.chained_delay
return result, location.chained_auto_packing, location.chained_delay, location.chained_journal_id and location.chained_journal_id.id or False, location.chained_company_id and location.chained_company_id.id or False, location.chained_picking_type
return result
def picking_type_get(self, cr, uid, from_location, to_location, context={}):
@ -557,7 +570,7 @@ class stock_picking(osv.osv):
'type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal'), ('delivery', 'Delivery')], 'Shipping Type', required=True, select=True, help="Shipping type specify, goods coming in or going out."),
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the picking without removing it."),
'note': fields.text('Notes'),
'stock_journal_id': fields.many2one('stock.journal','Stock Journal'),
'location_id': fields.many2one('stock.location', 'Location', help="Keep empty if you produce at the location where the finished products are needed." \
"Set a location if you produce at a fixed location. This can be a partner location " \
"if you subcontract the manufacturing operations."),
@ -589,7 +602,7 @@ class stock_picking(osv.osv):
("2binvoiced", "To Be Invoiced"),
("none", "Not from Picking")], "Invoice Status",
select=True, required=True, readonly=True, states={'draft': [('readonly', False)]}),
'company_id': fields.many2one('res.company', 'Company', required=True,select=1),
'company_id': fields.many2one('res.company', 'Company', required=True, select=1),
}
_defaults = {
'name': lambda self, cr, uid, context: '/',
@ -599,7 +612,7 @@ class stock_picking(osv.osv):
'type': lambda *a: 'in',
'invoice_state': lambda *a: 'none',
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock_picking', context=c)
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.picking', context=c)
}
def copy(self, cr, uid, id, default=None, context={}):
@ -1248,7 +1261,6 @@ class stock_production_lot(osv.osv):
'revisions': fields.one2many('stock.production.lot.revision', 'lot_id', 'Revisions'),
'company_id': fields.many2one('res.company','Company',select=1),
}
_defaults = {
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'name': lambda x, y, z, c: x.pool.get('ir.sequence').get(y, z, 'stock.lot.serial'),
@ -1290,6 +1302,7 @@ stock_production_lot_revision()
# location_dest_id is only used for predicting futur stocks
#
class stock_move(osv.osv):
def _getSSCC(self, cr, uid, context={}):
cr.execute('select id from stock_tracking where create_uid=%s order by id desc limit 1', (uid,))
res = cr.fetchone()
@ -1367,7 +1380,7 @@ class stock_move(osv.osv):
\nThe state is \'Waiting\' if the move is waiting for another one.'),
'price_unit': fields.float('Unit Price',
digits_compute= dp.get_precision('Account')),
'company_id': fields.many2one('res.company', 'Company', required=True,select=1),
'company_id': fields.many2one('res.company', 'Company', required=True, select=1),
'partner_id': fields.related('picking_id','address_id','partner_id',type='many2one', relation="res.partner", string="Partner"),
'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order"),
'origin': fields.related('picking_id','origin',type='char', size=64, relation="stock.picking", string="Origin"),
@ -1393,7 +1406,8 @@ class stock_move(osv.osv):
move_list = self.pool.get('stock.move').read(cr, uid, context['move_line'][0], ['location_dest_id'])
return move_list and move_list['location_dest_id'][0] or False
if context.get('address_out_id', False):
return self.pool.get('res.partner.address').browse(cr, uid, context['address_out_id'], context).partner_id.property_stock_customer.id
property_out = self.pool.get('res.partner.address').browse(cr, uid, context['address_out_id'], context).partner_id.property_stock_customer
return property_out and property_out.id or False
return False
def _default_location_source(self, cr, uid, context={}):
@ -1428,14 +1442,6 @@ class stock_move(osv.osv):
default = default.copy()
return super(stock_move, self).copy(cr, uid, id, default, context)
def create(self, cr, user, vals, context=None):
# Check that the stock.move is in draft state at creation to force
# passing through button_confirm
if vals.get('state','draft') not in ('draft','done','waiting'):
logger = netsvc.Logger()
logger.notifyChannel("code", netsvc.LOG_WARNING, "All new stock.move must be in state draft at the creation !")
return super(stock_move, self).create(cr, user, vals, context)
def _auto_init(self, cursor, context):
res = super(stock_move, self)._auto_init(cursor, context)
cursor.execute('SELECT indexname \
@ -1567,8 +1573,9 @@ class stock_move(osv.osv):
def create_chained_picking(self, cr, uid, moves, context):
new_moves = []
res_obj = self.pool.get('res.company')
for picking, todo in self._chain_compute(cr, uid, moves, context).items():
ptype = self.pool.get('stock.location').picking_type_get(cr, uid, todo[0][0].location_dest_id, todo[0][1][0])
ptype = todo[0][1][5] and todo[0][1][5] or self.pool.get('stock.location').picking_type_get(cr, uid, todo[0][0].location_dest_id, todo[0][1][0])
pick_name = ''
if ptype == 'delivery':
pick_name = self.pool.get('ir.sequence').get(cr, uid, 'stock.picking.delivery')
@ -1579,17 +1586,20 @@ class stock_move(osv.osv):
'note': picking.note,
'move_type': picking.move_type,
'auto_picking': todo[0][1][1] == 'auto',
'stock_journal_id': todo[0][1][3],
'company_id': todo[0][1][4] or res_obj._company_default_get(cr, uid, 'stock.company', context),
'address_id': picking.address_id.id,
'invoice_state': 'none'
})
for move, (loc, auto, delay) in todo:
# Is it smart to copy ? May be it's better to recreate ?
for move, (loc, auto, delay, journal, company_id, ptype) in todo:
new_id = self.pool.get('stock.move').copy(cr, uid, move.id, {
'location_id': move.location_dest_id.id,
'location_dest_id': loc.id,
'date_moved': time.strftime('%Y-%m-%d'),
'picking_id': pickid,
'state': 'waiting',
'company_id': company_id or res_obj._company_default_get(cr, uid, 'stock.company', context) ,
'move_history_ids': [],
'date_planned': (datetime.strptime(move.date_planned, '%Y-%m-%d %H:%M:%S') + relativedelta(days=delay or 0)).strftime('%Y-%m-%d'),
'move_history_ids2': []}
@ -1675,6 +1685,33 @@ class stock_move(osv.osv):
wf_service.trg_write(uid, 'stock.picking', pick_id, cr)
return count
def setlast_tracking(self, cr, uid, ids, context=None):
new_move = []
update_val = {}
ir_sequence_obj = self.pool.get('ir.sequence')
tracking_obj = self.pool.get('stock.tracking')
tracking = False
tracking = context.get('tracking', False)
# import pdb; pdb.set_trace()
if tracking:
tracking_id = tracking_obj.search(cr, uid, ['name','=', tracking])
if prodlot_id:
update_val['prodlot_id'] = prodlot_id
else:
tracking_id = tracking_obj.create(cr, uid, {'name': tracking}, {'product_id': self.browse(cr, uid, ids)[0].product_id.id})
update_val['tracking_id'] = tracking_id
else:
last_track = [line.tracking_id for line in self.browse(cr, uid, ids)[0].picking_id.move_lines if line.tracking_id]
if not last_track:
track_ids= tracking_obj.search(cr, uid, [])
last_track = [track for track in tracking_obj.browse(cr, uid, track_ids)]
last_track.sort(key=lambda p: p.date, reverse=True)
last_track_id = last_track and last_track[0].id
update_val['tracking_id'] = last_track_id
self.write(cr, uid, ids, update_val)
return True
#
# Cancel move => cancel others move and pickings
#
@ -1822,10 +1859,12 @@ class stock_move(osv.osv):
for pick in picking_obj.browse(cr, uid, picking_ids):
if all(move.state == 'done' for move in pick.move_lines):
picking_obj.action_done(cr, uid, [pick.id])
wf_service = netsvc.LocalService("workflow")
for id in ids:
wf_service.trg_trigger(uid, 'stock.move', id, cr)
for pick in picking_obj.browse(cr, uid, picking_ids):
if len([move.state == 'done' for move in pick.move_lines]) == len(pick.move_lines):
wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_done', cr)
return True
def create_account_move(self, cr, uid, move,account_id,account_variation,amount, context=None):

View File

@ -3,6 +3,7 @@
<data>
<report auto="False" id="report_product_history" model="product.product" name="stock.product.history" string="Future Stock Forecast"/>
<report id="report_picking_list" model="stock.picking" name="stock.picking.list" string="Picking list" rml="stock/report/picking.rml"/>
<report id="report_packing_list" model="stock.picking" name="stock.packing.list" string="Packing list" rml="stock/report/packing.rml"/>
<report id="report_move_labels" model="stock.move" name="stock.move.label" string="Item Labels" xml="stock/report/lot_move_label.xml" xsl="stock/report/lot_move_label.xsl"/>
<report auto="False" id="report_location_overview" model="stock.location" name="lot.stock.overview" string="Location Overview" rml="stock/report/lot_overview.rml" groups="base.group_extended"/>
<report auto="False" id="report_lot_location" model="stock.location" name="lot.location" rml="stock/report/lot_location.rml" string="Lots by location"/>

View File

@ -313,6 +313,7 @@
<field name="product_qty" />
<field name="product_uom" string="UOM"/>
<field name="prodlot_id" groups="base.group_extended"/>
<field groups="base.group_extended" name="tracking_id"/>
<field name="product_packaging" domain="[('product_id','=',product_id)]" groups="base.group_extended"/>
<field name="picking_id"/>
<field name="location_id" />
@ -336,6 +337,7 @@
<field name="product_qty" />
<field name="product_uom" string="UOM"/>
<field name="prodlot_id" groups="base.group_extended"/>
<field groups="base.group_extended" name="tracking_id"/>
<field name="product_packaging" domain="[('product_id','=',product_id)]" groups="base.group_extended"/>
<field name="picking_id"/>
<field name="location_id" />
@ -420,6 +422,9 @@
<field name="chained_location_id"/>
<field name="chained_auto_packing"/>
<field name="chained_delay"/>
<field name="chained_journal_id"/>
<field name="chained_picking_type"/>
<field name="chained_company_id" widget="selection"/>
</group>
<group col="2" colspan="2">
<separator string="Localization" colspan="2"/>
@ -603,37 +608,43 @@
<field name="arch" type="xml">
<form string="Picking list">
<group colspan="4" col="6">
<field name="name" readonly="1"/>
<!-- <field name="address_id" context="{'contact_display' : 'partner'}" groups="base.group_extended"/>-->
<field name="origin"/>
<field name="backorder_id" groups="base.group_extended" readonly="1"/>
<field name="date"/>
<field name="min_date"/>
<field name="type"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<notebook colspan="4">
<page string="General Information">
<field colspan="4" name="move_lines" nolabel="1" widget="one2many_list" default_get="{'move_line':move_lines, 'address_out_id': address_id}">
<tree colors="grey:state in ('cancel')" string="Stock Moves">
<tree colors="grey:state in ('cancel')" string="Stock Moves" editable="top">
<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)"/>
<field name="product_uom" string="UOM"/>
<field name="picking_id"/>
<field name="prodlot_id" groups="base.group_extended"/>
<button
name="%(stock.track_line)d"
string="Split in production lots"
type="action" icon="terp-stock_effects-object-colorize"
states="draft,waiting,confirmed,assigned" />
<field groups="base.group_extended" name="tracking_id"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<button name="setlast_tracking" string="Set Last Tracking" type="object"
attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="date_planned"/>
<field name="date_expected" string="Date Expected"/>
<field name="state"/>
<button
name="%(stock.track_line)d"
string="Split in production lots"
type="action" icon="gtk-justify-fill"
states="draft,waiting,confirmed,assigned" />
<button name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
@ -662,10 +673,13 @@
domain="[('product_id','=?',product_id)]"
on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<field groups="base.group_extended" name="tracking_id"/>
<newline/>
<label/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill"/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"/>
<button name="%(move_scrap)d" string="Scrap Move Line" type="action" icon="gtk-justify-fill"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" />
<separator colspan="4" string="Move State"/>
<field name="state"/>
<group colspan="2">
@ -715,10 +729,9 @@
<separator orientation="vertical"/>
<filter icon="terp-accessories-archiver-minus" string="Back Order" domain="[('backorder_id', '&lt;&gt;', False)]" help="Has Back Order" />
<separator orientation="vertical"/>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="name"/>
<field name="address_id"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="8">
@ -761,19 +774,28 @@
<field name="backorder_id" groups="base.group_extended" readonly="1"/>
<field name="date" />
<field name="min_date"/>
<field name="type" invisible="1"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
<field name="type" invisible="1"/>
</group>
<notebook colspan="4">
<page string="General Information">
<field colspan="4" name="move_lines" nolabel="1" widget="one2many_list" default_get="{'move_line':move_lines, 'address_out_id': address_id}">
<tree colors="grey:state in ('cancel')" string="Stock Moves">
<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')" string="Stock Moves" editable="top">
<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)"/>
<field name="product_uom" string="UOM"/>
<field name="picking_id" />
<field name="prodlot_id" groups="base.group_extended"/>
<field groups="base.group_extended" name="tracking_id"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<button name="setlast_tracking" string="Set Last Tracking" type="object"
attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="date_planned"/>
@ -782,7 +804,7 @@
<button
name="%(stock.track_line)d"
string="Split in production lots"
type="action" icon="gtk-justify-fill"
type="action" icon="terp-stock_effects-object-colorize"
groups="base.group_extended"
states="draft,waiting,confirmed,assigned" />
<button name="%(stock.move_scrap)d"
@ -806,11 +828,19 @@
<field name="date_planned"/>
<field name="date_expected" string="Date Expected"/>
<field groups="base.group_extended" name="product_packaging" domain="[('product_id','=',product_id)]"/>
<newline/>
<field name="prodlot_id" groups="base.group_extended"
context="{'location_id':location_id, 'product_id':product_id}"
domain="[('product_id','=?',product_id)]"
on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<field groups="base.group_extended" name="tracking_id"/>
<label/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"/>
<label/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<separator colspan="4" string="Move State"/>
<field name="state"/>
<group colspan="2">
@ -863,6 +893,7 @@
<field name="name"/>
<field name="address_id"/>
<field name="origin"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="10">
@ -922,7 +953,6 @@
<field name="invoice_state"/>
<field name="state"/>
<button name="%(action_partial_picking)d" states="assigned" string="Validate" type="action" icon="gtk-go-forward" help="Validate Picking"/>
<button name="button_cancel" states="assigned,confirmed,draft" string="Cancel" icon="gtk-cancel" help="Cancel" confirm="This operation will cancel the picking. Do you want to continue?"/>
</tree>
</field>
</record>
@ -940,33 +970,38 @@
<field name="backorder_id" readonly="1"/>
<field name="origin" readonly="1"/>
<field name="type" invisible="1"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<notebook colspan="4">
<page string="General Information">
<field colspan="4" name="move_lines" nolabel="1" widget="one2many_list" default_get="{'move_line':move_lines, 'address_out_id': address_id}">
<tree colors="grey:state in ('cancel')" string="Stock Moves">
<field name="name" string="Move Name"/>
<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')" string="Stock Moves" editable="top">
<field name="product_id"/>
<field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
<field name="product_uom" string="UOM"/>
<field name="picking_id"/>
<button name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" />
<field name="prodlot_id" groups="base.group_extended"/>
<button name="%(track_line)d" string="Split in production lots" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('prodlot_id','&lt;&gt;',False)]}"
states="assigned,confirmed,done"
groups="base.group_extended"/>
<field name="tracking_id" groups="base.group_extended"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<button name="setlast_tracking" string="Set Last Tracking" type="object"
attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="date_planned"/>
<field name="date_expected" string="Date Expected"/>
<field name="state"/>
<button
name="%(stock.track_line)d"
string="Split in production lots"
type="action" icon="gtk-justify-fill"
states="draft,waiting,confirmed,assigned" />
<button
name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
icon="gtk-convert"
states="draft,waiting,confirmed,assigned" />
<button name="%(action_partial_move)d" string="Partial" type="action" states="confirmed,assigned" icon="gtk-justify-fill"/>
<button name="action_done" states="confirmed,assigned" string="Done" type="object" icon="gtk-jump-to"/>
</tree>
<form string="Stock Moves">
<notebook colspan="4">
@ -984,13 +1019,19 @@
<field name="date_planned"/>
<field name="date_expected" string="Date Expected"/>
<field groups="base.group_extended" name="product_packaging" domain="[('product_id','=',product_id)]"/>
<newline/>
<field name="prodlot_id" groups="base.group_extended"
context="{'location_id':location_id, 'product_id':product_id}"
domain="[('product_id','=?',product_id)]"
on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<field groups="base.group_extended" name="tracking_id"/>
<label/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill"/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"/>
<label/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<label/>
<separator colspan="4" string="Move State"/>
<field name="state"/>
<group colspan="2">
@ -1043,6 +1084,7 @@
<field name="name"/>
<field name="address_id" />
<field name="origin"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
</group>
<newline/>
@ -1057,13 +1099,13 @@
</record>
<record id="action_picking_tree" model="ir.actions.act_window">
<field name="name">Outgoing Products</field>
<field name="name">Outgoing Packings</field>
<field name="res_model">stock.picking</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','out')]</field>
<field name="context">{'contact_display': 'partner'}</field>
<field name="context">{'contact_display': 'partner', 'search_default_available': 1}</field>
<field name="search_view_id" ref="view_picking_out_search"/>
</record>
<record id="action_picking_tree_out_view1_waiting" model="ir.actions.act_window.view">
@ -1120,24 +1162,32 @@
<field name="type"/>
<field name="min_date" readonly="1"/>
<field name="invoice_state" string="Invoice Control"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<notebook colspan="4">
<page string="General Information">
<field colspan="4" name="move_lines" nolabel="1" widget="one2many_list" default_get="{'move_line':move_lines, 'address_in_id': address_id}">
<tree colors="grey:state in ('cancel')" string="Stock Moves">
<field name="product_id"/>
<field name="product_qty"/>
<field name="product_uom" string="Product Unit of Measure"/>
<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')" string="Stock Moves" editable="top">
<field name="product_id" readonly="1"/>
<field name="product_qty" readonly="1"/>
<field name="product_uom" string="UOM" readonly="1"/>
<field name="location_dest_id"/>
<field name="prodlot_id" groups="base.group_extended"/>
<field name="state"/>
<button
<button
name="%(stock.track_line)d"
string="Split in production lots"
type="action" icon="gtk-justify-fill"
type="action" icon="terp-stock_effects-object-colorize"
states="draft,waiting,confirmed,assigned" />
<button name="%(stock.move_scrap)d"
<field name="tracking_id" groups="base.group_extended"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<button name="setlast_tracking" string="Set Last Tracking" type="object"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<field name="state"/>
<button name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" />
@ -1151,23 +1201,21 @@
<field colspan="4" context="location=location_id" name="product_id" on_change="onchange_product_id(product_id, location_id, location_dest_id, parent.address_id)"/>
<field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
<field name="product_uom"/>
<field groups="product.group_uos" name="product_uos" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
<field groups="product.group_uos" name="product_uos_qty"/>
<field colspan="4" invisible="1" name="name" />
<field groups="base.group_extended" name="date_planned"/>
<field name="date_expected" groups="base.group_extended" string="Date Expected"/>
<field name="date_expected" groups="base.group_extended" string="Date Expected"/>
<field groups="product.group_uos" name="product_uos" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
<newline/>
<newline/>
<field groups="base.group_extended" name="product_packaging" domain="[('product_id','=',product_id)]"/>
<newline/>
<field name="prodlot_id" groups="base.group_extended"
context="{'location_id':location_id, 'product_id':product_id}"
domain="[('product_id','=?',product_id)]"
on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<field name="prodlot_id" groups="base.group_extended" context="{'location_id':location_id, 'product_id':product_id}" domain="[('product_id','=?',product_id)]" on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<field groups="base.group_extended" name="tracking_id"/>
<newline/>
<label/>
<button groups="base.group_extended" name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill"/>
<button groups="base.group_extended" name="267" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"/>
<label/>
<button name="275" string="Split Stock Moves" type="action" icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}" states="draft,assigned,confirmed,done"/>
<separator colspan="4" string="Move State"/>
<field name="state"/>
<group colspan="2">
@ -1215,6 +1263,7 @@
<field name="name"/>
<field name="address_id"/>
<field name="origin"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" widget="selection" groups="base.group_multi_company" />
</group>
<newline/>
@ -1272,6 +1321,7 @@
<separator orientation="vertical"/>
<field name="name"/>
<field name="origin"/>
<field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
<field name="company_id" widget="selection"/>
</group>
<newline/>
@ -1304,7 +1354,7 @@
<field name="type">tree</field>
<field eval="6" name="priority"/>
<field name="arch" type="xml">
<tree colors="grey:state in ('cancel');red:(state not in ('cancel','done')) and date_planned > current_date" string="Moves">
<tree colors="grey:state in ('cancel');red:(state not in ('cancel','done')) and date_planned > current_date" string="Moves" editable="top">
<field name="picking_id" select="1"/>
<field name="product_id"/>
<field name="product_qty" on_change="onchange_quantity(product_id, product_qty, product_uom, product_uos)"/>
@ -1318,11 +1368,20 @@
icon="gtk-justify-fill" attrs="{'invisible': [('prodlot_id','&lt;&gt;',False)]}"
states="assigned,confirmed"
groups="base.group_extended"/>
<field groups="base.group_extended" name="tracking_id"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<button name="setlast_tracking" string="Set Last Tracking" type="object"
icon="terp-stock_effects-object-colorize"
attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="date_planned"/>
<field name="date_expected"/>
<field name="state"/>
<button name="action_done" states="confirmed,assigned" string="Done" type="object" icon="gtk-jump-to"/>
</tree>
</field>
</record>
@ -1372,7 +1431,15 @@
context="{'location_id':location_id, 'product_id':product_id}"
domain="[('product_id','=?',product_id)]"
on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill" colspan="2" />
<newline/>
<group colspan="4" col="4">
<label/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize" colspan="2" />
<label/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
</group>
</group>
</page>
</notebook>
@ -1455,15 +1522,24 @@
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" />
<field name="prodlot_id" groups="base.group_extended"/>
<button name="%(track_line)d" string="Split" type="action"
icon="gtk-justify-fill" attrs="{'invisible': [('prodlot_id','&lt;&gt;',False)]}"
<button name="%(track_line)d" string="Split in production lots" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('prodlot_id','&lt;&gt;',False)]}"
states="assigned,confirmed,done"
context="{'default_use_exist': picking_id.type=='in'}"
groups="base.group_extended"/>
<field name="tracking_id" groups="base.group_extended"/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<button name="setlast_tracking" string="Set Last Tracking" type="object"
attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
<field name="date_planned"/>
<field name="backorder_id" groups="base.group_extended"/>
<field name="state"/>
<button name="%(action_partial_move)d" string="Partial" type="action" states="assigned" icon="gtk-justify-fill"/>
<button name="action_done" states="assigned" string="Done" type="object" icon="gtk-jump-to"/>
<button name="action_done" states="confirmed,assigned" string="Done" type="object" icon="gtk-jump-to"/>
</tree>
</field>
</record>
@ -1493,18 +1569,23 @@
<field name="priority"/>
<field name="address_id" context="{'contact_display':'partner'}"/>
<newline/>
<field name="picking_id"/>
<newline/>
<field name="prodlot_id" groups="base.group_extended"
context="{'location_id':location_id, 'product_id':product_id}"
domain="[('product_id','=?',product_id)]"
on_change="onchange_lot_id(prodlot_id,product_qty, location_id, product_id)"/>
<field name="tracking_id"/>
<field groups="base.group_extended" name="tracking_id"/>
<newline/>
<field name="picking_id"/>
<group col="2" colspan="2">
<label/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="gtk-justify-fill"/>
</group>
<label/>
<button name="%(split_into)d" string="Split Stock Moves" type="action"
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','&lt;&gt;',False)]}"
states="draft,assigned,confirmed,done"/>
<label/>
<button name="%(track_line)d" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"/>
</group>
<separator colspan="4" string="Move State"/>
<field name="state"/>
<group col="5" colspan="2">
@ -1549,6 +1630,10 @@
<separator orientation="vertical"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_planned'}" />
</group>
<newline/>
<group expand="0" string="Extended options..." groups="base.group_extended">
<field name="tracking_id" context="{'tracking': self}" domain="[]" />
</group>
</search>
</field>
</record>
@ -1792,5 +1877,52 @@
<menuitem action="action_reception_picking_move" id="menu_action_pdct_in" parent="menu_stock_products_moves" sequence="1"/>
<menuitem action="action_out_picking_move" id="menu_action_pdct_out" parent="menu_stock_products_moves" sequence="2"/>
<record id="view_stock_journal_filter" model="ir.ui.view">
<field name="name">stock.journal.filter</field>
<field name="model">stock.journal</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Stock Journal">
<field name="name"/>
<field name="user_id"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_stock_journal_tree">
<field name="name">Stock Journals</field>
<field name="model">stock.journal</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Stock Journal">
<field name="name"/>
<field name="user_id"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_stock_journal_form">
<field name="name">Stock Journals</field>
<field name="model">stock.journal</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Stock Journal">
<field name="name"/>
<field name="user_id"/>
</form>
</field>
</record>
<record id="action_stock_journal_form" model="ir.actions.act_window">
<field name="name">Stock Journals</field>
<field name="res_model">stock.journal</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
</record>
<menuitem
action="action_stock_journal_form"
id="menu_action_stock_journal_form"
groups="base.group_extended"
parent="menu_stock_configuration" />
</data>
</openerp>

View File

@ -21,6 +21,7 @@
import stock_traceability
import stock_move
import stock_splitinto
import stock_partial_picking
import stock_partial_move
import stock_replacement

View File

@ -179,6 +179,8 @@ class split_in_production_lot(osv.osv_memory):
move = self.pool.get('stock.move').browse(cr, uid, context['active_id'], context=context)
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 'qty' in fields:
res.update({'qty': move.product_qty})
return res
@ -186,6 +188,7 @@ class split_in_production_lot(osv.osv_memory):
_columns = {
'qty': fields.integer('Quantity'),
'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
'product_uom': fields.many2one('product.uom', 'Product UOM'),
'line_ids': fields.one2many('stock.move.split.lines', 'lot_id', 'Lots Number'),
'line_exist_ids': fields.one2many('stock.move.split.lines.exist', 'lot_id', 'Lots Existing Numbers'),
'use_exist' : fields.boolean('Use Exist'),
@ -240,15 +243,10 @@ class split_in_production_lot(osv.osv_memory):
default_val = {
'product_qty': quantity,
'product_uos_qty': uos_qty,
'state': 'draft'
'state': move.state
}
if quantity_rest > 0:
current_move = move_obj.copy(cr, uid, move.id, default_val)
move_obj.action_confirm(cr, uid, [current_move])
if move.state=='assigned':
move_obj.force_assign(cr, uid, [current_move])
elif move.state<>'confirmed':
move_obj.write(cr, uid, [current_move], {'state': move.state})
new_move.append(current_move)
if quantity_rest == 0:
current_move = move.id
@ -262,7 +260,7 @@ class split_in_production_lot(osv.osv_memory):
prodlot_id = prodlot_obj.create(cr, uid, {'name': line.name},
# 'prefix' : line.name},
{'product_id': move.product_id.id})
move_obj.write(cr, uid, [current_move], {'prodlot_id': prodlot_id})
move_obj.write(cr, uid, [current_move], {'prodlot_id': prodlot_id, 'state':move.state})
prodlot = prodlot_obj.browse(cr, uid, prodlot_id)
# ref = '%d' % (move.id)
# if prodlot.ref:
@ -273,6 +271,7 @@ class split_in_production_lot(osv.osv_memory):
if quantity_rest > 0:
update_val['product_qty'] = quantity_rest
update_val['product_uos_qty'] = uos_qty_rest
update_val['state'] = move.state
move_obj.write(cr, uid, [move.id], update_val)
return new_move
split_in_production_lot()

View File

@ -103,11 +103,21 @@
<field name="model">stock.move.split</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Split in lots">
<field name="product_id" colspan="4" readonly="1"/>
<newline/>
<field name="use_exist"/>
<field name="qty" readonly="1"/>
<form string="Split in lots">
<field name="product_id" colspan="4" readonly="1"/>
<newline/>
<group colspan="4" col="4">
<group colspan="1" col="2">
<field name="use_exist"/>
</group>
<group colspan="1" col="2">
<field name="qty" readonly="1"/>
</group>
<group colspan="1" col="2">
<field name="product_uom" readonly="1"/>
</group>
</group>
<group colspan="4" attrs="{'invisible':[('use_exist','=',True)]}">
<field name="line_ids" colspan="4" nolabel="1">
<tree string="Lots Number" editable="top">

View File

@ -27,19 +27,22 @@ import pooler
import time
class stock_partial_move(osv.osv_memory):
_name = "stock.partial.move"
_description = "Partial Move"
_name = "stock.partial.move"
_description = "Partial Move"
_columns = {
'date': fields.datetime('Date', required=True),
'partner_id': fields.many2one('res.partner',string="Partner"),
'type': fields.char("Type", size=3),
'address_id': fields.many2one('res.partner.address', 'Delivery Address', help="Address where goods are to be delivered"),
}
def view_init(self, cr, uid, fields_list, context=None):
res = super(stock_partial_move, self).view_init(cr, uid, fields_list, context=context)
move_obj = self.pool.get('stock.move')
move_obj = self.pool.get('stock.move')
if not context:
context={}
moveids = []
for m in move_obj.browse(cr, uid, context.get('active_ids', [])):
for m in move_obj.browse(cr, uid, context.get('active_ids', [])):
if m.state in ('done', 'cancel'):
continue
if 'move%s_product_id'%(m.id) not in self._columns:
@ -54,53 +57,58 @@ class stock_partial_move(osv.osv_memory):
self._columns['move%s_product_price'%(m.id)] = fields.float("Price")
if 'move%s_product_currency'%(m.id) not in self._columns:
self._columns['move%s_product_currency'%(m.id)] = fields.many2one('res.currency',string="Currency")
return res
return res
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False,submenu=False):
result = super(stock_partial_move, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar,submenu)
result = super(stock_partial_move, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar,submenu)
move_obj = self.pool.get('stock.move')
move_ids = context.get('active_ids', False)
move_ids = context.get('active_ids', False)
move_ids = move_obj.search(cr, uid, [('id','in',move_ids)])
_moves_arch_lst = """<form string="Deliver Products">
<separator colspan="4" string="Delivery Information"/>
<field name="date" colspan="4" />
<group colspan="4" attrs="{'invisible':[('type','=','in')]}">
<field name="partner_id" attrs="{'required':[('type','!=','in')]}" />
<field name="address_id" attrs="{'required':[('type','!=','in')]}"/>
<field name="type" invisible="1"/>
<newline/>
</group>
<separator colspan="4" string="Move Detail"/>
"""
"""
_moves_fields = result['fields']
if move_ids and view_type in ['form']:
for m in move_obj.browse(cr, uid, move_ids, context):
if move_ids and view_type in ['form']:
for m in move_obj.browse(cr, uid, move_ids, context):
if m.state in ('done', 'cancel'):
continue
_moves_fields.update({
'move%s_product_id'%(m.id) : {
'string': _('Product'),
'type' : 'many2one',
'relation': 'product.product',
'required' : True,
'readonly' : True,
'type' : 'many2one',
'relation': 'product.product',
'required' : True,
'readonly' : True,
},
'move%s_product_qty'%(m.id) : {
'string': _('Quantity'),
'type' : 'float',
'required': True,
'required': True,
},
'move%s_product_uom'%(m.id) : {
'string': _('Product UOM'),
'type' : 'many2one',
'relation': 'product.uom',
'required' : True,
'readonly' : True,
'type' : 'many2one',
'relation': 'product.uom',
'required' : True,
'readonly' : True,
}
})
})
_moves_arch_lst += """
<group colspan="4" col="10">
<field name="move%s_product_id" nolabel="1"/>
<field name="move%s_product_qty" string="Qty" />
<field name="move%s_product_uom" nolabel="1" />
"""%(m.id, m.id, m.id)
if (m.picking_id.type == 'in') and (m.product_id.cost_method == 'average'):
if (m.picking_id.type == 'in') and (m.product_id.cost_method == 'average'):
_moves_fields.update({
'move%s_product_price'%(m.id) : {
'string': _('Price'),
@ -108,9 +116,9 @@ class stock_partial_move(osv.osv_memory):
},
'move%s_product_currency'%(m.id): {
'string': _('Currency'),
'type' : 'float',
'type' : 'many2one',
'relation': 'res.currency',
'type' : 'float',
'type' : 'many2one',
'relation': 'res.currency',
}
})
_moves_arch_lst += """
@ -131,7 +139,7 @@ class stock_partial_move(osv.osv_memory):
</group>
</form>"""
result['arch'] = _moves_arch_lst
result['fields'] = _moves_fields
result['fields'] = _moves_fields
return result
def default_get(self, cr, uid, fields, context=None):
@ -139,23 +147,40 @@ class stock_partial_move(osv.osv_memory):
@param self: The object pointer.
@param cr: A database cursor
@param uid: ID of the user currently logged in
@param fields: List of fields for which we want default values
@param context: A standard dictionary
@return: A dictionary which of fields with values.
"""
@param fields: List of fields for which we want default values
@param context: A standard dictionary
@return: A dictionary which of fields with values.
"""
res = super(stock_partial_move, self).default_get(cr, uid, fields, context=context)
move_obj = self.pool.get('stock.move')
move_obj = self.pool.get('stock.move')
if not context:
context={}
moveids = []
moveids = address_delivery = address_default = []
if 'date' in fields:
res.update({'date': time.strftime('%Y-%m-%d %H:%M:%S')})
move_ids = context.get('active_ids', [])
move_ids = move_obj.search(cr, uid, [('id','in',move_ids)])
for m in move_obj.browse(cr, uid, context.get('active_ids', [])):
for m in move_obj.browse(cr, uid, context.get('active_ids', [])):
if m.state in ('done', 'cancel'):
continue
res['type'] = m.picking_id and m.picking_id.type or ''
address_ids = list(set([(pick.address_id and pick.address_id.id, pick.address_id and pick.address_id.partner_id and pick.address_id.partner_id.id) for pick in move_obj.browse(cr, uid, move_ids)]))
address_ids1 = list(set([(pick.address_id and pick.address_id.id, pick.address_id and pick.address_id.partner_id and pick.address_id.partner_id.id) for pick in move_obj.browse(cr, uid, move_ids) if pick.address_id]))
if len(address_ids1) == 1:
if m.picking_id and m.picking_id.type=='out':
res['address_id'] = address_ids[0][0] or False
res['partner_id'] = address_ids[0][1] or False
if m.picking_id and m.picking_id.type=='in':
res['partner_id'] = m.company_id.partner_id.id or False
if m.company_id.partner_id:
address_default = [add.id for add in m.company_id.partner_id.address if add.type=='default']
address_delivery = [add.id for add in m.company_id.partner_id.address if add.type=='delivery']
if len(address_delivery):
res['address_id'] = address_delivery and address_delivery[0] or False
else:
res['address_id'] = address_default and address_default[0] or False
if 'move%s_product_id'%(m.id) in fields:
res['move%s_product_id'%(m.id)] = m.product_id.id
if 'move%s_product_qty'%(m.id) in fields:
@ -171,7 +196,7 @@ class stock_partial_move(osv.osv_memory):
currency = False
if hasattr(m.picking_id, 'sale_id') and m.picking_id.sale_id:
currency = m.picking_id.sale_id.pricelist_id.currency_id.id
if 'move%s_product_price'%(m.id) in fields:
res['move%s_product_price'%(m.id)] = price
if 'move%s_product_currency'%(m.id) in fields:
@ -185,37 +210,38 @@ class stock_partial_move(osv.osv_memory):
currency = False
if hasattr(m.picking_id, 'purchase_id') and m.picking_id.purchase_id:
currency = m.picking_id.purchase_id.pricelist_id.currency_id.id
if 'move%s_product_price'%(m.id) in fields:
res['move%s_product_price'%(m.id)] = price
if 'move%s_product_currency'%(m.id) in fields:
res['move%s_product_currency'%(m.id)] = currency
print res
return res
return res
def do_partial(self, cr, uid, ids, context):
""" Makes partial moves and pickings done.
@param self: The object pointer.
@param cr: A database cursor
@param uid: ID of the user currently logged in
@param fields: List of fields for which we want default values
@param context: A standard dictionary
@return: A dictionary which of fields with values.
"""
@param fields: List of fields for which we want default values
@param context: A standard dictionary
@return: A dictionary which of fields with values.
"""
rec_id = context and context.get('active_id', False)
tracking_lot = context.get('tracking_lot', False)
if tracking_lot:
tracking = self.pool.get('stock.tracking')
tracking_lot = tracking.get_create_tracking_lot(cr, uid,[rec_id], tracking_lot)
context ['tracking_lot'] = tracking_lot
move_obj = self.pool.get('stock.move')
tracking_lot = tracking.get_create_tracking_lot(cr, uid,[rec_id], tracking_lot)
context ['tracking_lot'] = tracking_lot
move_obj = self.pool.get('stock.move')
move_ids = context.get('active_ids', False)
partial = self.browse(cr, uid, ids[0], context)
partial_datas = {
'delivery_date' : partial.date
'partner_id' : partial.partner_id and partial.partner_id.id or False,
'address_id' : partial.address_id and partial.address_id.id or False,
'delivery_date' : partial.date
}
for m in move_obj.browse(cr, uid, move_ids):
for m in move_obj.browse(cr, uid, move_ids):
if m.state in ('done', 'cancel'):
continue
partial_datas['move%s'%(m.id)] = {
@ -224,15 +250,15 @@ class stock_partial_move(osv.osv_memory):
'product_uom' : getattr(partial, 'move%s_product_uom'%(m.id)).id
}
if (m.picking_id.type == 'in') and (m.product_id.cost_method == 'average'):
partial_datas['move%s'%(m.id)].update({
if (m.picking_id.type == 'in') and (m.product_id.cost_method == 'average'):
partial_datas['move%s'%(m.id)].update({
'product_price' : getattr(partial, 'move%s_product_price'%(m.id)),
'product_currency': getattr(partial, 'move%s_product_currency'%(m.id)).id
})
})
res = move_obj.do_partial(cr, uid, move_ids, partial_datas, context=context)
return {}
stock_partial_move()
stock_partial_move()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

Some files were not shown because too many files have changed in this diff Show More