merge 10.0 to master
|  | @ -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> |  | ||||||
|  | @ -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="^INSTANCE.*""/> |  | ||||||
| <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> |  | ||||||
|  | @ -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 |  | ||||||
|  | @ -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 |  | ||||||
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB | 
|  | @ -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) |  | ||||||
|  | @ -1,7 +0,0 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> |  | ||||||
| <openerp> |  | ||||||
| 	<data noupdate="1"> |  | ||||||
|          |  | ||||||
|         |  | ||||||
| 	</data> |  | ||||||
| </openerp> |  | ||||||
|  | @ -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> |  | ||||||
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 66 KiB | 
| Before Width: | Height: | Size: 82 KiB | 
|  | @ -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> |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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 |  | ||||||
| 
 | 
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 66 KiB | 
|  | @ -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: |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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> |  | ||||||
| Before Width: | Height: | Size: 11 KiB | 
|  | @ -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: |  | ||||||
| Before Width: | Height: | Size: 2.8 KiB | 
|  | @ -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; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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), |  | ||||||
|     } |  | ||||||
|  | @ -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"> </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) ]] </para> |  | ||||||
|           <para style="normal">[[ o.origin ]] </para> |  | ||||||
|           <para style="normal">[[ o.name ]] </para> |  | ||||||
|           <!--<para style="normal">[[ o.partner_id.commercial_partner_id.ref ]] </para>--> |  | ||||||
|           <para style="normal">[[ o.partner_id.commercial_partner_id and o.partner_id.commercial_partner_id.vat or '' ]] </para> |  | ||||||
|         <para style="normal">[[ (o.user_id and o.user_id.name) or '' ]] </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"> </para> |  | ||||||
|         </td> |  | ||||||
|         <td> |  | ||||||
|           <para style="normal"> </para> |  | ||||||
|       </td> |  | ||||||
|         <td> |  | ||||||
|           <para style="normal"> </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 <> 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> |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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"> </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"> </para> |  | ||||||
|         </td> |  | ||||||
|         <td> |  | ||||||
|               <para style="normal"> </para> |  | ||||||
|       </td> |  | ||||||
|         <td> |  | ||||||
|               <para style="normal"> </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 <> 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> |  | ||||||
|  | @ -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"> </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) ]] </para> |  | ||||||
|           <para style="normal">[[ picking.origin ]] </para> |  | ||||||
|           <para style="normal">[[ picking.sale_id and picking.sale_id.client_order_ref or '' ]] </para> |  | ||||||
|           <para style="normal">[[ picking.partner_id and picking.partner_id.commercial_partner_id and picking.partner_id.commercial_partner_id.ref or '' ]] </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 <> '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> |  | ||||||
|  | @ -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> |  | ||||||
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 6.3 KiB | 
|  | @ -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: |  | ||||||
| 
 |  | ||||||
|  | @ -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, |  | ||||||
| } |  | ||||||
|  | @ -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: |  | ||||||
| 
 |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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) |  | ||||||
| Before Width: | Height: | Size: 2.8 KiB | 
|  | @ -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; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Before Width: | Height: | Size: 22 KiB | 
| Before Width: | Height: | Size: 25 KiB | 
|  | @ -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 | 
|  | @ -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 | 
|  | @ -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" + ")");
 |  | ||||||
| 		           } |  | ||||||
| 		        }); |  | ||||||
| 	        }); |  | ||||||
| 	    }		 |  | ||||||
| 		 |  | ||||||
| 	}); |  | ||||||
| 	 |  | ||||||
| } |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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: |  | ||||||
| 
 |  | ||||||
|  | @ -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: |  | ||||||
|  | @ -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)  |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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="{"always_reload": True, "highlight_first_line": 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/> |  | ||||||
|                                          <field name="parter_id_street"/><br/> |  | ||||||
| 										 <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> |  | ||||||
|  | @ -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 |  | ||||||
| 
 | 
| Before Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										2
									
								
								ext/custom-addons/cam_max_width/__init__.py → ext/custom-addons/dp_custom/__init__.py
								
								
								
								
									
									
									Executable file → Normal file
								
							
							
						
						|  | @ -19,5 +19,7 @@ | ||||||
| # | # | ||||||
| ############################################################################## | ############################################################################## | ||||||
| 
 | 
 | ||||||
|  | import models | ||||||
|  | 
 | ||||||
| # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||||||
| 
 | 
 | ||||||
|  | @ -1,8 +1,13 @@ | ||||||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||||
| ############################################################################## | ############################################################################## | ||||||
| # | # | ||||||
|  | <<<<<<< HEAD:ext/custom-addons/cam_custom/__openerp__.py | ||||||
| #    OpenERP, Open Source Management Solution | #    OpenERP, Open Source Management Solution | ||||||
| #    Copyright (C) 20014-2016 datenpol gmbh (<http://www.datenpol.at/>). | #    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 | #    This program is free software: you can redistribute it and/or modify | ||||||
| #    it under the terms of the GNU Affero General Public License as | #    it under the terms of the GNU Affero General Public License as | ||||||
|  | @ -21,17 +26,16 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| { | { | ||||||
|     'name': 'datenpol-Anpassungen', |     'name': 'datenpol Anpassungen', | ||||||
|     'category': 'Custom', |     'category': 'Custom',  | ||||||
|     'version': '1.0', |     'version': '1.0', | ||||||
|     'description': """Individuelle Anpassungen""", |     'description': """Individuelle Anpassungen""", | ||||||
|     'author': 'datenpol gmbh', |     'author': 'datenpol gmbh', | ||||||
|     'website': 'http://www.datenpol.at/', |     'website': 'http://www.datenpol.at', | ||||||
|     'depends': ['sale','mail','product','account','knowledge'], |     'depends': ['base'], | ||||||
|     'data': [ |     'data': [ | ||||||
|         'cam_custom_view.xml', |         'data/dp_custom_data.xml', | ||||||
|         'cam_custom_data.xml', |         'views/dp_custom_view.xml', | ||||||
|         'views/custom_theme.xml', |  | ||||||
|         'security/ir.model.access.csv', |         'security/ir.model.access.csv', | ||||||
|     ], |     ], | ||||||
|     'installable': True, |     'installable': True, | ||||||
|  | @ -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">m²</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> | ||||||
|  | @ -6,8 +6,8 @@ | ||||||
| 
 | 
 | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: camadeus\n" | "Project-Id-Version: datenpol\n" | ||||||
| "Report-Msgid-Bugs-To: Andreas Brueckl <andreas.brueckl@camadeus.at>\n" | "Report-Msgid-Bugs-To: Andreas Brueckl <andreas.brueckl@datenpol.at>\n" | ||||||
| "POT-Creation-Date: 2014-09-23 16:26+0000\n" | "POT-Creation-Date: 2014-09-23 16:26+0000\n" | ||||||
| "PO-Revision-Date: 2014-08-14 16:14+0000\n" | "PO-Revision-Date: 2014-08-14 16:14+0000\n" | ||||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\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-Launchpad-Export-Date: 2014-09-24 09:44+0000\n" | ||||||
| "X-Generator: Launchpad (build 17196)\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" |  | ||||||
|  | @ -19,6 +19,7 @@ | ||||||
| # | # | ||||||
| ############################################################################## | ############################################################################## | ||||||
| 
 | 
 | ||||||
| import cam_custom | import ir_ui_menu | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||||||
|  | @ -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 | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink | ||||||
|  | 
 | ||||||
| 
 | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 26 KiB | 
| After Width: | Height: | Size: 2.2 KiB | 
|  | @ -1,5 +1,10 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <openerp> | <openerp> | ||||||
| 	<data> | 	<data> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 	</data> | 	</data> | ||||||
| </openerp> | </openerp> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | 
 | ||||||
|  | from . import models | ||||||
|  | @ -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, | ||||||
|  | } | ||||||
|  | @ -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" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | @ -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> | ||||||
|  | @ -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> | ||||||
|  | @ -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> | ||||||
|  | @ -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> | ||||||
|  | @ -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" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  | @ -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: |  | ||||||
| 
 |  | ||||||
|  | @ -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', |  | ||||||
|     ], |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -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 "" |  | ||||||
| 
 |  | ||||||
|  | @ -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 "" |  | ||||||
| 
 |  | ||||||
|  | @ -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) |  | ||||||
|  | @ -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; |  | ||||||
| } |  | ||||||
|  | @ -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 || []; |  | ||||||
|     	} |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
| }; |  | ||||||
|  | @ -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&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&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&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> |  | ||||||
|  | @ -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> |  | ||||||
|  | @ -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. |  | ||||||