Merge branch 'master' of git:~/gitrepos/cam-template
						commit
						2e5e5328ff
					
				| 
						 | 
					@ -127,3 +127,14 @@ class mail_notification(osv.Model):
 | 
				
			||||||
#         c.update({'display_default_code': False})
 | 
					#         c.update({'display_default_code': False})
 | 
				
			||||||
#         return super(product_product, self).name_get(cr, user, ids, context=c) 
 | 
					#         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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					#    it under the terms of the GNU Affero General Public License as
 | 
				
			||||||
 | 
					#    published by the Free Software Foundation, either version 3 of the
 | 
				
			||||||
 | 
					#    License, or (at your option) any later version.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					#    GNU Affero General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    You should have received a copy of the GNU Affero General Public License
 | 
				
			||||||
 | 
					#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sale_order_optional
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    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': "Optional Lines for Sale Orders",
 | 
				
			||||||
 | 
					    'version': "1.0",
 | 
				
			||||||
 | 
					    'category': "Sales",
 | 
				
			||||||
 | 
					    'description': """
 | 
				
			||||||
 | 
							This addon adds optional sale order lines.
 | 
				
			||||||
 | 
					    """,
 | 
				
			||||||
 | 
					    'author': "Camadeus GmbH",
 | 
				
			||||||
 | 
					    'website': "http://www.camadeus.at",
 | 
				
			||||||
 | 
						'css': [],
 | 
				
			||||||
 | 
					    'images': [],
 | 
				
			||||||
 | 
					    'depends': ['sale'],
 | 
				
			||||||
 | 
					    'data': ['sale_order_optional_view.xml',
 | 
				
			||||||
 | 
					             'sale_order_optional_data.xml',
 | 
				
			||||||
 | 
					             ],
 | 
				
			||||||
 | 
					    'installable': True,
 | 
				
			||||||
 | 
					    'auto_install': False,
 | 
				
			||||||
 | 
					    'application': False,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,135 @@
 | 
				
			||||||
 | 
					# -*- encoding: utf-8 -*-
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    OpenERP, Open Source Management Solution    
 | 
				
			||||||
 | 
					#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
 | 
				
			||||||
 | 
					#    $Id$
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					#    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					#    the Free Software Foundation, either version 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 General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from openerp.osv import fields, osv
 | 
				
			||||||
 | 
					import openerp.addons.decimal_precision as dp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class sale_order(osv.osv):
 | 
				
			||||||
 | 
					    _inherit = "sale.order"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def _amount_line_tax(self, cr, uid, line, context=None):
 | 
				
			||||||
 | 
					        val = 0.0
 | 
				
			||||||
 | 
					        if not line.optional:
 | 
				
			||||||
 | 
					            for c in self.pool.get('account.tax').compute_all(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, line.product_id, line.order_id.partner_id)['taxes']:
 | 
				
			||||||
 | 
					                val += c.get('amount', 0.0)
 | 
				
			||||||
 | 
					        return val
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _amount_all(self, cr, uid, ids, field_name, arg, context=None):
 | 
				
			||||||
 | 
					        cur_obj = self.pool.get('res.currency')
 | 
				
			||||||
 | 
					        res = {}
 | 
				
			||||||
 | 
					        for order in self.browse(cr, uid, ids, context=context):
 | 
				
			||||||
 | 
					            res[order.id] = {
 | 
				
			||||||
 | 
					                'amount_untaxed': 0.0,
 | 
				
			||||||
 | 
					                'amount_tax': 0.0,
 | 
				
			||||||
 | 
					                'amount_total': 0.0,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            val = val1 = 0.0
 | 
				
			||||||
 | 
					            cur = order.pricelist_id.currency_id
 | 
				
			||||||
 | 
					            for line in order.order_line:
 | 
				
			||||||
 | 
					                val1 += line.price_subtotal
 | 
				
			||||||
 | 
					                val += self._amount_line_tax(cr, uid, line, context=context)
 | 
				
			||||||
 | 
					            res[order.id]['amount_tax'] = cur_obj.round(cr, uid, cur, val)
 | 
				
			||||||
 | 
					            res[order.id]['amount_untaxed'] = cur_obj.round(cr, uid, cur, val1)
 | 
				
			||||||
 | 
					            res[order.id]['amount_total'] = res[order.id]['amount_untaxed'] + res[order.id]['amount_tax']
 | 
				
			||||||
 | 
					        return res
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def _amount_all_wrapper(self, cr, uid, ids, field_name, arg, context=None):
 | 
				
			||||||
 | 
					        """ Wrapper because of direct method passing as parameter for function fields """
 | 
				
			||||||
 | 
					        return self._amount_all(cr, uid, ids, field_name, arg, context=context)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def _get_order(self, cr, uid, ids, context=None):
 | 
				
			||||||
 | 
					        result = {}
 | 
				
			||||||
 | 
					        for line in self.pool.get('sale.order.line').browse(cr, uid, ids, context=context):
 | 
				
			||||||
 | 
					            result[line.order_id.id] = True
 | 
				
			||||||
 | 
					        return result.keys()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    _columns = {
 | 
				
			||||||
 | 
					        'amount_untaxed': fields.function(_amount_all_wrapper, digits_compute=dp.get_precision('Account'), string='Untaxed Amount',
 | 
				
			||||||
 | 
					            store={
 | 
				
			||||||
 | 
					                'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
 | 
				
			||||||
 | 
					                'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            multi='sums', help="The amount without tax.", track_visibility='always'),
 | 
				
			||||||
 | 
					        'amount_tax': fields.function(_amount_all_wrapper, digits_compute=dp.get_precision('Account'), string='Taxes',
 | 
				
			||||||
 | 
					            store={
 | 
				
			||||||
 | 
					                'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
 | 
				
			||||||
 | 
					                'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            multi='sums', help="The tax amount."),
 | 
				
			||||||
 | 
					        'amount_total': fields.function(_amount_all_wrapper, digits_compute=dp.get_precision('Account'), string='Total',
 | 
				
			||||||
 | 
					            store={
 | 
				
			||||||
 | 
					                'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
 | 
				
			||||||
 | 
					                'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            multi='sums', help="The total amount."),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class sale_order_line(osv.osv):
 | 
				
			||||||
 | 
					    _inherit = 'sale.order.line'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def _fnct_line_invoiced(self, cr, uid, ids, field_name, args, context=None):
 | 
				
			||||||
 | 
					        res = dict.fromkeys(ids, False)
 | 
				
			||||||
 | 
					        for this in self.browse(cr, uid, ids, context=context):
 | 
				
			||||||
 | 
					            res[this.id] = this.invoice_lines and \
 | 
				
			||||||
 | 
					                all(iline.invoice_id.state != 'cancel' for iline in this.invoice_lines) or \
 | 
				
			||||||
 | 
					                this.optional
 | 
				
			||||||
 | 
					        return res
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def _order_lines_from_invoice(self, cr, uid, ids, context=None):
 | 
				
			||||||
 | 
					        # direct access to the m2m table is the less convoluted way to achieve this (and is ok ACL-wise)
 | 
				
			||||||
 | 
					        cr.execute("""SELECT DISTINCT sol.id FROM sale_order_invoice_rel rel JOIN
 | 
				
			||||||
 | 
					                                                  sale_order_line sol ON (sol.order_id = rel.order_id)
 | 
				
			||||||
 | 
					                                    WHERE rel.invoice_id = ANY(%s)""", (list(ids),))
 | 
				
			||||||
 | 
					        return [i[0] for i in cr.fetchall()]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def _amount_line(self, cr, uid, ids, field_name, arg, context=None):
 | 
				
			||||||
 | 
					        tax_obj = self.pool.get('account.tax')
 | 
				
			||||||
 | 
					        cur_obj = self.pool.get('res.currency')
 | 
				
			||||||
 | 
					        res = {}
 | 
				
			||||||
 | 
					        if context is None:
 | 
				
			||||||
 | 
					            context = {}
 | 
				
			||||||
 | 
					        for line in self.browse(cr, uid, ids, context=context):
 | 
				
			||||||
 | 
					            if not line.optional:
 | 
				
			||||||
 | 
					                price = line.price_unit * (1 - (line.discount or 0.0) / 100.0)
 | 
				
			||||||
 | 
					                taxes = tax_obj.compute_all(cr, uid, line.tax_id, price, line.product_uom_qty, line.product_id, line.order_id.partner_id)
 | 
				
			||||||
 | 
					                cur = line.order_id.pricelist_id.currency_id
 | 
				
			||||||
 | 
					                res[line.id] = cur_obj.round(cr, uid, cur, taxes['total'])
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                res[line.id] = 0
 | 
				
			||||||
 | 
					        return res
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    _columns = {
 | 
				
			||||||
 | 
					        'invoiced': fields.function(_fnct_line_invoiced, string='Invoiced', type='boolean',
 | 
				
			||||||
 | 
					            store={
 | 
				
			||||||
 | 
					                'account.invoice': (_order_lines_from_invoice, ['state'], 10),
 | 
				
			||||||
 | 
					                'sale.order.line': (lambda self,cr,uid,ids,ctx=None: ids, ['invoice_lines'], 10)
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					        'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute= dp.get_precision('Account')),        
 | 
				
			||||||
 | 
					        'optional': fields.boolean('Optional'),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None):
 | 
				
			||||||
 | 
					        if not line.optional:
 | 
				
			||||||
 | 
					            return super(sale_order_line, self)._prepare_order_line_invoice_line(cr, uid, line, account_id, context=context)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding='UTF-8'?>
 | 
				
			||||||
 | 
					<openerp>
 | 
				
			||||||
 | 
					    <data>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </data>
 | 
				
			||||||
 | 
					</openerp>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<openerp>
 | 
				
			||||||
 | 
						<data>
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					        <record id="view_order_form_optional" model="ir.ui.view">
 | 
				
			||||||
 | 
					            <field name="name">sale.order.form.optional</field>
 | 
				
			||||||
 | 
					            <field name="model">sale.order</field>
 | 
				
			||||||
 | 
					            <field name="inherit_id" ref="sale.view_order_form"/>
 | 
				
			||||||
 | 
					            <field name="arch" type="xml">
 | 
				
			||||||
 | 
						            <xpath expr="//tree/field[@name='price_subtotal']" position="after">
 | 
				
			||||||
 | 
						                <field name="optional"/>
 | 
				
			||||||
 | 
						            </xpath>           	
 | 
				
			||||||
 | 
					            </field>
 | 
				
			||||||
 | 
					        </record>   
 | 
				
			||||||
 | 
					                 	
 | 
				
			||||||
 | 
						</data>
 | 
				
			||||||
 | 
					</openerp>
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 2.8 KiB  | 
| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					#    it under the terms of the GNU Affero General Public License as
 | 
				
			||||||
 | 
					#    published by the Free Software Foundation, either version 3 of the
 | 
				
			||||||
 | 
					#    License, or (at your option) any later version.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					#    GNU Affero General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    You should have received a copy of the GNU Affero General Public License
 | 
				
			||||||
 | 
					#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sale_order_reminder
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    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': "Reminder for Sale Orders",
 | 
				
			||||||
 | 
					    'version': "1.0",
 | 
				
			||||||
 | 
					    'category': "Sales",
 | 
				
			||||||
 | 
					    'description': """
 | 
				
			||||||
 | 
							This addon adds the field 'offer_valid_until' in the sale order. If this date is passed and the order is still in state 'draft' or 'sent', then
 | 
				
			||||||
 | 
							a reminder email is sent to the sales person every day.
 | 
				
			||||||
 | 
					    """,
 | 
				
			||||||
 | 
					    'author': "Camadeus GmbH",
 | 
				
			||||||
 | 
					    'website': "http://www.camadeus.at",
 | 
				
			||||||
 | 
						'css': [],
 | 
				
			||||||
 | 
					    'images': [],
 | 
				
			||||||
 | 
					    'depends': ['sale'],
 | 
				
			||||||
 | 
					    'data': ['sale_order_reminder_view.xml',
 | 
				
			||||||
 | 
					             'sale_order_reminder_data.xml',
 | 
				
			||||||
 | 
					             'email_template.xml',
 | 
				
			||||||
 | 
					             ],
 | 
				
			||||||
 | 
					    'installable': True,
 | 
				
			||||||
 | 
					    'auto_install': False,
 | 
				
			||||||
 | 
					    'application': False,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,46 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" ?>
 | 
				
			||||||
 | 
					<openerp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- Mail template is done in a NOUPDATE block
 | 
				
			||||||
 | 
					         so users can freely customize/delete them -->
 | 
				
			||||||
 | 
					    <data noupdate="1">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <!--Email template -->
 | 
				
			||||||
 | 
					        <record id="email_template_sale_reminder" model="email.template">
 | 
				
			||||||
 | 
					            <field name="name">Erinnerung: Angebot</field>
 | 
				
			||||||
 | 
					            <field name="email_from">${(object.user_id and object.user_id.email or '')|safe}</field>
 | 
				
			||||||
 | 
					            <field name="subject">Erinnerung: Angebot ${object.name}</field>
 | 
				
			||||||
 | 
					            <field name="partner_to">${object.user_id and object.user_id.partner_id.id}</field>
 | 
				
			||||||
 | 
					            <field name="model_id" ref="sale.model_sale_order"/>
 | 
				
			||||||
 | 
					            <field name="auto_delete" eval="True"/>
 | 
				
			||||||
 | 
					            <field name="body_html"><![CDATA[
 | 
				
			||||||
 | 
					<div style="color:#007434; font-size:10.0pt; font-family:Arial Unicode MS sans-serif;">
 | 
				
			||||||
 | 
					    <p>Erinnerung für folgendes offenes Angebot:</p>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <p>
 | 
				
			||||||
 | 
						    <table style="color:#007434; font-size:10.0pt; font-family:Arial Unicode MS sans-serif;">
 | 
				
			||||||
 | 
						        <tr>
 | 
				
			||||||
 | 
						            <td style='width: 200px;'>Name:</td>
 | 
				
			||||||
 | 
						            <td><b>${object.name}</b></td>
 | 
				
			||||||
 | 
						        </tr>
 | 
				
			||||||
 | 
						        <tr>
 | 
				
			||||||
 | 
						            <td>Datum:</td>
 | 
				
			||||||
 | 
						            <td>  ${object.date_order}</td>
 | 
				
			||||||
 | 
						        </tr>        
 | 
				
			||||||
 | 
						        <tr>
 | 
				
			||||||
 | 
						            <td>Kunde:</td>
 | 
				
			||||||
 | 
						            <td>  ${object.partner_id.display_name}</td>
 | 
				
			||||||
 | 
						        </tr>     
 | 
				
			||||||
 | 
						        <tr>
 | 
				
			||||||
 | 
						            <td>Auftragsvolumen (netto):</td>
 | 
				
			||||||
 | 
						            <td>  ${object.amount_untaxed}</td>
 | 
				
			||||||
 | 
						        </tr>                
 | 
				
			||||||
 | 
						    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					    <br>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					]]></field>
 | 
				
			||||||
 | 
					        </record>
 | 
				
			||||||
 | 
					    </data>
 | 
				
			||||||
 | 
					</openerp>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,68 @@
 | 
				
			||||||
 | 
					# -*- encoding: utf-8 -*-
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    OpenERP, Open Source Management Solution    
 | 
				
			||||||
 | 
					#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
 | 
				
			||||||
 | 
					#    $Id$
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					#    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					#    the Free Software Foundation, either version 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 General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from openerp import models, fields, api, _
 | 
				
			||||||
 | 
					from datetime import datetime, timedelta          
 | 
				
			||||||
 | 
					from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as DATE_FORMAT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class res_company(models.Model):
 | 
				
			||||||
 | 
					    _inherit = 'res.company'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    sale_offer_days = fields.Integer(string='Tage Gültigkeit Angebot', default=14)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class sale_order(models.Model):
 | 
				
			||||||
 | 
					    _inherit = 'sale.order'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @api.model
 | 
				
			||||||
 | 
					    def _offer_valid_until(self):
 | 
				
			||||||
 | 
					        user = self.env['res.users'].browse(self._uid)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        now = datetime.now()
 | 
				
			||||||
 | 
					        res = now + timedelta(days=user.company_id.sale_offer_days)
 | 
				
			||||||
 | 
					        return res.strftime(DATE_FORMAT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    offer_valid_until = fields.Date(string='Angebot gültig bis', index=True,
 | 
				
			||||||
 | 
					        readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, 
 | 
				
			||||||
 | 
					        default=_offer_valid_until)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @api.model
 | 
				
			||||||
 | 
					    def order_reminder_job(self):
 | 
				
			||||||
 | 
					        today = fields.Date.today()
 | 
				
			||||||
 | 
					        orders = self.search([('offer_valid_until','<',today),('state','in',('draft','sent')),('user_id','!=',False)])
 | 
				
			||||||
 | 
					        template_id = self.env['ir.model.data'].xmlid_to_res_id('sale_order_reminder.email_template_sale_reminder')
 | 
				
			||||||
 | 
					        context = {'append_link': True}
 | 
				
			||||||
 | 
					        for order in orders:          
 | 
				
			||||||
 | 
					            res = self.pool.get('email.template').send_mail(self._cr, self._uid, template_id, order.id, True, context=context)             
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					class mail_mail(models.Model):
 | 
				
			||||||
 | 
					    _inherit = 'mail.mail'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def create(self, cr, uid, vals, context=None):
 | 
				
			||||||
 | 
					        # notification field: set if it comes from order reminder job
 | 
				
			||||||
 | 
					        if context is None:
 | 
				
			||||||
 | 
					            context = {}
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if context.get('append_link'):
 | 
				
			||||||
 | 
					            vals['notification'] = True
 | 
				
			||||||
 | 
					        return super(mail_mail, self).create(cr, uid, vals, context=context)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding='UTF-8'?>
 | 
				
			||||||
 | 
					<openerp>
 | 
				
			||||||
 | 
					    <data>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <record model="ir.cron" id="cron_sale_offer_reminder">
 | 
				
			||||||
 | 
					            <field name="name">Reminder for Sale Orders</field>
 | 
				
			||||||
 | 
					            <field name="interval_number">1</field>
 | 
				
			||||||
 | 
					            <field name="interval_type">days</field>
 | 
				
			||||||
 | 
					            <field name="numbercall">-1</field>
 | 
				
			||||||
 | 
					            <field name="doall" eval="False"/>
 | 
				
			||||||
 | 
					            <field name="model" eval="'sale.order'"/>
 | 
				
			||||||
 | 
					            <field name="function" eval="'order_reminder_job'"/>
 | 
				
			||||||
 | 
					            <field name="args" eval="'()'" />
 | 
				
			||||||
 | 
					        </record>
 | 
				
			||||||
 | 
					    </data>
 | 
				
			||||||
 | 
					</openerp>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<openerp>
 | 
				
			||||||
 | 
						<data>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <record id="sale_order_valid_until_form" model="ir.ui.view">
 | 
				
			||||||
 | 
					            <field name="name">sale_order_valid_until_form</field>
 | 
				
			||||||
 | 
					            <field name="model">sale.order</field>
 | 
				
			||||||
 | 
					            <field name="inherit_id" ref="sale.view_order_form"/>
 | 
				
			||||||
 | 
					            <field name="arch" type="xml"> 
 | 
				
			||||||
 | 
					                <field name="date_order" position="after">
 | 
				
			||||||
 | 
					                    <field name="offer_valid_until"/>
 | 
				
			||||||
 | 
					                </field>
 | 
				
			||||||
 | 
					            </field>
 | 
				
			||||||
 | 
					            <field name="priority">20</field>                      
 | 
				
			||||||
 | 
					        </record> #
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        <record id="res_company_order_days_form" model="ir.ui.view">
 | 
				
			||||||
 | 
					            <field name="name">"res_company_order_days_form"</field>
 | 
				
			||||||
 | 
					            <field name="model">res.company</field>
 | 
				
			||||||
 | 
					            <field name="inherit_id" ref="base.view_company_form"/>
 | 
				
			||||||
 | 
					            <field name="arch" type="xml"> 
 | 
				
			||||||
 | 
					                <field name="sale_note" position="after">
 | 
				
			||||||
 | 
					                    <group>
 | 
				
			||||||
 | 
					                        <field name="sale_offer_days"/>
 | 
				
			||||||
 | 
					                    </group>
 | 
				
			||||||
 | 
					                </field>
 | 
				
			||||||
 | 
					            </field>                   
 | 
				
			||||||
 | 
					        </record>
 | 
				
			||||||
 | 
					        	
 | 
				
			||||||
 | 
						</data>
 | 
				
			||||||
 | 
					</openerp>
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 2.8 KiB  | 
| 
						 | 
					@ -185,6 +185,8 @@ class Config():
 | 
				
			||||||
            'sale',
 | 
					            'sale',
 | 
				
			||||||
            #'cam_hr_overtime',
 | 
					            #'cam_hr_overtime',
 | 
				
			||||||
            #'cam_hr',
 | 
					            #'cam_hr',
 | 
				
			||||||
 | 
					            #'sale_order_optiona',
 | 
				
			||||||
 | 
					            #'sale_order_reminder',
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        self.users_file = "res.users.csv"
 | 
					        self.users_file = "res.users.csv"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue