merge 10.0 to master

develop
Andreas Brückl 2016-11-08 07:42:44 +01:00
commit 41aaf710fe
136 changed files with 723 additions and 6846 deletions

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/INSTANCE/setup/lib/cli.py"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:INSTANCE/setup/lib/cli.py}"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="${env_var:CAM_USER} update cam_custom"/>
<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="INSTANCE"/>
<stringAttribute key="process_factory_id" value="org.python.pydev.debug.processfactory.PyProcessFactory"/>
</launchConfiguration>

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/INSTANCE/ext/odoo/odoo-dev.py"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:INSTANCE/ext/odoo/odoo-dev.py}"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-c dev/odoo-server-dev-${env_var:CAM_USER}.conf --db-filter=&quot;^INSTANCE.*&quot;"/>
<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="INSTANCE"/>
<stringAttribute key="process_factory_id" value="org.python.pydev.debug.processfactory.PyProcessFactory"/>
</launchConfiguration>

View File

@ -1,15 +0,0 @@
[options]
xmlrpc_port = 8080
; This is the password that allows database operations:
; admin_passwd = admin
db_host = False
db_port = 5432
db_user = False
db_password = False
addons_path = ext/odoo/addons,ext/custom-addons,dmi/run1
timezone = Europe/Brussels
#dbfilter_test = ['.*',]
show_debug = 1

View File

@ -1,15 +0,0 @@
[options]
xmlrpc_port = 8080
; This is the password that allows database operations:
; admin_passwd = admin
db_host = False
db_port = 5432
db_user = False
db_password = False
addons_path = ext/odoo/addons,ext/custom-addons,dmi/run1
timezone = Europe/Brussels
#dbfilter_test = ['.*',]
show_debug = 1

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,146 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>).
#
# 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 openerp import fields, models
from openerp import api
from openerp.tools.translate import _
from openerp import SUPERUSER_ID
from openerp import tools
DISABLED_MENUS = [
]
class ir_ui_menu(models.Model):
_inherit = 'ir.ui.menu'
@tools.ormcache(skiparg=2)
def get_disabled_menu_ids(self, cr, uid, context=None):
data_obj = self.pool.get('ir.model.data')
menu_ids = []
for menu in DISABLED_MENUS:
module,xml_id = menu.split('.')
menu = data_obj.get_object(cr, uid, module, xml_id)
if menu:
menu_ids.append(menu.id)
return menu_ids
def _filter_visible_menus(self, cr, uid, ids, context=None):
if uid != 1:
disabled_ids = self.get_disabled_menu_ids(cr, uid)
ids = [id for id in ids if id not in disabled_ids]
ids = super(ir_ui_menu, self)._filter_visible_menus(cr, uid, ids, context)
return ids
class res_partner(models.Model):
_inherit = 'res.partner'
@api.model
def fields_view_get_address(self, arch):
""" verhindert das Überschreiben von address_format """
return arch
class mail_notification(models.Model):
_inherit = 'mail.notification'
# override original function
def get_signature_footer(self, cr, uid, user_id, res_model=None, res_id=None, context=None, user_signature=True):
""" Format a standard footer for notification emails (such as pushed messages
notification or invite emails).
Format:
<p>--<br />
Administrator
</p>
<div>
<small>Sent from <a ...>Your Company</a> using <a ...>OpenERP</a>.</small>
</div>
"""
footer = ""
if not user_id:
return footer
# add user signature
user = self.pool.get("res.users").browse(cr, SUPERUSER_ID, [user_id], context=context)[0]
if user_signature:
if user.signature:
signature = user.signature
else:
signature = "--<br />%s" % user.name
footer = tools.append_content_to_html(footer, signature, plaintext=False)
# add company signature
# if user.company_id.website:
# website_url = ('http://%s' % user.company_id.website) if not user.company_id.website.lower().startswith(('http:', 'https:')) \
# else user.company_id.website
# company = "<a style='color:inherit' href='%s'>%s</a>" % (website_url, user.company_id.name)
# else:
# company = user.company_id.name
# sent_by = _('Sent by %(company)s using %(odoo)s')
#
# signature_company = '<br /><small>%s</small>' % (sent_by % {
# 'company': company,
# 'odoo': "<a style='color:inherit' href='https://www.odoo.com/'>Odoo</a>"
# })
# footer = tools.append_content_to_html(footer, signature_company, plaintext=False, container_tag='div')
return footer
# class product_product(osv.osv):
# _inherit = 'product.product'
#
# def name_get(self, cr, user, ids, context=None):
# if context is None:
# context = {}
# c = context.copy()
# c.update({'display_default_code': False})
# return super(product_product, self).name_get(cr, user, ids, context=c)
class sale_order_line(models.Model):
_inherit = 'sale.order.line'
@api.onchange('name')
def onchange_name(self):
if self.name != False and self.product_id.id == False:
ir_values = self.pool.get('ir.values')
company = self.env['res.company'].search([], limit=1)
taxes_id = ir_values.get_default(self._cr, self._uid, 'product.template', 'taxes_id', company_id=company.id)
at = self.env['account.tax'].search([('id','=',isinstance(taxes_id, list) and taxes_id[0] or taxes_id)])
self.tax_id = at
class product_product(models.Model):
_inherit = 'product.product'
def name_get(self, cr, user, ids, context=None):
""" beim Angebot die Nummer nicht in das Feld Bezeichnung übernehmen"""
if context is None:
context = {}
c = context.copy()
if c.get('partner_id', False):
if not c.get('quantity', False):
c.update({'display_default_code': False})
return super(product_product, self).name_get(cr, user, ids, context=c)
class res_country(models.Model):
_inherit = 'res.country'
active = fields.Boolean('Aktiv', default=True)

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
</data>
</openerp>

View File

@ -1,111 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="base.action_partner_form" model="ir.actions.act_window">
<field name="view_mode">tree,kanban,form</field>
</record>
<record id="base.action_partner_form_view1" model="ir.actions.act_window.view">
<field eval="10" name="sequence" />
</record>
<record id="partner_section_form" model="ir.ui.view">
<field name="name">partner_section_form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<xpath expr="//div[@class='address_format'][1]" position="replace">
<div class="address_format">
<field name="zip" placeholder="PLZ" style="width: 15%%"/>
<field name="city" placeholder="Stadt" style="width: 84%%"/>
<field name="state_id" invisible="1"/>
</div>
</xpath>
<xpath expr="//form[@string='Contact']//div[@class='address_format']" position="replace">
<div class="address_format">
<field name="zip" placeholder="PLZ" style="width: 15%%"/>
<field name="city" placeholder="Stadt" style="width: 84%%"/>
<field name="state_id" invisible="1"/>
</div>
</xpath>
</field>
</record>
<!-- Hide product variants -->
<record id="product_template_variant_kanban" model="ir.ui.view">
<field name="name">product_template_variant_kanban</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_kanban_view"/>
<field name="arch" type="xml">
<a name="%(product.product_variant_action)d" position="replace"/>
</field>
</record>
<record id="product_template_custom_tree" model="ir.ui.view">
<field name="name">product_template_custom_tree</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_tree_view"/>
<field name="arch" type="xml">
<field name="name" position="before">
<field name="default_code"/>
</field>
<field name="name" position="after">
<field name="list_price"/>
</field>
<!-- <field name="state" position="replace"/> -->
</field>
</record>
<record id="product.product_template_action" model="ir.actions.act_window">
<field name="view_mode">tree,form,kanban</field>
<field name="view_id"></field>
</record>
<record id="product_supplierinfo_form_view" model="ir.ui.view">
<field name="name">product.supplierinfo.form.view</field>
<field name="model">product.supplierinfo</field>
<field name="inherit_id" ref="product.product_supplierinfo_form_view"/>
<field name="arch" type="xml">
<field name="product_code" position="replace">
<field name="product_code" invisible="1"/>
</field>
</field>
</record>
<!-- documents menu -->
<menuitem
name="Documents"
id="menu_document_main"
parent="knowledge.menu_document"
groups="base.group_document_user"
sequence="0"
/>
<record model="ir.actions.act_window" id="action_document_files">
<field name="name">Dokumente</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">ir.attachment</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a new document.
</p><p>
The Documents repository gives you access to all attachments, such
as mails, project documents, invoices etc.
</p>
</field>
</record>
<menuitem
name="Documents"
action="action_document_files"
id="menu_document_files"
parent="menu_document_main"
sequence="0"
/>
</data>
</openerp>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

View File

@ -1,11 +0,0 @@
<openerp>
<data>
<template id="custom_header" inherit_id="web.layout" name="Custom Header">
<xpath expr="//link[@rel='shortcut icon']" position="replace">
<link rel="shortcut icon" href="/cam_custom/static/src/img/favicon.ico" type="image/x-icon"/>
</xpath>
</template>
</data>
</openerp>

View File

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 cam_customer_pricelist
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,39 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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': 'Camadeus Customer Pricelist',
'category': 'Custom',
'version': '1.0',
'description': """Prices per user basis""",
'author': 'Camadeus GmbH',
'website': 'http://www.camadeus.at',
'depends': ['product'],
'data': [
'cam_customer_pricelist_view.xml',
'cam_customer_pricelist_data.xml',
'security/ir.model.access.csv',
],
'installable': True,
'auto_install': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,256 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 openerp.osv import fields, osv
from openerp.tools.translate import _
import openerp.addons.decimal_precision as dp
import datetime
import time
class product_pricelist_item(osv.osv):
_inherit = "product.pricelist.item"
def _price_field_get(self, cr, uid, context=None):
pt = self.pool.get('product.price.type')
ids = pt.search(cr, uid, [], context=context)
result = []
for line in pt.browse(cr, uid, ids, context=context):
result.append((line.id, line.name))
result.append((-1, _('Other Pricelist')))
result.append((-2, _('Supplier Prices on the product form')))
result.append((-3, _('Kundenbezogener Preis')))
return result
_columns = {
'base': fields.selection(_price_field_get, 'Based on', required=True, size=-1, help="Base price for computation."),
}
class product_pricelist_customer(osv.osv):
_name = "product.pricelist.customer"
_inherit = ['mail.thread']
_columns = {
'partner_id': fields.many2one('res.partner', 'Kunde', domain="[('customer','=',True)]", required=True),
'product_id': fields.many2one('product.product', 'Produkt', required=True),
'unit_price': fields.float('Preis pro Einheit', digits_compute=dp.get_precision('Product Price'), track_visibility='onchange'),
'min_quantity': fields.integer('Mindestbestellmenge', track_visibility='onchange'),
'date_start': fields.date('Begindatum', track_visibility='onchange'),
'date_end': fields.date('Enddatum', track_visibility='onchange'),
}
class product_pricelist(osv.osv):
_inherit = "product.pricelist"
def _price_rule_get_multi(self, cr, uid, pricelist, products_by_qty_by_partner, context=None):
context = context or {}
date = context.get('date') or time.strftime('%Y-%m-%d')
products = map(lambda x: x[0], products_by_qty_by_partner)
currency_obj = self.pool.get('res.currency')
product_obj = self.pool.get('product.template')
product_uom_obj = self.pool.get('product.uom')
price_type_obj = self.pool.get('product.price.type')
if not products:
return {}
version = False
for v in pricelist.version_id:
if ((v.date_start is False) or (v.date_start <= date)) and ((v.date_end is False) or (v.date_end >= date)):
version = v
break
if not version:
raise osv.except_osv(_('Warning!'), _("At least one pricelist has no active version !\nPlease create or activate one."))
categ_ids = {}
for p in products:
categ = p.categ_id
while categ:
categ_ids[categ.id] = True
categ = categ.parent_id
categ_ids = categ_ids.keys()
is_product_template = products[0]._name == "product.template"
if is_product_template:
prod_tmpl_ids = [tmpl.id for tmpl in products]
prod_ids = [product.id for product in tmpl.product_variant_ids for tmpl in products]
else:
prod_ids = [product.id for product in products]
prod_tmpl_ids = [product.product_tmpl_id.id for product in products]
# Load all rules
cr.execute(
'SELECT i.id '
'FROM product_pricelist_item AS i '
'WHERE (product_tmpl_id IS NULL OR product_tmpl_id = any(%s)) '
'AND (product_id IS NULL OR (product_id = any(%s))) '
'AND ((categ_id IS NULL) OR (categ_id = any(%s))) '
'AND (price_version_id = %s) '
'ORDER BY sequence, min_quantity desc',
(prod_tmpl_ids, prod_ids, categ_ids, version.id))
item_ids = [x[0] for x in cr.fetchall()]
items = self.pool.get('product.pricelist.item').browse(cr, uid, item_ids, context=context)
price_types = {}
results = {}
for product, qty, partner in products_by_qty_by_partner:
results[product.id] = 0.0
rule_id = False
price = False
# Final unit price is computed according to `qty` in the `qty_uom_id` UoM.
# An intermediary unit price may be computed according to a different UoM, in
# which case the price_uom_id contains that UoM.
# The final price will be converted to match `qty_uom_id`.
qty_uom_id = context.get('uom') or product.uom_id.id
price_uom_id = product.uom_id.id
qty_in_product_uom = qty
if qty_uom_id != product.uom_id.id:
try:
qty_in_product_uom = product_uom_obj._compute_qty(
cr, uid, context['uom'], qty, product.uom_id.id or product.uos_id.id)
except except_orm:
# Ignored - incompatible UoM in context, use default product UoM
pass
for rule in items:
if rule.min_quantity and qty_in_product_uom < rule.min_quantity:
continue
if is_product_template:
if rule.product_tmpl_id and product.id != rule.product_tmpl_id.id:
continue
if rule.product_id:
continue
else:
if rule.product_tmpl_id and product.product_tmpl_id.id != rule.product_tmpl_id.id:
continue
if rule.product_id and product.id != rule.product_id.id:
continue
if rule.categ_id:
cat = product.categ_id
while cat:
if cat.id == rule.categ_id.id:
break
cat = cat.parent_id
if not cat:
continue
if rule.base == -1:
if rule.base_pricelist_id:
price_tmp = self._price_get_multi(cr, uid,
rule.base_pricelist_id, [(product,
qty, False)], context=context)[product.id]
ptype_src = rule.base_pricelist_id.currency_id.id
price_uom_id = qty_uom_id
price = currency_obj.compute(cr, uid,
ptype_src, pricelist.currency_id.id,
price_tmp, round=False,
context=context)
elif rule.base == -2:
seller = False
for seller_id in product.seller_ids:
if (not partner) or (seller_id.name.id != partner):
continue
seller = seller_id
if not seller and product.seller_ids:
seller = product.seller_ids[0]
if seller:
qty_in_seller_uom = qty
seller_uom = seller.product_uom.id
if qty_uom_id != seller_uom:
qty_in_seller_uom = product_uom_obj._compute_qty(cr, uid, qty_uom_id, qty, to_uom_id=seller_uom)
price_uom_id = seller_uom
for line in seller.pricelist_ids:
if line.min_quantity <= qty_in_seller_uom:
price = line.price
elif rule.base == -3:
ppc_obj = self.pool.get('product.pricelist.customer')
ppc_ids = ppc_obj.search(cr, uid, [('partner_id','=',partner), ('product_id','=',product.id)], context=context)
ppc_best = False
today = datetime.date.today()
for ppc in ppc_obj.browse(cr, uid, ppc_ids, context=context):
ppc_start = ppc.date_start or '0001-01-01'
ppc_start = datetime.datetime.strptime(ppc_start, '%Y-%m-%d').date()
ppc_end = ppc.date_end or '9999-01-01'
ppc_end = datetime.datetime.strptime(ppc_end, '%Y-%m-%d').date()
# 1) Entweder es gibt noch kein best oder die best min_qty muss kleiner sein als die canditate min_qty
# 2) Die qty aus der Zeile muss größer sein als die canditate min_qty
# 3) Heute muss zwischen start und end datum der candite regel sein
if (not ppc_best or ppc_best.min_quantity < ppc.min_quantity) and qty_in_product_uom >= ppc.min_quantity and ppc_start <= today <= ppc_end:
ppc_best = ppc
if ppc_best:
price = ppc_best.unit_price
else:
continue
else:
if rule.base not in price_types:
price_types[rule.base] = price_type_obj.browse(cr, uid, int(rule.base))
price_type = price_types[rule.base]
# price_get returns the price in the context UoM, i.e. qty_uom_id
price_uom_id = qty_uom_id
price = currency_obj.compute(
cr, uid,
price_type.currency_id.id, pricelist.currency_id.id,
product_obj._price_get(cr, uid, [product], price_type.field, context=context)[product.id],
round=False, context=context)
if price is not False:
price_limit = price
price = price * (1.0+(rule.price_discount or 0.0))
if rule.price_round:
price = tools.float_round(price, precision_rounding=rule.price_round)
convert_to_price_uom = (lambda price: product_uom_obj._compute_price(
cr, uid, product.uom_id.id,
price, price_uom_id))
if rule.price_surcharge:
price_surcharge = convert_to_price_uom(rule.price_surcharge)
price += price_surcharge
if rule.price_min_margin:
price_min_margin = convert_to_price_uom(rule.price_min_margin)
price = max(price, price_limit + price_min_margin)
if rule.price_max_margin:
price_max_margin = convert_to_price_uom(rule.price_max_margin)
price = min(price, price_limit + price_max_margin)
rule_id = rule.id
break
# Final price conversion to target UoM
price = product_uom_obj._compute_price(cr, uid, price_uom_id, price, qty_uom_id)
results[product.id] = (price, rule_id)
return results
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,117 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="product_pricelist_customer_form" model="ir.ui.view">
<field name="name">product_pricelist_customer_form</field>
<field name="model">product.pricelist.customer</field>
<field name="arch" type="xml">
<form string="Kundenbezogene Preise" version="7.0">
<sheet>
<group>
<field name="partner_id"/>
<field name="product_id"/>
<field name="unit_price"/>
<field name="min_quantity"/>
<field name="date_start"/>
<field name="date_end"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="product_pricelist_customer_tree" model="ir.ui.view">
<field name="name">product_pricelist_customer_tree</field>
<field name="model">product.pricelist.customer</field>
<field name="arch" type="xml">
<tree string="Kundenbezogene Preise">
<field name="partner_id"/>
<field name="product_id"/>
<field name="unit_price"/>
<field name="min_quantity"/>
<field name="date_start"/>
<field name="date_end"/>
</tree>
</field>
</record>
<record id="product_pricelist_customer_search" model="ir.ui.view">
<field name="name">product_pricelist_customer_search</field>
<field name="model">product.pricelist.customer</field>
<field name="arch" type="xml">
<search string="Suche Kundenbezogene Preise">
<field name="partner_id"/>
<field name="product_id"/>
<separator/>
<group expand="0" string="Group By">
<filter string="Kunde" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Produkt" domain="[]" context="{'group_by':'product_id'}"/>
</group>
</search>
</field>
</record>
<record id="customer_pricelist_action" model="ir.actions.act_window">
<field name="name">Kundenbez. Preise</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.pricelist.customer</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<record id="customer_pricelist_prod_action" model="ir.actions.act_window">
<field name="name">Kundenbez. Preise</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.pricelist.customer</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('product_id.product_tmpl_id', '=', active_id)]</field>
<field name="context">{'default_product_id': active_id}</field>
</record>
<record id="customer_pricelist_part_action" model="ir.actions.act_window">
<field name="name">Kundenbez. Preise</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.pricelist.customer</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('partner_id', '=', active_id)]</field>
<field name="context">{'default_partner_id': active_id}</field>
</record>
<!--
<menuitem id="customer_pricelist_main" name="Kundenbezogene Preise" sequence="21"/>
<menuitem id="customer_pricelist_sub" parent="customer_pricelist_main" name="Kundenbezogene Preise" sequence="10"/>
<menuitem action="customer_pricelist_action" id="customer_pricelist_menu" parent="customer_pricelist_sub" sequence="10"/>
-->
<menuitem action="customer_pricelist_action" id="customer_pricelist_menu" parent="product.menu_product_pricelist_main" sequence="5" groups="base.group_sale_manager"/>
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">product.template.product.form</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button class="oe_inline oe_stat_button" string="Kundenpreise" type="action" name="%(customer_pricelist_prod_action)d" icon="fa-eur"/>
</xpath>
</field>
</record>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button class="oe_inline oe_stat_button" string="Kundenpreise" type="action" name="%(customer_pricelist_part_action)d" icon="fa-eur"/>
</xpath>
</field>
</record>
</data>
</openerp>

View File

@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
product_pricelist_customer_user,product.pricelist.customer.user,model_product_pricelist_customer,base.group_sale_salesman,1,0,0,0
product_pricelist_customer_manager,product.pricelist.customer.manager,model_product_pricelist_customer,base.group_sale_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 product_pricelist_customer_user product.pricelist.customer.user model_product_pricelist_customer base.group_sale_salesman 1 0 0 0
3 product_pricelist_customer_manager product.pricelist.customer.manager model_product_pricelist_customer base.group_sale_manager 1 1 1 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

View File

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 cam_invoice_skonto
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,42 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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': 'Camadeus Invoice Skonto',
'version': '1.0',
'category': 'Custom',
'description':
"""
- Fügt die Felder Netto Tage, Skonto Tage, Skonto Prozent zu Zahlungsbedingungen (account.payment.term) hinzu.
- Fügt die Felder Skonto Fälligkeit und Betrag inkl. Skonto zur Rechnung (account.invoice) hinzu.
""",
'author': 'camadeus GmbH',
'website': 'http://www.camadeus.at',
'depends': ['account', 'sale'],
'data': [
'cam_invoice_skonto_view.xml',
'cam_invoice_skonto_data.xml',
],
'installable': True,
'auto_install': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,403 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 openerp.osv import fields, osv
from openerp import models, fields as f, api
import openerp.addons.decimal_precision as dp
from datetime import date, timedelta, datetime
from openerp.tools.translate import _
class account_payment_term(osv.osv):
_inherit = 'account.payment.term'
_columns = {
'netto_tage': fields.integer('Netto Tage'),
'skonto_tage': fields.integer('Skonto Tage'),
'skonto_prozent': fields.float('Skonto Prozent'),
}
def write(self, cr, uid, ids, values, context=None):
if context is None:
context = {}
tl_obj = self.pool.get('account.payment.term.line')
for pay_term in self.browse(cr, uid, ids, context=context):
# Delete old account.payment.term.line
for tl_id in pay_term.line_ids:
tl_obj.unlink(cr, uid, tl_id.id, context=context)
# Create new account.payment.term.line based on netto_tage
days = 0
if('netto_tage' in values):
days = values['netto_tage']
else:
days = pay_term.netto_tage
values['line_ids'] = [(0,0, {'payment_id':pay_term.id, 'value': 'balance', 'days': days, 'days2':0})]
return super(account_payment_term, self).write(cr, uid, ids, values, context=context)
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
new_id = super(account_payment_term, self).create(cr, uid, vals, context=context)
self.write(cr, uid, new_id, {'netto_tage': vals['netto_tage']}, context=context)
return new_id
class account_invoice(models.Model):
_inherit = 'account.invoice'
@api.one
def _skonto_betrag_inkl(self):
if self.payment_term and self.payment_term.skonto_prozent:
self.skonto_betrag_inkl = self.amount_total * (1 - self.payment_term.skonto_prozent/100.0)
skonto_faelligkeit = f.Date(string=u'Skonto Fälligkeit', readonly=True)
skonto_betrag_inkl = f.Float(string='Betrag inkl. Skonto', digits=dp.get_precision('Account'), readonly=True, compute='_skonto_betrag_inkl')
@api.multi
def action_skonto_faelligkeit_assign(self):
for inv in self:
if inv.payment_term and inv.payment_term.skonto_tage:
inv.write({'skonto_faelligkeit': datetime.strptime(inv.date_invoice, '%Y-%m-%d') + timedelta(days=inv.payment_term.skonto_tage)})
return True
# Add context 'click_register_payment'
def invoice_pay_customer(self, cr, uid, ids, context=None):
if not ids: return []
dummy, view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_voucher', 'view_vendor_receipt_dialog_form')
inv = self.browse(cr, uid, ids[0], context=context)
return {
'name':_("Pay Invoice"),
'view_mode': 'form',
'view_id': view_id,
'view_type': 'form',
'res_model': 'account.voucher',
'type': 'ir.actions.act_window',
'nodestroy': True,
'target': 'new',
'domain': '[]',
'context': {
'payment_expected_currency': inv.currency_id.id,
'default_partner_id': self.pool.get('res.partner')._find_accounting_partner(inv.partner_id).id,
'default_amount': inv.type in ('out_refund', 'in_refund') and -inv.residual or inv.residual,
'default_reference': inv.name,
'close_after_process': True,
'invoice_type': inv.type,
'invoice_id': inv.id,
'default_type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment',
'type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment',
'click_register_payment':True,
}
}
class account_voucher(osv.osv):
_inherit = 'account.voucher'
#Workaround to send context in _compute_writeoff_amount()
def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_currency, type, context=None):
context = context or {}
if not line_dr_ids and not line_cr_ids:
return {'value':{'writeoff_amount': 0.0}}
line_osv = self.pool.get("account.voucher.line")
line_dr_ids = resolve_o2m_operations(cr, uid, line_osv, line_dr_ids, ['amount'], context)
line_cr_ids = resolve_o2m_operations(cr, uid, line_osv, line_cr_ids, ['amount'], context)
#compute the field is_multi_currency that is used to hide/display options linked to secondary currency on the voucher
is_multi_currency = False
#loop on the voucher lines to see if one of these has a secondary currency. If yes, we need to see the options
for voucher_line in line_dr_ids+line_cr_ids:
line_id = voucher_line.get('id') and self.pool.get('account.voucher.line').browse(cr, uid, voucher_line['id'], context=context).move_line_id.id or voucher_line.get('move_line_id')
if line_id and self.pool.get('account.move.line').browse(cr, uid, line_id, context=context).currency_id:
is_multi_currency = True
break
return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, type, context=context), 'is_multi_currency': is_multi_currency}}
def get_default_acc_id(self, cr, uid, args):
konto = self.pool.get('account.account').search(cr,uid,[('code','=','99999999')],limit=1)
if konto:
return konto[0]
else:
raise osv.except_osv(_('Konfigurationsfehler!'),_("Es ist kein Konto für den Ausgleich der Rechnungen definiert (Skonto). Bitte wenden Sie sich an den Support."))
return False
_defaults = {
'comment': 'Skonto',
'writeoff_acc_id': get_default_acc_id,
}
def _get_writeoff_amount(self, cr, uid, ids, name, args, context={}):
if not ids: return {}
currency_obj = self.pool.get('res.currency')
res = {}; diff_amount = 0.0
debit = credit = total_inv_residual = 0.0
for voucher in self.browse(cr, uid, ids, context=context):
sign = voucher.type == 'payment' and -1 or 1
for l in voucher.line_dr_ids:
debit += l.amount
if context.has_key('click_register_payment'):
if voucher.payment_option == 'with_writeoff':
# There can be several open lines => we only want to reconcile the line related to the invoice
if l.move_line_id and l.move_line_id.invoice and l.move_line_id.invoice.id == context.get('invoice_id',-1):
l.write({'reconcile': True, 'amount': l.amount_unreconciled})
total_inv_residual += (l.amount > 0 and l.amount_unreconciled - l.amount)
for l in voucher.line_cr_ids:
credit += l.amount
if context.has_key('click_register_payment'):
if voucher.payment_option == 'with_writeoff':
# There can be several open lines => we only want to reconcile the line related to the invoice
if l.move_line_id and l.move_line_id.invoice and l.move_line_id.invoice.id == context.get('invoice_id',-1):
l.write({'reconcile': True, 'amount': l.amount_unreconciled})
total_inv_residual += (l.amount > 0 and l.amount_unreconciled - l.amount)
currency = voucher.currency_id or voucher.company_id.currency_id
write_off_amount = voucher.amount - sign * (credit - debit)
if context.has_key('click_register_payment'):
write_off_amount = total_inv_residual * sign
res[voucher.id] = currency_obj.round(cr, uid, currency, write_off_amount)
return res
_columns = {
'writeoff_amount': fields.function(_get_writeoff_amount, string='Difference Amount', type='float', readonly=True, help="Computed as the difference between the amount stated in the voucher and the sum of allocation on the voucher lines."),
}
#working on context to differentiate the button clicks without affecting the present code
#Workaround to send context in _compute_writeoff_amount()
def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, type, context={}):
debit = credit = total_inv_residual = 0.0
sign = type == 'payment' and -1 or 1
for l in line_dr_ids:
debit += l['amount']
#total_inv_residual += (l['amount'] > 0 and l['amount_unreconciled'] - l['amount'])
total_inv_residual += l['amount_unreconciled']
for l in line_cr_ids:
credit += l['amount']
#total_inv_residual += (l['amount'] > 0 and l['amount_unreconciled'] - l['amount'])
total_inv_residual += l['amount_unreconciled']
writeoff_amount = amount - sign * (credit - debit)
if context.has_key('click_register_payment'):
writeoff_amount = amount - (total_inv_residual)
return writeoff_amount
#Workaround to send context in _compute_writeoff_amount()
def recompute_voucher_lines(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None):
"""
Returns a dict that contains new values and context
@param partner_id: latest value from user input for field partner_id
@param args: other arguments
@param context: context arguments, like lang, time zone
@return: Returns a dict which contains new values, and context
"""
def _remove_noise_in_o2m():
"""if the line is partially reconciled, then we must pay attention to display it only once and
in the good o2m.
This function returns True if the line is considered as noise and should not be displayed
"""
if line.reconcile_partial_id:
if currency_id == line.currency_id.id:
if line.amount_residual_currency <= 0:
return True
else:
if line.amount_residual <= 0:
return True
return False
if context is None:
context = {}
context_multi_currency = context.copy()
currency_pool = self.pool.get('res.currency')
move_line_pool = self.pool.get('account.move.line')
partner_pool = self.pool.get('res.partner')
journal_pool = self.pool.get('account.journal')
line_pool = self.pool.get('account.voucher.line')
#set default values
default = {
'value': {'line_dr_ids': [], 'line_cr_ids': [], 'pre_line': False},
}
# drop existing lines
line_ids = ids and line_pool.search(cr, uid, [('voucher_id', '=', ids[0])])
for line in line_pool.browse(cr, uid, line_ids, context=context):
if line.type == 'cr':
default['value']['line_cr_ids'].append((2, line.id))
else:
default['value']['line_dr_ids'].append((2, line.id))
if not partner_id or not journal_id:
return default
journal = journal_pool.browse(cr, uid, journal_id, context=context)
partner = partner_pool.browse(cr, uid, partner_id, context=context)
currency_id = currency_id or journal.company_id.currency_id.id
total_credit = 0.0
total_debit = 0.0
account_type = None
if context.get('account_id'):
account_type = self.pool['account.account'].browse(cr, uid, context['account_id'], context=context).type
if ttype == 'payment':
if not account_type:
account_type = 'payable'
total_debit = price or 0.0
else:
total_credit = price or 0.0
if not account_type:
account_type = 'receivable'
if not context.get('move_line_ids', False):
if context.get('click_register_payment', False) and context.get('invoice_id', False):
ids = move_line_pool.search(cr, uid, [('state','=','valid'), ('account_id.type', '=', account_type), ('reconcile_id', '=', False), ('partner_id', '=', partner_id),('invoice','=',context.get('invoice_id'))], context=context)
else:
ids = move_line_pool.search(cr, uid, [('state','=','valid'), ('account_id.type', '=', account_type), ('reconcile_id', '=', False), ('partner_id', '=', partner_id)], context=context)
else:
ids = context['move_line_ids']
invoice_id = context.get('invoice_id', False)
company_currency = journal.company_id.currency_id.id
move_lines_found = []
#order the lines by most old first
ids.reverse()
account_move_lines = move_line_pool.browse(cr, uid, ids, context=context)
#compute the total debit/credit and look for a matching open amount or invoice
for line in account_move_lines:
if _remove_noise_in_o2m():
continue
if invoice_id:
if line.invoice.id == invoice_id:
#if the invoice linked to the voucher line is equal to the invoice_id in context
#then we assign the amount on that line, whatever the other voucher lines
move_lines_found.append(line.id)
elif currency_id == company_currency:
#otherwise treatments is the same but with other field names
if line.amount_residual == price:
#if the amount residual is equal the amount voucher, we assign it to that voucher
#line, whatever the other voucher lines
move_lines_found.append(line.id)
break
#otherwise we will split the voucher amount on each line (by most old first)
total_credit += line.credit or 0.0
total_debit += line.debit or 0.0
elif currency_id == line.currency_id.id:
if line.amount_residual_currency == price:
move_lines_found.append(line.id)
break
total_credit += line.credit and line.amount_currency or 0.0
total_debit += line.debit and line.amount_currency or 0.0
remaining_amount = price
#voucher line creation
for line in account_move_lines:
if _remove_noise_in_o2m():
continue
if line.currency_id and currency_id == line.currency_id.id:
amount_original = abs(line.amount_currency)
amount_unreconciled = abs(line.amount_residual_currency)
else:
#always use the amount booked in the company currency as the basis of the conversion into the voucher currency
amount_original = currency_pool.compute(cr, uid, company_currency, currency_id, line.credit or line.debit or 0.0, context=context_multi_currency)
amount_unreconciled = currency_pool.compute(cr, uid, company_currency, currency_id, abs(line.amount_residual), context=context_multi_currency)
line_currency_id = line.currency_id and line.currency_id.id or company_currency
rs = {
'name':line.move_id.name,
'type': line.credit and 'dr' or 'cr',
'move_line_id':line.id,
'account_id':line.account_id.id,
'amount_original': amount_original,
'amount': (line.id in move_lines_found) and min(abs(remaining_amount), amount_unreconciled) or 0.0,
'date_original':line.date,
'date_due':line.date_maturity,
'amount_unreconciled': amount_unreconciled,
'currency_id': line_currency_id,
}
remaining_amount -= rs['amount']
#in case a corresponding move_line hasn't been found, we now try to assign the voucher amount
#on existing invoices: we split voucher amount by most old first, but only for lines in the same currency
if not move_lines_found:
if currency_id == line_currency_id:
if line.credit:
amount = min(amount_unreconciled, abs(total_debit))
rs['amount'] = amount
total_debit -= amount
else:
amount = min(amount_unreconciled, abs(total_credit))
rs['amount'] = amount
total_credit -= amount
if rs['amount_unreconciled'] == rs['amount']:
rs['reconcile'] = True
if rs['type'] == 'cr':
default['value']['line_cr_ids'].append(rs)
else:
default['value']['line_dr_ids'].append(rs)
if len(default['value']['line_cr_ids']) > 0:
default['value']['pre_line'] = 1
elif len(default['value']['line_dr_ids']) > 0:
default['value']['pre_line'] = 1
default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, ttype, context=context)
return default
def resolve_o2m_operations(cr, uid, target_osv, operations, fields, context):
results = []
for operation in operations:
result = None
if not isinstance(operation, (list, tuple)):
result = target_osv.read(cr, uid, operation, fields, context=context)
elif operation[0] == 0:
# may be necessary to check if all the fields are here and get the default values?
result = operation[2]
elif operation[0] == 1:
result = target_osv.read(cr, uid, operation[1], fields, context=context)
if not result: result = {}
result.update(operation[2])
elif operation[0] == 4:
result = target_osv.read(cr, uid, operation[1], fields, context=context)
if result != None:
results.append(result)
return results
class sale_order(osv.osv):
_inherit = 'sale.order'
def _skonto_betrag_inkl(self, cr, uid, ids, field_name, arg, context=None):
res = {}
sos = self.browse(cr, uid, ids, context=context)
for so in sos:
if so.payment_term and so.payment_term.skonto_prozent:
res[so.id] = so.amount_total * (1 - so.payment_term.skonto_prozent/100.0)
return res
_columns = {
'skonto_betrag_inkl': fields.function(_skonto_betrag_inkl, string='Betrag inkl. Skonto', type='float'),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# cam_invoice_skonto, Custom Module for OpenERP
# Copyright (C) 2014 Camadeus Consulting GmbH (<http://www.camadeus.at>).
#
# 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/>.
#
##############################################################################
-->
<openerp>
<data>
<record id="account.act_open" model="workflow.activity">
<field name="action">action_date_assign()
action_move_create()
action_number()
invoice_validate()
action_skonto_faelligkeit_assign()</field>
</record>
</data>
<data noupdate="1">
<record id="account_account_skonto" model="account.account">
<field name="name">Skonto</field>
<field name="code">99999999</field>
<field name="type">other</field>
<field name="user_type" search="[('code','=','other')]"/>
</record>
</data>
</openerp>

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# cam_invoice_skonto, Custom Module for OpenERP
# Copyright (C) 2014 Camadeus Consulting GmbH (<http://www.camadeus.at>).
#
# 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/>.
#
##############################################################################
-->
<openerp>
<data>
<record id="view_payment_term_form" model="ir.ui.view">
<field name="name">cam_invoice_skonto.payment.term.form</field>
<field name="model">account.payment.term</field>
<field name="inherit_id" ref="account.view_payment_term_form"/>
<field name="arch" type="xml">
<xpath expr="//form[@string='Payment Term']/separator[@string='Computation']" position="replace">
</xpath>
<xpath expr="//form[@string='Payment Term']/field[@name='line_ids']" position="replace">
<group col="4">
<field name="skonto_tage"/>
<field name="netto_tage"/>
<field name="skonto_prozent"/>
</group>
</xpath>
</field>
</record>
<record id="invoice_form" model="ir.ui.view">
<field name="name">cam_invoice_skonto.invoice.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<field name="date_due" position="after">
<field name="skonto_faelligkeit"/>
</field>
<field name="residual" position="before">
<field name="skonto_betrag_inkl" attrs="{'invisible': [('skonto_betrag_inkl','=',0)]}"/>
</field>
</field>
</record>
<!-- account.voucher -->
<record id="account_voucher_form" model="ir.ui.view">
<field name="name">cam_invoice_skonto.account_voucher.form</field>
<field name="model">account.voucher</field>
<field name="inherit_id" ref="account_voucher.view_vendor_receipt_dialog_form"/>
<field name="arch" type="xml">
<field name="writeoff_acc_id" position="attributes">
<attribute name="invisible">1</attribute>
</field>
</field>
</record>
<record id="view_order_form" model="ir.ui.view">
<field name="name">sale.order.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="amount_total" position="after">
<field name="skonto_betrag_inkl"/>
</field>
</field>
</record>
</data>
</openerp>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,40 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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': 'Max. Width for Form View',
'category': 'Custom',
'version': '1.0',
'description': """
""",
'author': 'camadeus GmbH',
'website': 'http://www.camadeus.at',
'depends': [],
'data': [
'views/max_width.xml',
],
'installable': True,
'sequence': 150,
'auto_install': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,10 +0,0 @@
.openerp .oe_followers .oe_invite {
float: none !important;
display: block;
padding-left: 0px;
}
.openerp .oe_form_sheet_width {
max-width: 95% !important;
}

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- vim:fdn=3:
-->
<openerp>
<data>
<template id="assets_backend" name="mail assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/cam_max_width/static/src/css/max_width.css"/>
</xpath>
</template>
</data>
</openerp>

View File

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>).
#
# 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 cam_reports
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,37 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>).
#
# 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': 'Datenpol-Reports',
'category': 'Custom',
'version': '1.0',
'description': """Individuelle Dokumentenvorlagen""",
'author': 'datenpol gmbh',
'website': 'http://www.datenpol.at/',
'depends': ['purchase','sale','account','stock'],
'data': ['reports_data.xml',
],
'installable': True,
'auto_install': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,92 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>).
#
# 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 openerp.osv import fields, osv
import openerp.modules as addons
import os
import base64
class res_company(osv.osv):
_inherit = 'res.company'
def get_image(self, img):
def _get_dir():
styles_dir = 'cam_reports/static/src/img'
adps = addons.module.ad_paths
for adp in adps:
dir = os.path.join(adp, styles_dir)
if os.path.isdir(dir):
return dir
return False
def _get_file_data(filename):
try:
f = open(filename , 'rb')
data = base64.b64encode(f.read())
f.close()
return data
except:
print "Error openening file '%s'." % (filename)
return False
path = _get_dir()
fname = os.path.join(path, img)
img_data = _get_file_data(fname)
return img_data
def _get_rml_header(self, cr, uid, ids, _field_name, _args, context=None):
result = dict.fromkeys(ids, False)
# Get filename
dirname = 'cam_reports/report'
adps = addons.module.ad_paths
for adp in adps:
dir = os.path.join(adp, dirname)
if os.path.isdir(dir):
break
if os.path.isdir(dir):
filename = os.path.join(dir, 'briefkopf.rml')
f = open(filename , 'rb')
data = f.read()
result = dict.fromkeys(ids, data)
return result
def _get_rml_header2(self, cr, uid, ids, _field_name, _args, context=None):
result = dict.fromkeys(ids, False)
# Get filename
dirname = 'cam_reports/report'
adps = addons.module.ad_paths
for adp in adps:
dir = os.path.join(adp, dirname)
if os.path.isdir(dir):
break
if os.path.isdir(dir):
filename = os.path.join(dir, 'page.rml')
f = open(filename , 'rb')
data = f.read()
result = dict.fromkeys(ids, data)
return result
_columns = {
'rml_header': fields.function(_get_rml_header, type='text', string='Briefkopf', readonly=True),
'rml_header2': fields.function(_get_rml_header2, type='text', string='RML Header', readonly=True),
}

View File

@ -1,236 +0,0 @@
<?xml version="1.0"?>
<document filename="Rechnung.pdf">
<template pageSize="(595.0,842.0)" title="Sale Order" author="datenpol gmbh" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="15.0" y1="42.0" width="539" height="758"/>
</pageTemplate>
</template>
<story>
<para>
<seqReset id="L1"/>
</para>
<para>[[repeatIn(objects,'o')]] [[ setLang(o.partner_id.commercial_partner_id.lang)]]</para>
<blockTable colWidths="270,85,145" style="Struktur">
<tr>
<td>
<section>
<para style="fett">[[ o.partner_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_id.commercial_partner_id.id != o.partner_id.id and o.partner_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_id.zip) or '' ]] [[ (o.partner_id and o.partner_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_id.state_id and o.partner_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_id.country_id and o.partner_id.country_id.name) or '' ]]</para>
<!-- Für Sichtfenster -->
<section>[[ not (o.partner_id.commercial_partner_id and o.partner_id.commercial_partner_id.ref) or removeParentNode('section') ]]
<para style="normal">&#160;</para>
</section>
</section>
<para></para>
</td>
<td>
<para style="normal">Datum:</para>
<para style="normal">Quelldokument:</para>
<para style="normal">Kundenreferenz:</para>
<!--<para style="normal">Kundennummer:</para>-->
<para style="normal">Kunde UID Nr.:</para>
<para style="normal">Ansprechpartner:</para>
</td>
<td>
<para style="normal">[[ formatLang(o.date_invoice,date = True) ]]&#160;</para>
<para style="normal">[[ o.origin ]]&#160;</para>
<para style="normal">[[ o.name ]]&#160;</para>
<!--<para style="normal">[[ o.partner_id.commercial_partner_id.ref ]]&#160;</para>-->
<para style="normal">[[ o.partner_id.commercial_partner_id and o.partner_id.commercial_partner_id.vat or '' ]]&#160;</para>
<para style="normal">[[ (o.user_id and o.user_id.name) or '' ]]&#160;</para>
</td>
</tr>
<!--
<tr>
<td>
<section>[[ (o.partner_shipping_id and o.partner_shipping_id.id != o.partner_id.id) or removeParentNode('section')]]
<spacer length="0.5cm"/>
<para style="normal">Lieferadresse:</para>
<para style="normal">[[ o.partner_shipping_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_shipping_id.commercial_partner_id.id != o.partner_shipping_id.id and o.partner_shipping_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_shipping_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_shipping_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_shipping_id.zip) or '' ]] [[ (o.partner_shipping_id and o.partner_shipping_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_shipping_id.state_id and o.partner_shipping_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_shipping_id.country_id and o.partner_shipping_id.country_id.name) or '' ]]</para>
</section>
<para style="normal">&#160;</para>
</td>
<td>
<para style="normal">&#160;</para>
</td>
<td>
<para style="normal">&#160;</para>
</td>
</tr>
-->
</blockTable>
<spacer length="1.0cm"/>
<para style="ueberschrift2"><b>Rechnung [[ ((o.type == 'out_invoice' and (o.state == 'open' or o.state == 'paid')) or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para>
<para style="ueberschrift2"><b>PRO-FORMA [[ ((o.type == 'out_invoice' and o.state == 'proforma2') or removeParentNode('para')) and '' ]]</b></para>
<para style="ueberschrift2"><b>Rechnungsentwurf [[ ((o.type == 'out_invoice' and o.state == 'draft') or removeParentNode('para')) and '' ]]</b></para>
<para style="ueberschrift2"><b>Stornierte Rechnung [[ ((o.type == 'out_invoice' and o.state == 'cancel') or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para>
<para style="ueberschrift2"><b>Stornorechnung [[ (o.type=='out_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para>
<para style="ueberschrift2"><b>Stornorechnung [[ (o.type=='in_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para>
<para style="ueberschrift2"><b>Rechnung [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]] [[ o.number ]]</b></para>
<spacer length="0.5cm"/>
<blockTable colWidths="30,57,170,75,63,40,75" repeatRows="1" style="TabelleHaupt" hAlign="LEFT">
<tr>
<td>
<para style="tabelle_header">Pos</para>
</td>
<td>
<para style="tabelle_header">Art.nr.</para>
</td>
<td>
<para style="tabelle_header_links">Bezeichnung</para>
</td>
<td>
<para style="tabelle_header_links">Menge</para>
</td>
<td>
<para style="tabelle_header_rechts">Einzelpreis</para>
</td>
<td>
<para style="tabelle_header"></para>
</td>
<td>
<para style="tabelle_header_rechts">Gesamtpreis</para>
</td>
</tr>
<tr>[[repeatIn(o.invoice_line,'line')]]
<td>
<para style="tabelle_daten_center" leftIndent="0" bulletIndent="0" size="8.0">
<seq id="L1"/>
</para>
</td>
<td>
<para style="tabelle_daten_center">[[ line.product_id and line.product_id.default_code or '']]</para>
</td>
<td>
<para style="tabelle_daten_links">[[ (line.name or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((line.name or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="tabelle_daten_links">[[ paragraphs ]]</para>
</section>
</td>
<td>
<para style="tabelle_daten_links">[[formatLang(line.quantity, digits=2)[-2:]=='00' and formatLang(line.quantity, digits=0) or formatLang(line.quantity, digits=2)]] [[ line.uos_id.name ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ formatLang(line.price_unit,digits=2) ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ line.discount &lt;&gt; 0 and (formatLang(line.discount) + '%') or '' ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ formatLang(line.price_subtotal,digits=2 ) ]]</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="210,200,100" style="TabelleSchlussrechnung">
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung">Zwischensumme in €</para>
</td>
<td>
<para style="schlussrechnung">[[ formatLang(o.amount_untaxed,digits=2 )]]</para>
</td>
</tr>
<tr>[[ repeatIn(o.tax_line,'tax') ]]
<td>
<para style="schlussrechnung"></para>
</td>
<td>
<para style="schlussrechnung">MwSt. [[tax.name.split(" ")[0] or ""]] in €</para>
</td>
<td>
<para style="schlussrechnung">[[ formatLang(tax.tax_amount) ]]</para>
</td>
</tr>
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung_fett">Rechnungsbetrag in €</para>
</td>
<td>
<para style="schlussrechnung_fett">[[ formatLang(o.amount_total,digits=2 ) ]]</para>
</td>
</tr>
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung">Rechnungsbetrag inkl. Skonto in €</para>
</td>
<td>
<para style="schlussrechnung">[[ (o.skonto_betrag_inkl and formatLang(o.skonto_betrag_inkl,digits=2)) or removeParentNode('tr') ]]</para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<para style="normal">[[ (o.comment or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((o.comment or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="normal">[[ paragraphs ]]</para>
</section>
<spacer length="0.5cm"/>
<blockTable colWidths="110,390" style="Struktur" hAlign="LEFT">
<tr>
<td>
<para style="normal">Zahlungsbedingungen:</para>
</td>
<td>
<para style="normal">[[ (o.payment_term and o.payment_term.note) or removeParentNode('blockTable') ]]</para>
</td>
</tr>
</blockTable>
<!--
<spacer length="0.5cm"/>
<blockTable colWidths="500" style="Struktur" hAlign="LEFT">
<tr>
<td>
<para style="normal"></para>
</td>
</tr>
<tr>[[ o.date_due and o.payment_term and o.payment_term.skonto_prozent or removeParentNode('tr') ]]
<td>
<para style="normal">Zahlbar bis [[ formatLang(o.skonto_faelligkeit,date = True) ]] abzüglich [[ formatLang(o.payment_term.skonto_prozent,digits=2) ]]% beträgt [[ formatLang(o.skonto_betrag_inkl,digits=2) ]]€.</para>
</td>
</tr>
<tr>[[ o.date_due or removeParentNode('tr') ]]
<td>
<para style="normal">Zahlbar bis [[ formatLang(o.date_due,date = True) ]] ohne Abzug.</para>
</td>
</tr>
</blockTable>
-->
</story>
</document>

View File

@ -1,99 +0,0 @@
<header>
<pageTemplate>
<frame id="first" x1="1.5cm" y1="4cm" height="21.1cm" width="18.5cm"/>
<stylesheet>
<!-- Set here the default font to use for all <para> tags -->
<paraStyle name='Normal' fontName="Helvetica"/>
<paraStyle name="footer" fontName="Helvetica" leading="8" fontSize="7.0" alignment="LEFT"/>
<paraStyle name="footer_rechts" fontName="Helvetica" leading="8" fontSize="7.0" alignment="RIGHT"/>
<paraStyle name="header_fett" fontName="Helvetica-Bold" fontSize="7.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="header" fontName="Helvetica" fontSize="7.0" leading="8" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="Absender" fontName="Helvetica" fontSize="7.0" leading="8" alignment="LEFT" spaceAfter="0.0"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" />
<paraStyle name="fett" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT"/>
<paraStyle name="ueberschrift" fontName="Helvetica-Bold" fontSize="10.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="tabelle_header" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER"/>
<paraStyle name="tabelle_header_links" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT"/>
<paraStyle name="tabelle_header_rechts" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT"/>
<paraStyle name="tabelle_daten_center" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER"/>
<paraStyle name="tabelle_daten_links" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT"/>
<paraStyle name="tabelle_daten_links_italic" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT"/>
<paraStyle name="tabelle_daten_rechts" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT"/>
<paraStyle name="schlussrechnung" fontName="Helvetica" fontSize="9.0" leading="10" alignment="RIGHT"/>
<paraStyle name="schlussrechnung_fett" fontName="Helvetica-Bold" fontSize="9.0" leading="10" alignment="RIGHT"/>
<paraStyle name="skonto" fontName="Helvetica" fontSize="7.0" leading="10" alignment="RIGHT"/>
<!-- Tabellen -->
<blockTableStyle id="Struktur">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<blockTopPadding length="0"/>
<blockBottomPadding length="0"/>
<blockLeftPadding length="0"/>
<blockRightPadding length="0"/>
</blockTableStyle>
<blockTableStyle id="TabelleHaupt">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" thickness="0.5"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,0" thickness="1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="-1,-1" thickness="1"/>
</blockTableStyle>
<blockTableStyle id="TabelleSchlussrechnung">
<blockValign value="MIDDLE"/>
</blockTableStyle>
</stylesheet>
<pageGraphics>
<!-- Logo Oben 1 -->
<place x="1.75cm" y="24.75cm" height="3cm" width="7cm">
<para style="footer">[[ company.partner_id.name ]]</para>
<para style="footer">[[ company.street ]]</para>
<para style="footer">[[ company.zip ]] [[ company.city ]]</para>
<para style="footer">[[ company.country_id.name ]]</para>
</place>
<!-- Logo Oben 2 -->
<place x="6.90cm" y="24.75cm" height="3cm" width="7cm">
<para style="footer">Telefon:</para>
<para style="footer">Telefax:</para>
<para style="footer">E-Mail:</para>
<para style="footer">Web:</para>
</place>
<place x="8.10cm" y="24.75cm" height="3cm" width="7cm">
<para style="footer">[[ company.phone ]]</para>
<para style="footer">[[ company.fax ]]</para>
<para style="footer">[[ company.partner_id.email ]]</para>
<para style="footer">[[ company.partner_id.website ]]</para>
</place>
<!-- Logo Oben -->
<image x="13.80cm" y="26.60cm" height="1.5cm" preserveAspectRatio="1">[[ company.logo]]</image>
<!-- Seperator -->
<rect x="1.70cm" y="26.40cm" width="18.00cm" height="0.01cm" fill="yes" stroke="no"/>
<!-- Seperator -->
<rect x="1.70cm" y="1.85cm" width="18.00cm" height="0.01cm" fill="yes" stroke="no"/>
<!-- Footer links -->
<place x="1.75cm" y="0cm" height="1.75cm" width="18cm">
<para style="footer">Bankverbindung: BANK, IBAN: AT000000000000000000, BIC: AAAAAAAA</para>
<para style="footer">UID: [[company.vat ]], FN: [[ company.company_registry ]]</para>
<para style="footer">Die Ware bleibt bis zur vollständigen Bezahlung unser Eigentum.</para>
</place>
<!-- Seitenzahl -->
<setFont name="Helvetica" size="8"/>
<drawRightString x="561" y="58">Seite <pageNumber/> </drawRightString>
</pageGraphics>
</pageTemplate>
</header>

View File

@ -1,123 +0,0 @@
<?xml version="1.0"?>
<document filename="Picking_Auftrag.pdf">
<template pageSize="(595.0,842.0)" title="Picking Auftrag" author="datenpol gmbh" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="15.0" y1="42.0" width="539" height="758"/>
</pageTemplate>
</template>
<story>
<para>
<seqReset id="L1"/>
</para>
<para>[[ repeatIn(objects,'o') ]] [[ o.partner_id and setLang(o.partner_id.lang) ]]</para>
<blockTable colWidths="260,260" style="Struktur" hAlign="RIGHT">
<tr>
<td>
<para style="normal">AUFTRAGSNUMMER: [[ o.origin or '' ]]</para>
</td>
<td>
<para style="normal_rechts"></para>
</td>
</tr>
</blockTable>
<blockTable colWidths="292,100,126" style="Struktur" hAlign="RIGHT">
<tr>
<td>
<para style="fett"></para>
<!--
<spacer length="0.5cm"/>
<para style="fett">Fertigung für:</para>
<para style="normal">KEINE partner_id in mrp.production!</para>
<spacer length="0.5cm"/>
<spacer length="0.2cm"/>
<para style="normal">[[ o.partner_id.commercial_partner_id.name ]]</para>
<spacer length="0.1cm"/>
<para style="normal">[[ (o.partner_id.commercial_partner_id.id != o.partner_id.id and o.partner_id.name) or '' ]] </para>
<spacer length="0.1cm"/>
<para style="normal">[[ (o.partner_id.street ) or '']]</para>
<spacer length="0.1cm"/>
<para style="normal">[[ (o.partner_id.street2) or removeParentNode('para') ]]</para>
<spacer length="0.1cm"/>
<para style="normal">[[ (o.partner_id.zip) or '' ]] [[ (o.partner_id and o.partner_id.city) or '' ]]</para>
<spacer length="0.1cm"/>
<para style="normal">[[ (o.partner_id.state_id and o.partner_id.state_id.name) or removeParentNode('para')]]</para>
<spacer length="0.1cm"/>
<para style="normal">[[ (o.partner_id.country_id and o.partner_id.country_id.name) or '' ]]</para>
<spacer length="0.5cm"/>
-->
</td>
<td>
<spacer length="1.0cm"/>
<para style="normal_center"></para>
</td>
<td>
<spacer length="1.0cm"/>
<para style="normal_rechts"></para>
</td>
</tr>
</blockTable>
<blockTable colWidths="292,226" style="Struktur" hAlign="RIGHT">
<tr>
<td>
<para style="normal_big"><b>FERTIGUNG: [[ o.name ]]</b></para>
<spacer length="0.2cm"/>
</td>
<td>
<para style="normal_rechts_big">DATUM: [[ formatLang(o.date_planned,date=True) or formatLang(time.strftime('%Y-%m-%d'),date=True) ]]</para>
<spacer length="0.2cm"/>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<blockTable colWidths="100, 210,210" style="Struktur" hAlign="RIGHT">
<tr>
<td>
<para style="tabelle_daten_links"></para>
</td>
<td>
<para style="tabelle_daten_links"><b>Fertigungsartikel: [[ (o.product_id.default_code and '['+o.product_id.default_code+']') or '']] [[ o.product_id.name ]]</b></para>
</td>
<td>
<para style="tabelle_daten_links"><b>Zu fertigende Menge: [[ o.product_qty ]]</b></para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<blockTable colWidths="100, 210,210" style="Struktur" hAlign="RIGHT">
<tr>
<td>
<para style="tabelle_daten_links">Bestandteile:</para>
<spacer length="0.2cm"/>
</td>
<td>
<para style="tabelle_daten_links">Artikel</para>
</td>
<td>
<para style="tabelle_daten_links">Menge</para>
</td>
</tr>
<tr>[[repeatIn(o.move_lines,'line')]]
<td>
<para style="tabelle_daten_links"></para>
</td>
<td>
<para style="tabelle_daten_links">[[ (line.product_id.default_code and '['+line.product_id.default_code+']') or '']] [[ line.product_id.name]]</para>
</td>
<td>
<para style="tabelle_daten_links">[[ line.product_qty ]]</para>
</td>
</tr>
</blockTable>
</story>
</document>

View File

@ -1,53 +0,0 @@
<header>
<pageTemplate>
<frame id="first" x1="1.5cm" y1="4cm" height="21.1cm" width="18.5cm"/>
<stylesheet>
<!-- Set here the default font to use for all <para> tags -->
<paraStyle name='Normal' fontName="Helvetica"/>
<paraStyle name="footer" fontName="Helvetica" leading="8" fontSize="7.0" alignment="LEFT"/>
<paraStyle name="footer_rechts" fontName="Helvetica" leading="8" fontSize="7.0" alignment="RIGHT"/>
<paraStyle name="header_fett" fontName="Helvetica-Bold" fontSize="7.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="header" fontName="Helvetica" fontSize="7.0" leading="8" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="Absender" fontName="Helvetica" fontSize="7.0" leading="8" alignment="LEFT" spaceAfter="0.0"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="9.0" leading="11" alignment="LEFT" />
<paraStyle name="fett" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="LEFT"/>
<paraStyle name="ueberschrift" fontName="Helvetica-Bold" fontSize="10.0" leading="19" alignment="LEFT" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="tabelle_header" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER"/>
<paraStyle name="tabelle_header_links" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT"/>
<paraStyle name="tabelle_header_rechts" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT"/>
<paraStyle name="tabelle_daten_center" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER"/>
<paraStyle name="tabelle_daten_links" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT"/>
<paraStyle name="tabelle_daten_links_italic" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT"/>
<paraStyle name="tabelle_daten_rechts" fontName="Helvetica" fontSize="8.0" leading="10" alignment="RIGHT"/>
<paraStyle name="schlussrechnung" fontName="Helvetica" fontSize="9.0" leading="10" alignment="RIGHT"/>
<paraStyle name="schlussrechnung_fett" fontName="Helvetica-Bold" fontSize="9.0" leading="10" alignment="RIGHT"/>
<paraStyle name="skonto" fontName="Helvetica" fontSize="7.0" leading="10" alignment="RIGHT"/>
<!-- Tabellen -->
<blockTableStyle id="Struktur">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<blockTopPadding length="0"/>
<blockBottomPadding length="0"/>
<blockLeftPadding length="0"/>
<blockRightPadding length="0"/>
</blockTableStyle>
<blockTableStyle id="TabelleHaupt">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEBELOW" colorName="#000000" thickness="0.5"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,0" stop="-1,0" thickness="1"/>
<lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="-1,-1" thickness="1"/>
</blockTableStyle>
<blockTableStyle id="TabelleSchlussrechnung">
<blockValign value="MIDDLE"/>
</blockTableStyle>
</stylesheet>
</pageTemplate>
</header>

View File

@ -1,225 +0,0 @@
<?xml version="1.0"?>
<!--
<reports>
<report>purchase.report_purchaseorder</report>
</reports>
-->
<document filename="Purchase Quotation.pdf">
<template pageSize="(595.0,842.0)" title="Purchase Order" author="andreas.brueckl@cmotion.eu" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="15.0" y1="42.0" width="539" height="758"/>
</pageTemplate>
</template>
<story>
<para>
<seqReset id="L1"/>
</para>
<para>[[repeatIn(objects,'o')]] [[ setLang(o.partner_id.commercial_partner_id.lang)]]</para>
<para style="fett">[[ o.partner_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_id.commercial_partner_id.id != o.partner_id.id and o.partner_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_id.zip) or '' ]] [[ (o.partner_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_id.state_id and o.partner_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_id.country_id and o.partner_id.country_id.name) or '' ]]</para>
<blockTable colWidths="100,150" style="Struktur" hAlign="RIGHT">
<tr>
<td>
</td>
<td align="right">
<para style="normal">Ihr Ansprechpartner</para>
<blockTable colWidths="65,165" style="Struktur">
<tr>
<td>
<para style="normal">Name:</para>
</td>
<td>
<para style="normal">[[ (user.name) or '' ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Telefon:</para>
</td>
<td>
<para style="normal">[[ user.partner_id.phone or '' ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">E-Mail:</para>
</td>
<td>
<para style="normal">[[ user.partner_id.email or '' ]]</para>
</td>
</tr>
<tr>
<td>
<spacer length="0.5cm"/>
</td>
<td>
<spacer length="0.5cm"/>
</td>
</tr>
<tr>
<td>
<para style="normal">Datum:</para>
</td>
<td>
<para style="normal">[[ formatLang(time.strftime('%Y-%m-%d'),date=True) ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Referenz:</para>
</td>
<td>
<para style="normal">[[ o.partner_ref or '' ]]</para>
</td>
</tr>
</blockTable>
</td>
</tr>
</blockTable>
<para style="ueberschrift">Bestellung [[ o.name ]]</para>
<spacer length="0.5cm"/>
<blockTable colWidths="30.0, 57, 213.0, 60, 45, 55.0, 60.0" repeatRows="1" style="TabelleHaupt" hAlign="LEFT">
<tr>
<td>
<para style="tabelle_header">Pos</para>
</td>
<td>
<para style="tabelle_header_links">Art.nr.</para>
</td>
<td>
<para style="tabelle_header_links">Bezeichnung</para>
</td>
<td>
<para style="tabelle_header">gepl.</para>
<para style="tabelle_header">Lieferung</para>
</td>
<td>
<para style="tabelle_header">Menge</para>
</td>
<td>
<para style="tabelle_header_rechts">E-Preis</para>
</td>
<td>
<para style="tabelle_header_rechts">G-Preis</para>
</td>
</tr>
<tr>[[repeatIn(o.order_line,'line')]]
<td>
<para style="tabelle_daten_center" leftIndent="0" bulletIndent="0" size="8.0">
<seq id="L1"/>
</para>
</td>
<td>
<para style="tabelle_daten_links">[[ line.product_id and line.product_id.default_code ]]</para>
</td>
<td>
<para style="tabelle_daten_links">[[ (line.name or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((line.name or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="tabelle_daten_links">[[ paragraphs ]]</para>
</section>
<para style="tabelle_daten_links">Ihre Artikelnr.: [[ line.supplier_code or removeParentNode('para')]]</para>
</td>
<td>
<para style="tabelle_daten_center">[[ formatLang(line.date_planned,date=True) ]]</para>
</td>
<td>
<para style="tabelle_daten_center">[[ formatLang(line.product_qty, digits=2)[-2:]=='00' and formatLang(line.product_qty, digits=0) or formatLang(line.product_qty, digits=2) ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ formatLang(line.price_unit, digits=2) ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ formatLang(line.price_subtotal, digits=2) ]]</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="180,205,70, 80" style="TabelleSchlussrechnung">
<tr>[[ o.amount_tax > 0 or removeParentNode('tr') ]]
<td>
<para style="schlussrechnung"></para>
</td>
<td>
<para style="schlussrechnung">Nettobetrag in €:</para>
</td>
<td>
<para style="schlussrechnung">[[o.pricelist_id.currency_id.name]]</para>
</td>
<td>
<para style="schlussrechnung">[[ formatLang(o.amount_untaxed, digits=2)]]</para>
</td>
</tr>
<tr>[[ o.amount_tax > 0 or removeParentNode('tr') ]]
<td>
<para style="schlussrechnung"></para>
</td>
<td>
<para style="schlussrechnung">MwSt. in €:</para>
</td>
<td>
<para style="schlussrechnung">[[ o.pricelist_id.currency_id.name ]]</para>
</td>
<td>
<para style="schlussrechnung">[[ formatLang(o.amount_tax, digits=2) ]]</para>
</td>
</tr>
<tr>
<td>
<para style="schlussrechnung_fett"></para>
</td>
<td>
<para style="schlussrechnung_fett">Gesamt in €:</para>
</td>
<td>
<para style="schlussrechnung_fett">[[ o.pricelist_id.currency_id.name ]]</para>
</td>
<td>
<para style="schlussrechnung_fett">[[ formatLang(o.amount_total,digits=2) ]]</para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<para style="normal">[[ (o.notes or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((o.notes or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="normal">[[ paragraphs ]]</para>
</section>
<spacer length="0.5cm"/>
<blockTable colWidths="110,300" style="Struktur" hAlign="LEFT"> [[o.incoterm_id or removeParentNode('blockTable') ]]
<tr>
<td>
<para style="normal">Lieferbedingung:</para>
</td>
<td>
<para style="normal">[[o.incoterm_id and o.incoterm_id.name or '' ]]</para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
</story>
</document>

View File

@ -1,168 +0,0 @@
<?xml version="1.0"?>
<!--
<reports>
<report>purchase.report_purchasequotation</report>
</reports>
-->
<document filename="Purchase Quotation.pdf">
<template pageSize="(595.0,842.0)" title="Purchase Order" author="andreas.brueckl@cmotion.eu" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="15.0" y1="42.0" width="539" height="758"/>
</pageTemplate>
</template>
<story>
<para>
<seqReset id="L1"/>
</para>
<para>[[repeatIn(objects,'o')]] [[ setLang(o.partner_id.commercial_partner_id.lang)]]</para>
<para style="fett">[[ o.partner_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_id.commercial_partner_id.id != o.partner_id.id and o.partner_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_id.zip) or '' ]] [[ (o.partner_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_id.state_id and o.partner_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_id.country_id and o.partner_id.country_id.name) or '' ]]</para>
<blockTable colWidths="100,150" style="Struktur" hAlign="RIGHT">
<tr>
<td>
</td>
<td align="right">
<para style="normal">Ihr Ansprechpartner</para>
<blockTable colWidths="65,165" style="Struktur">
<tr>
<td>
<para style="normal">Name:</para>
</td>
<td>
<para style="normal">[[ (user.name) or '' ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Telefon:</para>
</td>
<td>
<para style="normal">[[ user.partner_id.phone or '' ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">E-Mail:</para>
</td>
<td>
<para style="normal">[[ user.partner_id.email or '' ]]</para>
</td>
</tr>
<tr>
<td>
<spacer length="0.5cm"/>
</td>
<td>
<spacer length="0.5cm"/>
</td>
</tr>
<tr>
<td>
<para style="normal">Datum:</para>
</td>
<td>
<para style="normal">[[ formatLang(time.strftime('%Y-%m-%d'),date=True) ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Referenz:</para>
</td>
<td>
<para style="normal">[[ o.partner_ref or '' ]]</para>
</td>
</tr>
</blockTable>
</td>
</tr>
</blockTable>
<para style="ueberschrift">Anfrage [[ o.name ]]</para>
<spacer length="0.5cm"/>
<blockTable colWidths="30.0, 57, 328.0, 60, 45" repeatRows="1" style="TabelleHaupt" hAlign="LEFT">
<tr>
<td>
<para style="tabelle_header">Pos</para>
</td>
<td>
<para style="tabelle_header_links">Art.nr.</para>
</td>
<td>
<para style="tabelle_header_links">Bezeichnung</para>
</td>
<td>
<para style="tabelle_header">gepl.</para>
<para style="tabelle_header">Lieferung</para>
</td>
<td>
<para style="tabelle_header">Menge</para>
</td>
</tr>
<tr>[[repeatIn(o.order_line,'line')]]
<td>
<para style="tabelle_daten_center" leftIndent="0" bulletIndent="0" size="8.0">
<seq id="L1"/>
</para>
</td>
<td>
<para style="tabelle_daten_links">[[ line.product_id and line.product_id.default_code ]]</para>
</td>
<td>
<para style="tabelle_daten_links">[[ (line.name or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((line.name or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="tabelle_daten_links">[[ paragraphs ]]</para>
</section>
<para style="tabelle_daten_links">Ihre Artikelnr.: [[ line.supplier_code or removeParentNode('para')]]</para>
</td>
<td>
<para style="tabelle_daten_center">[[ formatLang(line.date_planned,date=True) ]]</para>
</td>
<td>
<para style="tabelle_daten_center">[[ formatLang(line.product_qty, digits=2)[-2:]=='00' and formatLang(line.product_qty, digits=0) or formatLang(line.product_qty, digits=2) ]]</para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<para style="normal">[[ (o.notes or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((o.notes or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="normal">[[ paragraphs ]]</para>
</section>
<spacer length="0.5cm"/>
<blockTable colWidths="110,300" style="Struktur" hAlign="LEFT"> [[o.incoterm_id or removeParentNode('blockTable') ]]
<tr>
<td>
<para style="normal">Lieferbedingung:</para>
</td>
<td>
<para style="normal">[[o.incoterm_id and o.incoterm_id.name or '' ]]</para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
</story>
</document>

View File

@ -1,275 +0,0 @@
<?xml version="1.0"?>
<document filename="Auftrag.pdf">
<template pageSize="(595.0,842.0)" title="Sale Order" author="datenpol gmbh" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="15.0" y1="42.0" width="539" height="758"/>
</pageTemplate>
</template>
<story>
<para>
<seqReset id="L1"/>
</para>
<para>[[repeatIn(objects,'o')]] [[ setLang(o.partner_id.commercial_partner_id.lang)]]</para>
<blockTable colWidths="270,230" style="Struktur">
<tr>
<td>
<section>
<para style="fett">[[ o.partner_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_id.commercial_partner_id.id != o.partner_id.id and o.partner_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_id.zip) or '' ]] [[ (o.partner_id and o.partner_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_id.state_id and o.partner_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_id.country_id and o.partner_id.country_id.name) or '' ]]</para>
<!-- Für Sichtfenster -->
<section>[[ not (o.partner_id.commercial_partner_id and o.partner_id.commercial_partner_id.ref) or removeParentNode('section') ]]
<para style="normal">&#160;</para>
</section>
<section>[[ (o.partner_shipping_id and o.partner_shipping_id.id != o.partner_id.id) or removeParentNode('section')]]
<spacer length="1.5cm"/>
<para style="normal">Lieferadresse:</para>
<para style="normal">[[ o.partner_shipping_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_shipping_id.commercial_partner_id.id != o.partner_shipping_id.id and o.partner_shipping_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_shipping_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_shipping_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_shipping_id.zip) or '' ]] [[ (o.partner_shipping_id and o.partner_shipping_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_shipping_id.state_id and o.partner_shipping_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_shipping_id.country_id and o.partner_shipping_id.country_id.name) or '' ]]</para>
</section>
</section>
<para></para>
</td>
<td>
<blockTable colWidths="85,145" style="Struktur">
<tr>
<td>
<para style="normal">Angebotsdatum:[[ o.state not in ['draft','sent'] and removeParentNode('para') ]]</para>
<para style="normal">Bestelldatum:[[ o.state in ['draft','sent'] and removeParentNode('para') ]]</para>
</td>
<td>
<para style="normal">[[ formatLang(o.date_order,date = True) ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Quelldokument:[[ o.state not in ['draft','sent'] and removeParentNode('tr') ]]</para>
</td>
<td>
<para style="normal">[[ o.origin ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Kundennummer:</para>
</td>
<td>
<para style="normal">[[ o.client_order_ref ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Kunde UID Nr.:</para>
</td>
<td>
<para style="normal">[[ o.partner_id.commercial_partner_id and o.partner_id.commercial_partner_id.vat or '' ]]</para>
</td>
</tr>
<tr>
<td>
<para style="normal">Ansprechpartner:</para>
</td>
<td>
<para style="normal">[[ (o.user_id and o.user_id.name) or '' ]]</para>
</td>
</tr>
</blockTable>
</td>
</tr>
<!--
<tr>
<td>
<section>[[ (o.partner_shipping_id and o.partner_shipping_id.id != o.partner_id.id) or removeParentNode('section')]]
<spacer length="0.5cm"/>
<para style="normal">Lieferadresse:</para>
<para style="normal">[[ o.partner_shipping_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (o.partner_shipping_id.commercial_partner_id.id != o.partner_shipping_id.id and o.partner_shipping_id.name) or '' ]] </para>
<para style="normal">[[ (o.partner_shipping_id.street ) or '']]</para>
<para style="normal">[[ (o.partner_shipping_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (o.partner_shipping_id.zip) or '' ]] [[ (o.partner_shipping_id and o.partner_shipping_id.city) or '' ]]</para>
<para style="normal">[[ (o.partner_shipping_id.state_id and o.partner_shipping_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (o.partner_shipping_id.country_id and o.partner_shipping_id.country_id.name) or '' ]]</para>
</section>
<para style="normal">&#160;</para>
</td>
<td>
<para style="normal">&#160;</para>
</td>
<td>
<para style="normal">&#160;</para>
</td>
</tr>
-->
</blockTable>
<spacer length="1.0cm"/>
<section>
<para style="ueberschrift2"><b>[[ o.state not in ['draft','sent'] and removeParentNode('para') ]] Angebot [[ o.name ]]</b></para>
<para style="ueberschrift2"><b>[[ o.state in ['draft','sent'] and removeParentNode('para') ]] Bestellbestätigung [[ o.name ]]</b></para>
</section>
<spacer length="0.5cm"/>
<blockTable colWidths="30,57,170,75,63,40,75" repeatRows="1" style="TabelleHaupt" hAlign="LEFT">
<tr>
<td>
<para style="tabelle_header">Pos</para>
</td>
<td>
<para style="tabelle_header">Art.nr.</para>
</td>
<td>
<para style="tabelle_header_links">Bezeichnung</para>
</td>
<td>
<para style="tabelle_header_links">Menge</para>
</td>
<td>
<para style="tabelle_header_rechts">Einzelpreis</para>
</td>
<td>
<para style="tabelle_header"></para>
</td>
<td>
<para style="tabelle_header_rechts">Gesamtpreis</para>
</td>
</tr>
<tr>[[repeatIn(o.order_line,'line')]]
<td>
<para style="tabelle_daten_center" leftIndent="0" bulletIndent="0" size="8.0">
<seq id="L1"/>
</para>
</td>
<td>
<para style="tabelle_daten_center">[[ line.product_id and line.product_id.default_code or '']]</para>
</td>
<td>
<para style="tabelle_daten_links">[[ (line.name or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((line.name or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="tabelle_daten_links">[[ paragraphs ]]</para>
</section>
</td>
<td>
<para style="tabelle_daten_links">[[ formatLang(line.product_uos and line.product_uos_qty or line.product_uom_qty, digits=0) ]] [[ line.product_uom.name ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ formatLang(line.price_unit,digits=2) ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ line.discount &lt;&gt; 0 and (formatLang(line.discount) + '%') or '' ]]</para>
</td>
<td>
<para style="tabelle_daten_rechts">[[ formatLang(line.price_subtotal,digits=2 ) ]]</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="210,200,100" style="TabelleSchlussrechnung">
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung">Zwischensumme in €</para>
</td>
<td>
<para style="schlussrechnung">[[ formatLang(o.amount_untaxed,digits=2 )]]</para>
</td>
</tr>
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung">MwSt. in €</para>
</td>
<td>
<para style="schlussrechnung">[[ formatLang(o.amount_tax,digits=2 ) ]]</para>
</td>
</tr>
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung_fett">Rechnungsbetrag in €</para>
</td>
<td>
<para style="schlussrechnung_fett">[[ formatLang(o.amount_total,digits=2 ) ]]</para>
</td>
</tr>
<tr>
<td>
<para></para>
</td>
<td>
<para style="schlussrechnung">Rechnungsbetrag inkl. Skonto in €</para>
</td>
<td>
<para style="schlussrechnung">[[ (o.skonto_betrag_inkl and formatLang(o.skonto_betrag_inkl,digits=2)) or removeParentNode('tr') ]]</para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<para style="normal">[[ (o.note or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((o.note or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="normal">[[ paragraphs ]]</para>
</section>
<spacer length="0.5cm"/>
<blockTable colWidths="110,390" style="Struktur" hAlign="LEFT">
<tr>
<td>
<para style="normal">Zahlungsbedingungen:</para>
</td>
<td>
<para style="normal">[[ (o.payment_term and o.payment_term.note) or removeParentNode('blockTable') ]]</para>
</td>
</tr>
</blockTable>
<!--
<spacer length="0.5cm"/>
<blockTable colWidths="500" style="Struktur" hAlign="LEFT">
<tr>
<td>
<para style="normal"></para>
</td>
</tr>
<tr>[[ o.date_due and o.payment_term and o.payment_term.skonto_prozent or removeParentNode('tr') ]]
<td>
<para style="normal">Zahlbar bis [[ formatLang(o.skonto_faelligkeit,date = True) ]] abzüglich [[ formatLang(o.payment_term.skonto_prozent,digits=2) ]]% beträgt [[ formatLang(o.skonto_betrag_inkl,digits=2) ]]€.</para>
</td>
</tr>
<tr>[[ o.date_due or removeParentNode('tr') ]]
<td>
<para style="normal">Zahlbar bis [[ formatLang(o.date_due,date = True) ]] ohne Abzug.</para>
</td>
</tr>
</blockTable>
-->
</story>
</document>

View File

@ -1,101 +0,0 @@
<?xml version="1.0"?>
<document filename="Lieferschein.pdf">
<template pageSize="(595.0,842.0)" title="Sale Order" author="datenpol gmbh" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="15.0" y1="42.0" width="539" height="758"/>
</pageTemplate>
</template>
<story>
<para>
<seqReset id="L1"/>
</para>
<para>[[ repeatIn(objects,'picking') ]] [[ picking.partner_id and setLang(picking.partner_id.lang) ]]</para>
<blockTable colWidths="270,85,145" style="Struktur">
<tr>
<td>
<section>
<para style="fett">[[ picking.partner_id.commercial_partner_id.name ]]</para>
<para style="normal">[[ (picking.partner_id.commercial_partner_id.id != picking.partner_id.id and picking.partner_id.name) or '' ]] </para>
<para style="normal">[[ (picking.partner_id.street ) or '']]</para>
<para style="normal">[[ (picking.partner_id.street2) or removeParentNode('para') ]]</para>
<para style="normal">[[ (picking.partner_id.zip) or '' ]] [[ (picking.partner_id and picking.partner_id.city) or '' ]]</para>
<para style="normal">[[ (picking.partner_id.state_id and picking.partner_id.state_id.name) or removeParentNode('para')]]</para>
<para style="normal">[[ (picking.partner_id.country_id and picking.partner_id.country_id.name) or '' ]]</para>
<!-- Für Sichtfenster -->
<section>[[ not (picking.partner_id.commercial_partner_id and picking.partner_id.commercial_partner_id.ref) or removeParentNode('section') ]]
<para style="normal">&#160;</para>
</section>
</section>
<para></para>
</td>
<td>
<para style="normal">Datum:</para>
<para style="normal">Bestellung:</para>
<para style="normal">Kundenreferenz:</para>
<para style="normal">Kundennr.:</para>
</td>
<td>
<para style="normal">[[ formatLang(picking.date_done, date=True) or formatLang(time.strftime('%Y-%m-%d'),date=True) ]]&#160;</para>
<para style="normal">[[ picking.origin ]]&#160;</para>
<para style="normal">[[ picking.sale_id and picking.sale_id.client_order_ref or '' ]]&#160;</para>
<para style="normal">[[ picking.partner_id and picking.partner_id.commercial_partner_id and picking.partner_id.commercial_partner_id.ref or '' ]]&#160;</para>
</td>
</tr>
</blockTable>
<spacer length="1.0cm"/>
<para style="ueberschrift">Lieferschein [[ picking.name ]]</para>
<spacer length="0.5cm"/>
<blockTable colWidths="30,80,304,80" repeatRows="1" style="TabelleHaupt" hAlign="LEFT">
<tr>
<td>
<para style="tabelle_header">Pos</para>
</td>
<td>
<para style="tabelle_header">Art.nr.</para>
</td>
<td>
<para style="tabelle_header_links">Bezeichnung</para>
</td>
<td>
<para style="tabelle_header">Menge</para>
</td>
</tr>
<tr>[[ repeatIn([line for line in picking.move_lines if line.state &lt;&gt; 'cancel'],'move_lines') ]]
<td>
<para style="tabelle_daten_center" leftIndent="0" bulletIndent="0" size="8.0">
<seq id="L1"/>
</para>
</td>
<td>
<para style="tabelle_daten_center">[[ move_lines.product_id.default_code ]]</para>
</td>
<td>
<para style="tabelle_daten_links">[[ (move_lines.name or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((move_lines.name or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="tabelle_daten_links">[[ paragraphs ]]</para>
</section>
</td>
<td>
<para style="tabelle_daten_center">[[ formatLang(move_lines.product_qty, digits=0) ]] </para>
</td>
</tr>
</blockTable>
<spacer length="0.5cm"/>
<para style="normal">[[ (picking.note or '').split('\n\n')[0] ]]</para>
<section>[[ repeatIn((picking.note or '').split('\n\n')[1:],'paragraphs') ]]
<spacer length="0.4cm"/>
<para style="normal">[[ paragraphs ]]</para>
</section>
</story>
</document>

View File

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="sale.report_sale_order" model="ir.actions.report.xml">
<field name="report_rml">cam_reports/report/sale.order.rml</field>
<field name="report_type">pdf</field>
</record>
<record id="stock.action_report_picking" model="ir.actions.report.xml">
<field name="report_rml">cam_reports/report/stock.picking.rml</field>
<field name="report_type">pdf</field>
</record>
<record id="account.account_invoices" model="ir.actions.report.xml">
<field name="report_rml">cam_reports/report/account.invoice.rml</field>
<field name="report_type">pdf</field>
</record>
<record id="purchase.report_purchase_quotation" model="ir.actions.report.xml">
<field name="report_rml">cam_reports/report/purchase.quotation.rml</field>
<field name="report_type">pdf</field>
</record>
<record id="purchase.action_report_purchase_order" model="ir.actions.report.xml">
<field name="report_rml">cam_reports/report/purchase.order.rml</field>
<field name="report_type">pdf</field>
</record>
<record id="mrp.action_report_production_order" model="ir.actions.report.xml">
<field name="report_rml">cam_reports/report/mrp.production.rml</field>
<field name="report_type">pdf</field>
</record>
</data>
</openerp>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 controllers
import report
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,46 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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': 'Test Environment',
'version': '1.0',
'category': 'Custom',
'description': """
Test Environment
===========================
* Shows the message "Test" in the background if the database matches the regular expression of the config paramter "dbfilter_test"
* Default filter: test*
* Example: dbfilter_test = ['.*',] # for all Databases
* Example: dbfilter_test = ['db1','db2'] # only for databases 'db1' and 'db2'
""",
'author': 'camadeus Consulting GmbH',
'website': 'http://www.camadeus.at',
'depends': ['report', 'web', 'base'],
'data': [
'views/cam_testenv.xml',
],
'update_xml': [],
'demo_xml': [],
'installable': True,
'active': False,
}

View File

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 testenv_controller
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,67 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 re
import openerp
from openerp.tools.translate import _
from openerp.tools import config
from openerp.addons.web import http
from openerp.addons.web.controllers.main import Home
from openerp.http import request
class Home_Debug(Home):
@http.route('/', type='http', auth="none")
def index(self, s_action=None, db=None, **kw):
# Check arguments
if openerp.tools.config.get('show_debug', False):
return http.local_redirect('/web?debug=1', query=request.params, keep_hash=True)
else:
return http.local_redirect('/web', query=request.params, keep_hash=True)
class WebClient(http.Controller):
_cp_path = "/web/testenv"
@http.jsonrequest
def testmode(self, req, db=False):
if not db and req and req.session:
db = req.session._db
if db:
h = req.httprequest.environ['HTTP_HOST'].split(':')[0]
d = h.split('.')[0]
r = openerp.tools.config.get('dbfilter_test', 'test.*').replace('%h', h).replace('%d', d)
try:
pattern_list = eval(r)
if not hasattr(pattern_list, '__iter__'):
pattern_list = [pattern_list]
except:
pattern_list = [r]
for pattern in pattern_list:
if isinstance(pattern, str) and re.match(pattern, db):
return True
return False
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,49 +0,0 @@
# -*- coding: utf-8 -*-
#
# Odoo Extension Module
# Copyright (C) 2014-2016 Camadeus GmbH (<http://www.camadeus.at>)
#
# 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 re
import openerp
from openerp import models
import logging
_logger = logging.getLogger(__name__)
class Report(models.Model):
_inherit = "report"
def render(self, cr, uid, ids, template, values=None, context=None):
testmode = {'testmode': False}
r = openerp.tools.config.get('dbfilter_test', 'test.*')
try:
pattern_list = eval(r)
if not hasattr(pattern_list, '__iter__'):
pattern_list = [pattern_list]
except:
pattern_list = [r]
for pattern in pattern_list:
if isinstance(pattern, str) and re.match(pattern, cr.dbname):
testmode = {'testmode': True}
_logger.info('testmode enabled for reports')
if not values:
values = {}
values.update(testmode)
return super(Report, self).render(cr, uid, ids, template, values, context)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,20 +0,0 @@
.test-mode-activated .oe_view_manager_wrapper {
background-image: url("/cam_testenv/static/src/img/back-testenv.jpg");
background-size: cover;
background-attachment: fixed;
}
.test-mode-activated .oe_view_manager_body,
.test-mode-activated .oe_view_manager_wrapper > * {
opacity: 0.9;
background: rgba(255,255,255,.8) !important;
}
.test-mode-activated .oe_list_field {
opacity: 1;
}
.test-mode-activated .oe_leftbar > * ,
.test-mode-activated .oe_view_manager_header > *{
background: lightblue;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 744.09448819 1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="print_test.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-320.71429"
inkscape:cy="634.28571"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:snap-text-baseline="false"
inkscape:window-width="1863"
inkscape:window-height="1176"
inkscape:window-x="57"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:334.50509644px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.20114942;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
x="-541.57294"
y="739.65405"
id="text3336"
sodipodi:linespacing="125%"
transform="matrix(0.57726416,-0.80650188,0.81188871,0.59801083,0,0)"><tspan
sodipodi:role="line"
id="tspan3338"
x="-541.57294"
y="739.65405">Test</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="200mm"
height="234mm"
viewBox="0 0 708.66142 829.13385"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="print_test_n.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-320.71429"
inkscape:cy="634.28571"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:snap-text-baseline="false"
inkscape:window-width="1863"
inkscape:window-height="1176"
inkscape:window-x="57"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-223.22835)">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:252.86198425px;line-height:125%;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#dddddf;fill-opacity:0.94117647;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="-639.02655"
y="739.08575"
id="text3336"
sodipodi:linespacing="125%"
transform="matrix(0.55246707,-0.84270113,0.77701305,0.62485212,0,0)"><tspan
sodipodi:role="line"
id="tspan3338"
x="-639.02655"
y="739.08575">TEST</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,32 +0,0 @@
openerp.cam_testenv = function (openerp) {
openerp.web.WebClient = openerp.web.WebClient.extend({
/**
* Test env
*/
start: function() {
var self = this;
return $.when(this._super()).then(function() {
//this._super();
db = null
if (jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).db !== undefined) {
db = jQuery.deparam(jQuery.param.querystring()).db
}
self.rpc("/web/testenv/testmode", {'db': db}).done(function(result) {
// If immediately follows a login (triggered by trying to restore
// an invalid session or no session at all), refresh session data
// (should not change, but just in case...)
if (result) {
$("body").addClass("test-mode-activated");
// $("body").css("background-image", "url(" + openerp.session.origin + "/cam_testenv/static/src/img/back-testenv.jpg" + ")");
}
});
});
}
});
}

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- vim:fdn=3:
-->
<openerp>
<data>
<template id="assets_backend" name="testenv_assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/cam_testenv/static/src/css/testenv.css"/>
<script type="text/javascript" src="/cam_testenv/static/src/js/testenv.js"></script>
</xpath>
</template>
<template id="report.style">
body {
color: #000 !important;
word-wrap: break-word;
}
.border-black td {
border-top: 1px solid black !important;
}
.table-condensed > thead > tr > th {
border-bottom: 1px solid black !important;
}
.table-condensed > tbody > tr {
page-break-inside: avoid !important;
}
.zero_min_height {
min-height: 0px !important;
}
<t t-if="testmode">
div.page {
background-image: url("/cam_testenv/static/src/img/print_test_n.svg") !important;
background-repeat: repeat-y;
background-size: contain;
background-position: center center;
min-height: 234mm;
}
</t>
</template>
</data>
</openerp>

View File

@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 cam_work_order
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,40 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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': 'Camadeus Produktionsschein',
'category': 'Custom',
'version': '1.0',
'description': """Produktionsschein für die Arbeitsausführung""",
'author': 'camadeus GmbH',
'website': 'http://www.camadeus.at',
'depends': ['sale'],
'data': [
'cam_work_order_view.xml',
'cam_work_order_data.xml',
'security/ir.model.access.csv',
],
'installable': True,
'auto_install': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,162 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 openerp.osv import fields, osv
from openerp import api
from openerp.tools.translate import _
from openerp import SUPERUSER_ID
from openerp import tools
from lxml import etree
class sale_order(osv.osv):
_inherit = 'sale.order'
_columns = {
'work_order_ids': fields.one2many('work.order','sale_id','Produktionsscheine'),
}
def action_view_work_order(self, cr, uid, ids, context=None):
mod_obj = self.pool.get('ir.model.data')
act_obj = self.pool.get('ir.actions.act_window')
result = mod_obj.get_object_reference(cr, uid, 'cam_work_order', 'work_order_action')
id = result and result[1] or False
result = act_obj.read(cr, uid, [id], context=context)[0]
#compute the number of work orders to display
work_ids = []
for so in self.browse(cr, uid, ids, context=context):
work_ids += [order.id for order in so.work_order_ids]
#choose the view_mode accordingly
if len(work_ids) > 1:
result['domain'] = "[('id','in',[" + ','.join(map(str, work_ids)) + "])]"
else:
res = mod_obj.get_object_reference(cr, uid, 'cam_custom', 'work_order_form')
result['views'] = [(res and res[1] or False, 'form')]
result['res_id'] = work_ids and work_ids[0] or False
return result
def button_work_order(self, cr, uid, ids, context=None):
assert len(ids) == 1 #'This option should only be used for a single id at a time.'
order = self.browse(cr, uid, ids[0], context=context)
existing_ids = self.pool.get('work.order').search(cr, uid, [('sale_id','=',order.id)])
if existing_ids:
work_id = existing_ids[0]
else:
lines = []
for l in order.order_line:
line = {
'name': l.name,
'qty': l.product_uom_qty,
}
lines.append((0,0,line))
vals = {
'partner_id': order.partner_id.id,
'sale_id': order.id,
'line_ids': lines,
}
work_id = self.pool.get('work.order').create(cr, uid, vals, context=context)
return {
'type': 'ir.actions.act_window',
'name': _('Produktionsschein'),
'res_model': 'work.order',
'res_id': work_id,
'view_type': 'form',
'view_mode': 'form',
'target': 'current',
'nodestroy': True,
}
class work_order_line(osv.Model):
_name = 'work.order.line'
_description = 'Arbeitsposition'
_order = 'seq, id'
_columns = {
'seq': fields.integer('Sequenz'),
'name': fields.text('Bezeichnung', size=30, required=True),
'qty': fields.float('Stück'),
'order_id': fields.many2one('work.order', required=True, ondelete='cascade'),
}
class work_order_stage(osv.osv):
_name = "work.order.stage"
_description = "Stage of work order"
_order = "sequence, id"
_columns = {
'name': fields.char('Stage Name', required=True, translate=True),
'sequence': fields.integer('Sequence', help="Used to order stages. Lower is better."),
'fold': fields.boolean('Folded in Kanban View', help='This stage is folded in the kanban view when there are no records in that stage to display.'),
}
_defaults = {
'sequence': 1,
'fold': False,
}
class work_order(osv.Model):
_name = 'work.order'
_description = 'Produktionsschein'
_inherit = ['mail.thread']
_columns = {
'name': fields.char('Bezeichnung', size=30, required=True),
'sale_id': fields.many2one('sale.order', 'Verkaufsauftrag', required=True),
'partner_id': fields.many2one('res.partner', 'Kunde', required=True),
'parter_id_street': fields.related('partner_id', 'street', type="char", relation="res.partner", string="Strasse", store=False),
'parter_id_zip': fields.related('partner_id', 'zip', type="char", relation="res.partner", string="Postleitzahl", store=False),
'parter_id_city': fields.related('partner_id', 'city', type="char", relation="res.partner", string="Stadt", store=False),
'user_id': fields.many2one('res.users', 'Bearbeiter'),
'stage_id': fields.many2one('work.order.stage', 'Status', track_visibility='onchange', select=True),
'date_of_creation': fields.date('Erstellungsdatum'),
'line_ids': fields.one2many('work.order.line', 'order_id', 'Positionen', copy=True),
'work_date': fields.char('Produktionsstermin',size=120),
'work_address': fields.text('Produktionsadresse'),
'graphic_text': fields.text('Anmerkungen'),
}
def _get_default_stage_id(self, cr, uid, context=None):
""" Gives default stage_id """
return self.pool.get('work.order.stage').search(cr, uid, [], context=context)[0]
_defaults = {
'name': '/',
'date_of_creation': fields.date.context_today,
'stage_id': lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c),
}
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
if vals.get('name', '/') == '/':
vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'work.order') or '/'
new_id = super(work_order, self).create(cr, uid, vals, context=context)
return new_id
def print_quotation(self, cr, uid, ids, context=None):
'''
This function prints the work order
'''
return self.pool['report'].get_action(cr, uid, ids, 'cam_reports.report_workorder', context=context)

View File

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- Sequences for work.order -->
<record id="seq_type_work_order" model="ir.sequence.type">
<field name="name">Work Order</field>
<field name="code">work.order</field>
</record>
<record id="seq_work_order" model="ir.sequence">
<field name="name">Work Order</field>
<field name="code">work.order</field>
<field name="prefix">PS-</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
<!-- Status values for work order-->
<record id="work_order_stage_1" model="work.order.stage">
<field name="name">Neu</field>
<field name="sequence">1</field>
<field name="fold">False</field>
</record>
<record id="work_order_stage_2" model="work.order.stage">
<field name="name">In Bearbeitung</field>
<field name="sequence">2</field>
<field name="fold">False</field>
</record>
<record id="work_order_stage_3" model="work.order.stage">
<field name="name">Bereit für Produktion</field>
<field name="sequence">3</field>
<field name="fold">False</field>
</record>
<record id="work_order_stage_4" model="work.order.stage">
<field name="name">Terminisiert</field>
<field name="sequence">4</field>
<field name="fold">False</field>
</record>
<record id="work_order_stage_5" model="work.order.stage">
<field name="name">Erledigt</field>
<field name="sequence">5</field>
<field name="fold">False</field>
</record>
</data>
</openerp>

View File

@ -1,211 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Form Arbeitschein-->
<record id="work_order_form" model="ir.ui.view">
<field name="name">work_order_form</field>
<field name="model">work.order</field>
<field name="arch" type="xml">
<form string="Produktionsschein" version="7.0">
<header>
<button name="print_quotation" string="Drucken" type="object"/>
<field name="stage_id" widget="statusbar" clickable="True"/>
</header>
<sheet>
<h1>
<field name="name" class="oe_inline" attrs="{'invisible': [('name','=','/')]}" readonly="1"/>
</h1>
<group>
<group>
<field name="partner_id" context="{'show_address': 1}" options="{&quot;always_reload&quot;: True, &quot;highlight_first_line&quot;: True}"/>
<field name="user_id"/>
</group>
<group>
<field name="date_of_creation"/>
<field name="work_date"/>
<field name="work_address"/>
<field name="sale_id"/>
</group>
</group>
<group string="Anmerkungen" colspan="2">
<field name="graphic_text" nolabel="1"/>
</group>
<notebook>
<page string="Positionen">
<field name="line_ids">
<tree editable="top">
<field name="seq" widget="handle"/>
<field name="name"/>
<field name="qty"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- Arbeitschein Kanban -->
<record id="work_order_kanban" model="ir.ui.view">
<field name="name">work_order_kanban</field>
<field name="model">work.order</field>
<field name="type">kanban</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id">
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div class="oe_dropdown_toggle oe_dropdown_kanban">
<span class="oe_e">í</span>
<ul class="oe_dropdown_menu">
<t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit...</a></li></t>
<t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
</ul>
</div>
<div class="oe_kanban_content">
<div>
<b><field name="name"/></b>
</div>
<div>
<field name="partner_id"/><br/>
&#160;<field name="parter_id_street"/><br/>
&#160;<field name="parter_id_zip"/> <field name="parter_id_city"/>
</div>
<div>
<i><field name="work_date"/></i>
</div>
</div>
<div class="oe_clear"></div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Arbeitschein Search -->
<record id="work_order_search" model="ir.ui.view">
<field name="name">work_order_search</field>
<field name="model">work.order</field>
<field name="arch" type="xml">
<search string="Produktionsschein">
<field name="name"/>
<field name="partner_id"/>
<field name="user_id"/>
<separator/>
<group expand="0" string="Group By">
<filter string="Kunden" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Bearbeiter" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Status" domain="[]" context="{'group_by':'stage_id'}"/>
</group>
</search>
</field>
</record>
<!-- Arbeitschein Tree -->
<record id="work_order_tree" model="ir.ui.view">
<field name="name">work_order_tree</field>
<field name="model">work.order</field>
<field name="arch" type="xml">
<tree string="Produktionsschein">
<field name="name"/>
<field name="partner_id"/>
<field name="sale_id"/>
<field name="user_id"/>
<field name="stage_id"/>
</tree>
</field>
</record>
<!-- Action Arbeitsschein -->
<record id="work_order_action" model="ir.actions.act_window">
<field name="name">Produktionsscheine</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">work.order</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Hier klicken um einen neuen Produktionsschein zu erstellen.
</p><p>
Verwaltung von Produktionsscheinen.
</p>
</field>
</record>
<!-- Form Arbeitschein Status -->
<record id="work_order_stages_form" model="ir.ui.view">
<field name="name">work_order_stages_form</field>
<field name="model">work.order.stage</field>
<field name="arch" type="xml">
<form string="Status" version="7.0">
<header/>
<sheet>
<h1>
<field name="name" class="oe_inline"/>
</h1>
<group>
<group>
<field name="sequence"/>
</group>
<group>
<field name="fold"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- Action Arbeitsschein Status -->
<record id="work_order_stages_action" model="ir.actions.act_window">
<field name="name">Status</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">work.order.stage</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Hier klicken um einen neuen Status für Produktionsschein zu erstellen.
</p><p>
Verwaltung von Status von Produktionsscheinen.
</p>
</field>
</record>
<!-- Menüeinträge -->
<menuitem id="work_order_main" name="Produktionsscheine" sequence="21"/>
<menuitem id="work_order_sub" parent="work_order_main" name="Produktionsscheine" sequence="10"/>
<menuitem id="work_config" parent="work_order_main" name="Konfiguration" sequence="50"/>
<menuitem action="work_order_action" id="work_order_menu" parent="work_order_sub" sequence="10"/>
<menuitem action="work_order_stages_action" id="work_stages_menu" parent="work_config" sequence="10"/>
<!-- Adaption for Sale order -->
<record id="view_order_work_form" model="ir.ui.view">
<field name="name">view_order_work_form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<button string="Create Invoice" position="after">
<field name="work_order_ids" invisible="1"/>
<button name="action_view_work_order" string="Zeige Produktionsschein" type="object" class="oe_highlight"
attrs="{'invisible': ['|',('work_order_ids','=',False),('work_order_ids','=',[])]}" groups="base.group_user"/>
<button name="button_work_order" string="Erzeuge Produktionsschein" type="object" class="oe_highlight"
attrs="{'invisible': ['|',('state','not in',['manual','progress']),('work_order_ids','!=',[])]}"/>
</button>
</field>
<field name="priority">17</field>
</record>
</data>
</openerp>

View File

@ -1,5 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
modify_work_order,modify_order_sale_user,model_work_order,base.group_sale_salesman,1,1,1,1
modify_work_order_line,modify_order_line_sale_user,model_work_order_line,base.group_sale_salesman,1,1,1,1
access_work_category,work_category_user,model_work_category,base.group_sale_salesman,1,0,0,0
modify_work_category,work_category_manager,model_work_category,base.group_sale_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 modify_work_order modify_order_sale_user model_work_order base.group_sale_salesman 1 1 1 1
3 modify_work_order_line modify_order_line_sale_user model_work_order_line base.group_sale_salesman 1 1 1 1
4 access_work_category work_category_user model_work_category base.group_sale_salesman 1 0 0 0
5 modify_work_category work_category_manager model_work_category base.group_sale_manager 1 1 1 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -19,5 +19,7 @@
#
##############################################################################
import models
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,8 +1,13 @@
# -*- coding: utf-8 -*-
##############################################################################
#
<<<<<<< HEAD:ext/custom-addons/cam_custom/__openerp__.py
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>).
=======
# datenpol gmbh
# Copyright (C) 2013-TODAY datenpol gmbh(<http://www.datenpol.at>)
>>>>>>> 10.0:ext/custom-addons/dp_custom/__openerp__.py
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -21,17 +26,16 @@
{
'name': 'datenpol-Anpassungen',
'category': 'Custom',
'name': 'datenpol Anpassungen',
'category': 'Custom',
'version': '1.0',
'description': """Individuelle Anpassungen""",
'author': 'datenpol gmbh',
'website': 'http://www.datenpol.at/',
'depends': ['sale','mail','product','account','knowledge'],
'website': 'http://www.datenpol.at',
'depends': ['base'],
'data': [
'cam_custom_view.xml',
'cam_custom_data.xml',
'views/custom_theme.xml',
'data/dp_custom_data.xml',
'views/dp_custom_view.xml',
'security/ir.model.access.csv',
],
'installable': True,

View File

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="0">
<!-- UNITS -->
<!-- Einheit in Stück umbenennen -->
<record id="product.product_uom_unit" model="product.uom">
<field name="name">Stück</field>
</record>
<!-- 100 Stk. -->
<record id="product_uom_unit_100" model="product.uom">
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="name">100 Stk.</field>
<field name="factor_inv" eval="100"/>
<field name="uom_type">bigger</field>
</record>
<!-- 1000 Stk. -->
<record id="product_uom_unit_1000" model="product.uom">
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="name">1000 Stk.</field>
<field name="factor_inv" eval="1000"/>
<field name="uom_type">bigger</field>
</record>
<!-- Rolle -->
<record id="product_uom_rolle" model="product.uom">
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="name">Rolle(n)</field>
</record>
<!-- Satz -->
<record id="product_uom_satz" model="product.uom">
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="name">Satz</field>
</record>
<!-- Arbeitstag -->
<record id="product_uom_arbeitstag" model="product.uom">
<field name="category_id" ref="product.uom_categ_wtime"/>
<field name="name">Arbeitstag</field>
</record>
<!-- MM -->
<record id="product_uom_mm" model="product.uom">
<field name="category_id" ref="product.uom_categ_length"/>
<field name="name">mm</field>
<field name="factor" eval="0.001"/>
<field name="uom_type">smaller</field>
</record>
<!-- M2 Quadratmeter Category-->
<record id="uom_categ_m2" model="product.uom.categ">
<field name="name">Quadratm.</field>
</record>
<!-- M2, Quadratmeter -->
<record id="product_uom_m2" model="product.uom">
<field name="name"></field>
<field name="category_id" ref="uom_categ_m2"/>
<field name="factor" eval="1.0"/>
<field name="rounding" eval="1"/>
</record>
<!-- M3 Quadratmeter Category-->
<record id="uom_categ_m3" model="product.uom.categ">
<field name="name">Kubikm.</field>
</record>
<!-- M3, Kubikmeter -->
<record id="product_uom_m3" model="product.uom">
<field name="name">Kubikm.</field>
<field name="category_id" ref="uom_categ_m3"/>
<field name="factor" eval="1.0"/>
<field name="rounding" eval="1"/>
</record>
<!-- PKG -->
<record id="product_uom_pkt" model="product.uom">
<field name="name">Paket(e)</field>
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="factor" eval="1.0"/>
<field name="rounding" eval="1"/>
</record>
<!-- Paar -->
<record id="product_uom_paar" model="product.uom">
<field name="name">Paar(e)</field>
<field name="category_id" ref="product.product_uom_categ_unit"/>
<field name="factor" eval="1.0"/>
<field name="rounding" eval="1"/>
</record>
<!-- Minuten -->
<record id="product_uom_min" model="product.uom">
<field name="category_id" ref="product.uom_categ_wtime"/>
<field name="name">min</field>
</record>
<!-- Variantenattribut Größe -->
<record id="prod_attr_size" model="product.attribute">
<field name="name">Größe</field>
<field name="type">radio</field>
<field name="sequence" eval="10"/>
</record>
<!-- Verpackungseiheiten -->
<!-- TODO Rolle type in product_ul selection ergänzen -->
<!-- Ausprägungen hier...? -->
<!-- <record id="product_ul_box" model="product.ul">
<field name="name">Box</field>
<field name="type">box</field>
</record> -->
<!--
'name' : fields.char('Name', select=True, required=True, translate=True),
'type' : fields.selection([('unit','Unit'),('pack','Pack'),('box', 'Box'), ('pallet', 'Pallet')], 'Type', required=True),
'height': fields.float('Height', help='The height of the package'),
'width': fields.float('Width', help='The width of the package'),
'length': fields.float('Length', help='The length of the package'),
'weight': fields.float('Empty Package Weight'), -->
</data>
</openerp>

View File

@ -6,8 +6,8 @@
msgid ""
msgstr ""
"Project-Id-Version: camadeus\n"
"Report-Msgid-Bugs-To: Andreas Brueckl <andreas.brueckl@camadeus.at>\n"
"Project-Id-Version: datenpol\n"
"Report-Msgid-Bugs-To: Andreas Brueckl <andreas.brueckl@datenpol.at>\n"
"POT-Creation-Date: 2014-09-23 16:26+0000\n"
"PO-Revision-Date: 2014-08-14 16:14+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
@ -18,8 +18,3 @@ msgstr ""
"X-Launchpad-Export-Date: 2014-09-24 09:44+0000\n"
"X-Generator: Launchpad (build 17196)\n"
#. module: cam_custom
#: field:product.product,default_code:0
#: field:product.template,default_code:0
msgid "Internal Reference"
msgstr "Artikelnummer"

View File

@ -19,6 +19,7 @@
#
##############################################################################
import cam_custom
import ir_ui_menu
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# datenpol gmbh
# Copyright (C) 2013-TODAY datenpol gmbh(<http://www.datenpol.at>)
#
# 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 openerp import fields, models
from openerp import api
from openerp.tools.translate import _
from openerp import SUPERUSER_ID
from openerp import tools
from lxml import etree
DISABLED_MENUS = [
]
class ir_ui_menu(models.Model):
_inherit = 'ir.ui.menu'
@tools.ormcache(skiparg=2)
def get_disabled_menu_ids(self, cr, uid, context=None):
data_obj = self.pool.get('ir.model.data')
menu_ids = []
for menu in DISABLED_MENUS:
module,xml_id = menu.split('.')
menu = data_obj.get_object(cr, uid, module, xml_id)
if menu:
menu_ids.append(menu.id)
return menu_ids
def _filter_visible_menus(self, cr, uid, ids, context=None):
if uid != 1:
disabled_ids = self.get_disabled_menu_ids(cr, uid)
ids = [id for id in ids if id not in disabled_ids]
ids = super(ir_ui_menu, self)._filter_visible_menus(cr, uid, ids, context)
return ids

View File

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,5 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
</data>
</openerp>

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
{
'name': 'datepol Report Anpassungen',
'category': 'Custom',
'version': '1.0',
'summary': """Individuelle Report Anpassungen""",
'description': """Individuelle Report Anpassungen""",
'author': 'datenpol gmbh',
'website': 'http://www.datenpol.at',
'depends': ['base'],
'data': [
# 'security/ir.model.access.csv',
'views/layouts.xml',
'views/saleorder.xml',
'views/invoice.xml',
'views/delivery.xml',
],
# only loaded in demonstration mode
'demo': [],
'installable': True,
'auto_install': False,
}

View File

@ -0,0 +1,19 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * dp_report
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-12 09:17+0000\n"
"PO-Revision-Date: 2016-10-13 11:58+0000\n"
"Last-Translator: datenpol\n"
"Language-Team: German (http://www.transifex.com/odoo/odoo-9/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@ -0,0 +1,75 @@
<openerp>
<data>
<!-- Delivery Body -->
<template id="report_delivery_document" inherit_id="delivery.report_delivery_document2">
<h2 position="replace">
<h2>
LIEFERSCHEIN <span t-field="o.name"/>
</h2>
</h2>
<table class="table table-condensed" position="replace">
<table class="table table-condensed">
<thead>
<tr>
<th name="td_sched_date_h"><strong>Scheduled Date</strong></th>
<th><strong>Weight</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td name="td_sched_date">
<span t-field="o.min_date"/>
</td>
<td>
<span t-field="o.weight"/> kg
</td>
</tr>
</tbody>
</table>
</table>
<xpath expr="//table[@t-if='not o.pack_operation_ids']/thead" position="replace">
<thead>
<tr>
<th><strong>Product</strong></th>
<th><strong>Location</strong></th>
<th class="text-right"><strong>Quantity</strong></th>
</tr>
</thead>
</xpath>
<xpath expr="//table[@t-if='not o.pack_operation_ids']/tbody/tr/td/span[@t-field='move.state']" position="replace"/>
<xpath expr="//table[@t-if='o.pack_operation_ids']/thead" position="replace">
<thead>
<tr>
<th><strong>Product</strong></th>
<th t-if="has_serial_number"><strong>Serial Number</strong></th>
<th><strong>Location</strong></th>
<th class="text-right"><strong>Quantity</strong></th>
</tr>
</thead>
</xpath>
<xpath expr="//table[@t-if='o.pack_operation_ids']/tbody/tr/td[2]" position="replace"/>
</template>
<!-- Render Report with Header -->
<template id="stock.report_deliveryslip">
<t t-set="header" t-value="1"/>
<t t-foreach="docs" t-as="o">
<t t-call="dp_report.report_delivery_document" t-lang="o.partner_id.lang"/>
</t>
</template>
<!-- Render Report without Header -->
<template id="report_deliveryslip_blank">
<t t-set="header" t-value="0"/>
<t t-foreach="docs" t-as="o">
<t t-call="dp_report.report_delivery_document" t-lang="o.partner_id.lang"/>
</t>
</template>
<!-- Create new Report -->
<report id="dp_report_deliveryslip_blank"
string="Lieferschein Ohne Logo"
model="stock.picking"
report_type="qweb-pdf"
name="dp_report.report_deliveryslip_blank"
file="dp_report.report_deliveryslip_blank"/>
</data>
</openerp>

View File

@ -0,0 +1,65 @@
<openerp>
<data>
<!-- Invoice Body -->
<template id="report_invoice_document" inherit_id="account.report_invoice_document">
<th t-if="display_discount" position="replace">
<th t-if="display_discount and o.sale_order_id.print_discount" class="text-right" groups="sale.group_discount_per_so_line">Disc.(%)</th>
</th>
<td t-if="display_discount" position="replace">
<td t-if="display_discount and o.sale_order_id.print_discount" class="text-right" groups="sale.group_discount_per_so_line">
<span t-field="l.discount"/>
</td>
</td>
<div t-if="o.date_invoice" position="replace">
<div class="col-xs-2" t-if="o.date_invoice">
<strong>Invoice Date:</strong>
<p t-field="o.date_invoice"/>
</div>
</div>
<div t-if="o.origin" position="replace">
<div class="col-xs-2" t-if="o.origin">
<strong>Source:</strong>
<p t-field="o.origin"/>
</div>
</div>
<div t-if="o.date_due and o.type == 'out_invoice' and (o.state == 'open' or o.state == 'paid')" position="replace"/>
<xpath expr="//table[@class='table table-condensed']/thead/tr/th" position='replace'>
<th>Description</th>
</xpath>
<div t-if="o.tax_line_ids" position="replace"/>
<p t-if="o.payment_term_id" position="replace">
<p t-if="o.payment_term_id">
<strong><span t-field="o.payment_term_id.note"/></strong>
</p>
</p>
</template>
<!-- Render Report with Header -->
<template id="account.report_invoice">
<t t-call="report.html_container">
<t t-set="header" t-value="1"/>
<t t-foreach="docs" t-as="o">
<t t-call="dp_report.report_invoice_document" t-lang="o.partner_id.lang">
</t>
</t>
</t>
</template>
<!-- Render Report without Header -->
<template id="report_invoice_blank">
<t t-call="report.html_container">
<t t-set="header" t-value="0"/>
<t t-foreach="docs" t-as="o">
<t t-call="dp_report.report_invoice_document" t-lang="o.partner_id.lang">
</t>
</t>
</t>
</template>
<!-- Create new Report -->
<report id="dp_report_invoice_blank"
string="Rechnung Ohne Logo"
model="account.invoice"
report_type="qweb-pdf"
name="dp_report.report_invoice_blank"
file="dp_report.report_invoice_blank"/>
</data>
</openerp>

View File

@ -0,0 +1,58 @@
<openerp>
<data>
<template id="report.external_layout">
<!-- Multicompany -->
<t t-if="not o and doc">
<t t-set="o" t-value="doc"/>
</t>
<t t-if="o and 'company_id' in o">
<t t-set="company" t-value="o.company_id"></t>
</t>
<t t-if="not o or not 'company_id' in o">
<t t-set="company" t-value="res_company"></t>
</t>
<t t-if="header == 1">
<t t-call="dp_report.external_layout_header" />
</t>
<t t-if="header == 0">
<t t-call="dp_report.external_layout_header_blank" />
</t>
<t t-raw="0" />
<t t-call="report.external_layout_footer" />
<t t-esc="header"/>
</template>
<!-- Report Header Full -->
<template id="external_layout_header">
<div class="header">
<div class="row">
<div class="col-xs-3" name="company_address">
<div t-field="company.partner_id"
t-field-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'
style="border-bottom: 1px solid black;"/>
</div>
<div class="col-xs-9 text-right">
<img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % company.logo" style="max-height: 105px;"/>
</div>
</div>
</div>
</template>
<!-- Report Header Blank -->
<template id="external_layout_header_blank">
<div class="header">
<div class="row">
<div class="col-xs-12" style="height: 45px;">
</div>
</div>
<div class="row">
<div class="col-xs-3" name="company_address">
<div t-field="company.partner_id"
t-field-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'
style="border-bottom: 1px solid black;"/>
</div>
</div>
</div>
</template>
</data>
</openerp>

View File

@ -0,0 +1,85 @@
<openerp>
<data>
<!-- Sale Order Body -->
<template id="report_saleorder_document" inherit_id="sale.report_saleorder_document">
<th t-if="display_discount" position="replace">
<th t-if="display_discount and doc.print_discount" class="text-right" groups="sale.group_discount_per_so_line">Disc.(%)</th>
</th>
<td t-if="display_discount" position="replace">
<td t-if="display_discount and doc.print_discount" class="text-right" groups="sale.group_discount_per_so_line">
<span t-field="l.discount"/>
</td>
</td>
<xpath expr="//div[@class='page']/h2" position='replace'>
<h2>
<span t-if="doc.state not in ['draft','sent']">Order # </span>
<span t-if="doc.state in ['draft','sent']">Quotation # </span>
<span t-field="doc.name"/>
</h2>
</xpath>
<xpath expr="//div[@t-if='doc.user_id.name']" position='replace'/>
<xpath expr="//div[@name='payment_term']" position='attributes'>
<attribute name="style">display:none</attribute>
</xpath>
<div name="total" position="replace">
<div class="row" name="total">
<div class="col-xs-4 pull-right">
<table class="table table-condensed">
<tr class="border-black">
<td><strong>Total Without Taxes</strong></td>
<td class="text-right">
<span t-field="doc.amount_untaxed"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
<tr>
<td>Taxes</td>
<td class="text-right">
<span t-field="doc.amount_tax"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
<tr class="border-black">
<td><strong>Total</strong></td>
<td class="text-right">
<span t-field="doc.amount_total"
t-field-options='{"widget": "monetary", "display_currency": "doc.pricelist_id.currency_id"}'/>
</td>
</tr>
</table>
</div>
</div>
</div>
</template>
<!-- Render Report with Header -->
<template id="sale.report_saleorder">
<t t-call="report.html_container">
<t t-set="header" t-value="1"/>
<t t-foreach="docs" t-as="doc">
<t t-call="dp_report.report_saleorder_document" t-lang="doc.partner_id.lang">
</t>
</t>
</t>
</template>
<!-- Render Report without Header -->
<template id="report_saleorder_blank">
<t t-call="report.html_container">
<t t-set="header" t-value="0"/>
<t t-foreach="docs" t-as="doc">
<t t-call="dp_report.report_saleorder_document" t-lang="doc.partner_id.lang">
</t>
</t>
</t>
</template>
<!-- Create new Report -->
<report id="dp_report_saleorder_blank"
string="Angebot / Bestellung Ohne Logo"
model="sale.order"
report_type="qweb-pdf"
name="dp_report.report_saleorder_blank"
file="dp_report.report_saleorder_blank"/>
</data>
</openerp>

View File

@ -1,20 +0,0 @@
# mail_follower_control
This addon allows better control over follower handling for the chatter view.
## Goals:
- Checkbox "Do not automatically add as follower" for res.partner
- Set this new Checkbox to True by default
- Show the followers and additional recipients that will receive an email (notify always + email)
- Show a warning when adding additional recipients if the new recipient will not receive an email
- Show followers that will not receive Messages in Red
- Write the followers that received an email to mail.message in a new field to view them in message thread views
- ToDo: Always show all the followers when writing a message in full message composer
- ToDo: Allow to remove some followers just for the current mail
- ToDo: BCC Field for all Chatter E-Mails
- ToDo: Do NOT add BCC Recipients as followers regardless of the checkbox "Do not automatically ad as follower"

View File

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 mail_follower_control
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,60 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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': 'Mail Follower Control',
'version': '1.0',
'category': 'Custom',
'author': 'DataDialog, Michael Karrer (original version for v7 by camadeus)',
'website': 'http://www.datadialog.net',
'installable': True,
'description': """
mail_follower_control
=====================
This addon allows better control over follower handling for the chatter view.
Goals:
------
- Checkbox "Do not automatically add as follower" for res.partner
- Set this new Checkbox to True by default
- Show the followers and additional recipients that will receive an email (notify always + email)
- Show a warning when adding additional recipients if the new recipient will not receive an email
- Show followers that will not receive Messages in Red
- Write the followers that received an email to mail.message in a new field to view them in message thread views
- ToDo: Always show all the followers when writing a message in full message composer
- ToDo: Allow to remove some followers just for the current mail
- ToDo: BCC Field for all Chatter E-Mails
- ToDo: Do NOT add BCC Recipients as followers regardless of the checkbox "Do not automatically ad as follower"
""",
'depends': ['web', 'mail'],
'qweb': [
'views/templates.xml',
],
'data': [
'views/views.xml',
],
}

View File

@ -1,84 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_follower_control
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-29 12:25+0000\n"
"PO-Revision-Date: 2015-04-29 12:25+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: mail_follower_control
#: field:res.partner,no_subscribe:0
msgid "Do not add as Follower automatically"
msgstr "Nicht automatisch als Follower hinzufügen"
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_compose_message
msgid "Email composition wizard"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_wizard_invite
msgid "Invite wizard"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_message
msgid "Message"
msgstr "Nachricht"
#. module: mail_follower_control
#: view:mail.compose.message:mail_follower_control.mail_message_wizard_form_view
#: field:mail.compose.message,follower_ids:0
msgid "Notified by eMail"
msgstr "Benachrichtigt per E-Mail"
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_mail
msgid "Outgoing Mails"
msgstr "Ausgehende E-Mails"
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_res_partner
msgid "Partner"
msgstr "Kontakt"
#. module: mail_follower_control
#: field:mail.message,notified_by_email_ids:0
msgid "Partners notified by e-mail"
msgstr "Benachrichtigt per E-Mail"
#. module: mail_follower_control
#: code:addons/mail_follower_control/mail_follower_control.py:261
#, python-format
msgid "Some partners will not be notified by e-mail!"
msgstr "Einige Kontakte werden nicht per E-Mail benachrichtigt!"
#. module: mail_follower_control
#: code:addons/mail_follower_control/mail_follower_control.py:262
#, python-format
msgid "The following partners will not be notified by e-mail but they will still get a message in odoo (if they have a login):\n"
"\n"
"%s"
msgstr "Folgende Kontakte werden keine Benachrichtigung per E-Mail bekommen. Diese Kontakte bekommen jedoch zumindest eine Benachrichtigung in Ihren odoo Posteingang sofern sie sich einloggen können.: \n"
"\n"
"%s"
#. module: mail_follower_control
#: view:mail.compose.message:mail_follower_control.mail_message_wizard_form_view
msgid "onchange_partner_ids(partner_ids, follower_ids, model, res_id, context)"
msgstr ""

View File

@ -1,82 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_follower_control
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-29 12:25+0000\n"
"PO-Revision-Date: 2015-04-29 12:25+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: mail_follower_control
#: field:res.partner,no_subscribe:0
msgid "Do not add as Follower automatically"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_thread
msgid "Email Thread"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_compose_message
msgid "Email composition wizard"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_wizard_invite
msgid "Invite wizard"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_message
msgid "Message"
msgstr ""
#. module: mail_follower_control
#: view:mail.compose.message:mail_follower_control.mail_message_wizard_form_view
#: field:mail.compose.message,follower_ids:0
msgid "Notified by eMail"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_mail_mail
msgid "Outgoing Mails"
msgstr ""
#. module: mail_follower_control
#: model:ir.model,name:mail_follower_control.model_res_partner
msgid "Partner"
msgstr ""
#. module: mail_follower_control
#: field:mail.message,notified_by_email_ids:0
msgid "Partners notified by e-mail"
msgstr ""
#. module: mail_follower_control
#: code:addons/mail_follower_control/mail_follower_control.py:261
#, python-format
msgid "Some partners will not be notified by e-mail!"
msgstr ""
#. module: mail_follower_control
#: code:addons/mail_follower_control/mail_follower_control.py:262
#, python-format
msgid "The following partners will not be notified by e-mail but they will still get a message in odoo (if they have a login):\n"
"\n"
"%s"
msgstr ""
#. module: mail_follower_control
#: view:mail.compose.message:mail_follower_control.mail_message_wizard_form_view
msgid "onchange_partner_ids(partner_ids, follower_ids, model, res_id, context)"
msgstr ""

View File

@ -1,296 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 20014-2016 Camadeus GmbH (<http://www.camadeus.at>).
#
# 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 openerp.osv import fields, osv
from openerp.tools.translate import _
from openerp import SUPERUSER_ID
class res_partner(osv.Model):
_inherit = "res.partner"
_columns = {
'no_subscribe': fields.boolean("Do not add as Follower automatically"),
}
_defaults = {
'no_subscribe': True,
}
def get_partners_notify_by_email(self, cr, uid, ids, message_type, context):
""" Return the list of partners which will be notified per mail, based on their preferences.
:param message_type: type of message
"""
notify_pids = []
user = self.pool.get('res.users').browse(cr,uid,uid)
for partner in self.browse(cr, uid, ids):
# Do not send to partners without email address defined
if not partner.email:
continue
# Partner does not want to receive any emails
if partner.notify_email == 'none':
continue
# Exclude own partner
if partner.email == user.email:
continue
notify_pids.append(partner.id)
return notify_pids
res_partner()
class mail_thread(osv.AbstractModel):
_inherit = "mail.thread"
# Add data for JS to mark follower in red that will not receive an email
#
# FULL OVERWRITE of function to add 'notify_email': --> stupid but needed
# (this function will be called by the java script mail_followers.js to get the follower data)
# we need to know notify_email in the qweb template to mark followers in red that will not receive an email
# we alter mail_followers.js in addons-own/mail_follower_control/static/src/js/mail_follower_control.js to add
# notify_email to the display_followers function
def read_followers_data(self, cr, uid, follower_ids, context=None):
result = []
technical_group = self.pool.get('ir.model.data').get_object(cr, uid, 'base', 'group_no_one', context=context)
for follower in self.pool.get('res.partner').browse(cr, uid, follower_ids, context=context):
is_editable = uid in map(lambda x: x.id, technical_group.users)
is_uid = uid in map(lambda x: x.id, follower.user_ids)
data = (follower.id,
follower.name,
{'is_editable': is_editable, 'is_uid': is_uid, 'notify_email': follower.notify_email, },
)
result.append(data)
return result
# Do not subscript followers with no_subscribe=True (except force_subscription is in the context)
#
# message_post will call message_subscribe to add followers
# we alter this method to take our new field no_subscribe into account
def message_subscribe(self, cr, uid, ids, partner_ids, subtype_ids=None, context=None):
if context is None:
context = {}
# 1.) Filter all mail_post_autofollow_partner_ids if they exists to respect the no_subscribe setting
if context.get('mail_post_autofollow') and context.get('mail_post_autofollow_partner_ids'):
context['mail_post_autofollow_partner_ids'] = self.pool.get('res.partner').search(cr, uid, [
('no_subscribe', '=', False),
('id', 'in', context.get('mail_post_autofollow_partner_ids'), )
])
# 2.) Filter partner_ids: to respect the no_subscribe setting (except 'force_subscription' is set)
# HINT: force_subscription is set by java script to allow adding a follower with no_subscribe=True by the
# add followers links in the chatter window - without this the follower could not be added by any method.
if not context.get('force_subscription'):
partner_ids = self.pool.get('res.partner').search(cr, uid, [
('no_subscribe', '=', False),
('id', 'in', partner_ids),
])
# Remove force_subscription from the context after the filtering is done
if context.get('force_subscription'):
context.pop('force_subscription')
res = super(mail_thread, self).message_subscribe(cr, uid, ids, partner_ids, subtype_ids, context)
return res
mail_thread()
# Allow to add followers with no_subscribe=True at least with the invite wizard (Add Followers Link)
class invite_wizard(osv.osv_memory):
_inherit = 'mail.wizard.invite'
# Add force Subscription to the context so that followers can be added even if no_subscribe=True
def add_followers(self, cr, uid, ids, context=None):
if context is None:
context = {}
context['force_subscription'] = True
return super(invite_wizard, self).add_followers(cr, uid, ids, context)
invite_wizard()
class mail_message(osv.Model):
_inherit = "mail.message"
# Add field notified_by_email_ids to store this data from mail.mail if a mail was sent
# WARNING: do not use relation= for old style many2many fields - will be ignored!!!!
# WARNING: always use a custom name for the relation table e.g.: mail_message_res_partner_notified_by_email_rel
# if you use none the system may generate one that is already in use and both fields will have
# the related fields - which is very hard to debug.
_columns = {
'notified_by_email_ids': fields.many2many('res.partner',
'mail_message_res_partner_notified_by_email_rel',
'mail_message_id', 'res_partner_id',
string='Partners notified by e-mail'),
}
# Update Dict for JS rendering of messages with field notified_by_email_ids
# HINT: _message_read_dict returns a dict representation of the message. This representation is
# used in the JS client code, to display the messages. Partners and
# attachments related stuff will be done in post-processing in batch.
def _message_read_dict(self, cr, uid, message, parent_id=False, context=None):
res = super(mail_message, self)._message_read_dict(cr, uid, message, parent_id, context)
# ToDo: Create a dict wich holds name and id for each id in ids (partner) - needed in template!
vals = {'notified_by_email_ids': [[p.id, p.name] for p in message.notified_by_email_ids]}
# print 'vals: %s' % vals
res.update(vals)
return res
mail_message()
# Check Receipients while composing a mail (Full composing dialog not quick dialogue) and give a warning
# if the added recipients will not receive an e-mail by setting
class mail_compose_message(osv.TransientModel):
_inherit = "mail.compose.message"
_columns = {
'follower_ids': fields.many2many('res.partner',
'mail_compose_message_followers_rel',
'wizard_id',
'partner_id',
string='Notified by eMail', readonly=True),
}
# This will recalculate/set the field follower_ids for the current mail_compose_message (which is a transient model
# so its not a problem to recalculate it here on the fly)
def get_record_data(self, cr, uid, values, context=None):
res = super(mail_compose_message, self).get_record_data(cr, uid, values, context)
# if this message belongs to a resource add follower ids that will receieve an email to the result dict
if values.get('model') and values.get('res_id'):
p_obj = self.pool.get('res.partner')
fol_obj = self.pool.get("mail.followers")
# get all followers for the current resource (= model and res_id)
fol_ids = fol_obj.search(cr, SUPERUSER_ID, [
('res_model', '=', values.get('model')),
('res_id', '=', values.get('res_id')),
('subtype_ids', 'in', 1) # ID 1 is always the subtyp "Discussion"
], context=context)
# get the res.partner objects of the followers (mail.followers) of this resource
followers = set(fo.partner_id for fo in fol_obj.browse(cr, SUPERUSER_ID, fol_ids, context=context))
# get the res.partner ids for the objects in followers
follower_ids = [f.id for f in followers]
# filter out all followers without an email or with notify_email set to none
notify_pids = p_obj.get_partners_notify_by_email(cr, uid, follower_ids, 'comment', context)
# add follower_ids tp the result dict
# This result dict is used by the ??? - I DONT KNOW TILL NOW!
res.update({'follower_ids': notify_pids})
return res
def onchange_partner_ids(self, cr, uid, ids, partner_ids, follower_ids, model, res_id, context=None):
# We unwrap the variable partner_ids which most likely has a form of e.g. [(6, 0, [7]), ]
# see https://doc.odoo.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html/#osv.osv.osv.write
p_ids = []
# Unwrap: Only take the first list or tuble
if isinstance(partner_ids, (list, tuple)):
partner_ids = partner_ids[0]
# 4 means "link to existing record with id = ID" so we add new links which in fact is nonsense since
# p_ids is empty at this time anyway.
if isinstance(partner_ids, (list, tuple)) and partner_ids[0] == 4 and len(partner_ids) == 2:
p_ids.add(partner_ids[1])
# 6 means "replace the list of linked IDs" so we replace the partner ids
if isinstance(partner_ids, (list, tuple)) and partner_ids[0] == 6 and len(partner_ids) == 3 and partner_ids[2]:
p_ids = partner_ids[2]
elif isinstance(partner_ids, (int, long)):
p_ids.add(partner_ids)
else:
pass # we do not manage anything else
p_obj = self.pool.get('res.partner')
# get all partners that have an email and also notify_email is not none
parterns_to_notify = p_obj.get_partners_notify_by_email(cr, uid, p_ids, "comment", context)
# find any partners in p_ids that are not in parterns_to_notify
partners_not_to_notify = [p for p in p_ids if p not in parterns_to_notify]
# get the names of the partners that will not get an email
partners = p_obj.name_get(cr, uid, partners_not_to_notify, context=context)
partner_names = [p[1] for p in partners]
# Update follower_ids
# Update the values for the wizzard (found in addons/email_template/wizard/mail_compose_message.py)
# HINT: There was no docu in how to update the wizard but at least i found an example - i have no idea
# If this is the same for all wizards
p_obj = self.pool.get('res.partner')
fol_obj = self.pool.get("mail.followers")
# get all followers for the current resource (= model and res_id)
fol_ids = fol_obj.search(cr, SUPERUSER_ID, [
('res_model', '=', model),
('res_id', '=', res_id),
('subtype_ids', 'in', 1) # ID 1 is always the subtyp "Discussion"
], context=context)
# get the res.partner objects of the followers (mail.followers) of this resource
followers = set(fo.partner_id for fo in fol_obj.browse(cr, SUPERUSER_ID, fol_ids, context=context))
# get the res.partner ids for the objects in followers
follower_ids = [f.id for f in followers]
# filter out all followers without an email or with notify_email set to none
follower_partner_ids = p_obj.get_partners_notify_by_email(cr, uid, follower_ids, 'comment', context)
# update the follower_ids to reflect the newly added partners to notify by mail if any
values = {'follower_ids': list(set(follower_partner_ids + parterns_to_notify)), }
# Warn if any partners found that will not get an email
if partner_names:
warning = {
'title': _('Some partners will not be notified by e-mail!'),
'message': _('The following partners will not be notified by e-mail but they will still get a message in odoo (if they have a login):\n\n%s') % ('\n'.join(partner_names))
}
res = {'warning': warning, 'value': values}
else:
res = {'value': values}
return res
mail_compose_message()
# This will update the new custom field mail_sent for the model mail.notification - seems useless ... because
# it will be true if the smtp server takes over the mail which des not guarantee sending was successful
class mail_mail(osv.Model):
_inherit = 'mail.mail'
def _postprocess_sent_message(self, cr, uid, mail, context=None, mail_sent=True):
# Copy the notified_by_email_ids to the mail.message
# Hint: It seems that notified_by_email_ids of mail.message is already there but in the state of the initial
# setting so we have to update it here after we send the message to inculde the right notified_by_email_ids
if mail_sent and mail.recipient_ids and mail.mail_message_id:
mail.mail_message_id.notified_by_email_ids = mail.recipient_ids
return super(mail_mail, self)._postprocess_sent_message(cr=cr, uid=uid, mail=mail,
context=context, mail_sent=mail_sent)

View File

@ -1,15 +0,0 @@
.oe_follower_red {
color: red !important;
}
.oe_follower_orange {
color: orange !important;
}
.oe_msg_notify_mail {
margin-left: 4px;
overflow: hidden;
margin-top: -4px;
font-size: 11px;
}

View File

@ -1,82 +0,0 @@
openerp.mail_follower_control = function (session) {
session.mail_followers.Followers = session.mail_followers.Followers.extend({
/** FULL OVERWRITE: because we need to add more data to the records: 'notify_email'
* Do not forget to update the python function "read_followers_data" in "mail_follower_control.py"
* ("read_followers_data" is called by JS function "fetch_followers" which then calls "display_followers")
*
* */
display_followers: function (records) {
var self = this;
this.message_is_follower = false;
console.log('RECORDS:');
console.log(records);
this.followers = records || this.followers;
// clean and display title
var node_user_list = this.$('.oe_follower_list').empty();
this.$('.oe_follower_title').html(this._format_followers(this.followers.length));
self.message_is_follower = _.indexOf(this.followers.map(function (rec) { return rec[2]['is_uid']}), true) != -1;
// truncate number of displayed followers
var truncated = this.followers.slice(0, this.displayed_nb);
_(truncated).each(function (record) {
partner = {
'id': record[0],
'name': record[1],
'is_uid': record[2]['is_uid'],
'is_editable': record[2]['is_editable'],
'notify_email': record[2]['notify_email'],
'avatar_url': session.mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record[0])
};
console.log('partner');
console.log(partner);
$(session.web.qweb.render('mail.followers.partner', {'record': partner, 'widget': self})).appendTo(node_user_list);
// On mouse-enter it will show the edit_subtype pencil.
if (partner.is_editable) {
self.$('.oe_follower_list').on('mouseenter mouseleave', function(e) {
self.$('.oe_edit_subtype').toggleClass('oe_hidden', e.type == 'mouseleave');
self.$('.oe_follower_list').find('.oe_partner').toggleClass('oe_partner_name', e.type == 'mouseenter');
});
}
});
// FVA note: be sure it is correctly translated
if (truncated.length < this.followers.length) {
$(session.web.qweb.render('mail.followers.show_more', {'number': (this.followers.length - truncated.length)} )).appendTo(node_user_list);
}
},
do_follow: function () {
/**
* Add this context value to force subscription
*/
var context = new session.web.CompoundContext(this.build_context(), {'force_subscription': 1});
console.log('do_follow');
this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], [this.session.uid], undefined, context])
.then(this.proxy('read_value'));
_.each(this.$('.oe_subtype_list input'), function (record) {
$(record).attr('checked', 'checked');
});
}
});
// HINT: Add recipient_ids to MessageCommon - message common is extended by:
// mail.ThreadMessage AND
// mail.ThreadComposeMessage so both should have recipients_ids now for ThreadComposeMessage it will be
// useless for now because this is updated after we post the message.
// session.mail.MessageCommon = session.mail.MessageCommon.extend({
// HINT2: mail.MessageCommon did not work ?!?
openerp.mail.ThreadMessage = openerp.mail.ThreadMessage.extend({
template: 'mail.thread.message',
init: function (parent, datasets, options) {
this._super(parent, datasets, options);
this.notified_by_email_ids = datasets.notified_by_email_ids || [];
}
});
};

View File

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<!-- Chatter widget on left side with followers of thread: show partners in red that will not receive an email -->
<t t-extend="mail.followers.partner">
<t t-jquery="a" t-operation="replace">
<t t-if="record.notify_email == 'none'">
<a class="oe_follower_red" t-attf-href="#model=res.partner&amp;id=#{record.id}" t-att-title="record.name" t-att-data-partner="record.id"><t t-esc="record.name"/></a>
</t>
<t t-if="record.notify_email != 'none'">
<a t-attf-href="#model=res.partner&amp;id=#{record.id}" t-att-title="record.name" t-att-data-partner="record.id"><t t-esc="record.name"/></a>
</t>
</t>
</t>
<!-- Add recipients.ids for the Mail sent to message - this is not a guarantee that the partner got an email!
HINT: This template is called by mail.js mail.ThreadMessage which extends mail.MessageCommon
All relevant fields of mail.message should be available - if needed can be extended in
mail_follower_control/static/src/js/mail_follower_control.js
-->
<t t-extend="mail.thread.message">
<t t-jquery=".oe_msg_footer" t-operation="append">
<div class="oe_msg_notify_mail">
<span>By e-mail to:</span>
<t t-if="widget.type == 'notification' or ( (widget.type == 'email' or widget.type == 'comment') and widget.subtype)">
<t t-foreach="widget.notified_by_email_ids" t-as="partner">
<span t-attf-class="oe_partner_follower">
<a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{partner[0]}">
<t t-raw="partner[1]"/>
</a>
<t t-if="!widget.options.show_link" t-raw="partner[1]"/>
</span>
<t t-if="!partner_last">,</t>
</t>
</t>
</div>
</t>
</t>
<!-- Todo: Extend the Quick mail composer with recipients_ids -->
<!-- HINT: This template for the quick mail composer is called by mail.js mail.ThreadComposeMessage which
extends mail.MessageCommon -> all relevant fields from mail.message should be available!
if not add them in mail_follower_control/static/src/js/mail_follower_control.js
-->
<!--<t t-extend="mail.compose_message">-->
<!--<t t-jquery=".oe_full" t-operation="after">-->
<!--<div>Notified by eMail: <t t-esc="widget.partner_ids"/></div>-->
<!--</t>-->
<!--</t>-->
</templates>

View File

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- Load CSS and JS into the Backend-->
<template id="assets_backend" name="mail_follower_control assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/mail_follower_control/static/src/css/mail_follower_control.css"/>
<script type="text/javascript" src="/mail_follower_control/static/src/js/mail_follower_control.js"></script>
</xpath>
</template>
<!-- Add no_subscribe checkbox to partner form -->
<record id="res_partner_form_view" model="ir.ui.view">
<field name="name">chatterimprovments.res_partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="mail.view_emails_partner_info_form"/>
<field name="arch" type="xml">
<field name="notify_email" position="after">
<field name="no_subscribe"/>
</field>
</field>
</record>
<!-- Add follower_ids and an onchange event for partner_ids to mail compose wizard form
To warn if the notification setting of a partner would prevent to send an e-mail
and to show which res.partner will receive an e-mail -->
<record id="mail_message_wizard_form_view" model="ir.ui.view">
<field name="name">chatterimprovments.mail_message_wizard.form</field>
<field name="model">mail.compose.message</field>
<field name="inherit_id" ref="mail.email_compose_message_wizard_form"/>
<field name="arch" type="xml">
<!-- ADD field follower_ids which hold the res.partner ids that will get an eMail -->
<field name="notify" position="before">
<label for="follower_ids" string="Notified by eMail"/>
<div>
<field name="follower_ids" widget="many2many_tags_email"/>
</div>
</field>
<!-- ADD attribute onchange to partner_ids field-->
<xpath expr="//field[@name='partner_ids']" position="attributes">
<attribute name="on_change">onchange_partner_ids(partner_ids, follower_ids, model, res_id, context)</attribute>
</xpath>
</field>
</record>
<!-- Show recipient_ids in mail_message form -->
<record id="mail_view_message_form_extended" model="ir.ui.view">
<field name="name">mail_view_message_form_extended</field>
<field name="model">mail.message</field>
<field name="inherit_id" ref="mail.view_message_form"/>
<field name="arch" type="xml">
<!-- ADD field recipient_ids which hold the res.partner ids that got an eMail -->
<field name="notified_partner_ids" position="after">
<field name="notified_by_email_ids" widget="many2many_tags"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@ -1,15 +0,0 @@
Stop Phoning Home Feature from OpenERP
======================================
Note:
-----
* For V8 checkout master branch
* for V7 checkout 7.0 branch
Remove Few Phoning home feature effect from Core OpenERP.
---------------------------------------------------------
* Stop Scheduler for Sending Company/Database information to Odoo/OpenERP company.
* Remove ``Your OpenERP is not supported.``.
* Change sequence of the ``Apps`` and ``Update`` menu and arrange ``Installed Modules`` at first position.

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