[Merge] lp:openobject-addons
authorDBR (OpenERP) <dbr@tinyerp.com>
Fri, 22 Feb 2013 05:56:29 +0000 (11:26 +0530)
committerDBR (OpenERP) <dbr@tinyerp.com>
Fri, 22 Feb 2013 05:56:29 +0000 (11:26 +0530)
bzr revid: dbr@tinyerp.com-20130222055629-7b4wjhef7l66l6ri

1  2 
addons/account_analytic_analysis/account_analytic_analysis.py
addons/account_analytic_analysis/account_analytic_analysis_cron.xml
addons/account_analytic_analysis/account_analytic_analysis_view.xml
addons/hr_expense/hr_expense.py

@@@ -27,106 -29,8 +30,108 @@@ from openerp.tools.translate import 
  
  from openerp.addons.decimal_precision import decimal_precision as dp
  
+ _logger = logging.getLogger(__name__)
 +class account_virtual_invoice(osv.osv):
 +    _name = "account.virtual.invoice"
 +    _auto = False
 +
 +    def _amount_line(self, cr, uid, ids, prop, unknow_none, unknow_dict):
 +        res = {}
 +        tax_obj = self.pool.get('account.tax')
 +        cur_obj = self.pool.get('res.currency')
 +        for line in self.browse(cr, uid, ids):
 +            price = line.unit_price
 +            taxes = tax_obj.compute_all(cr, uid, line.tax_ids, price, line.qty, product=line.product_id, partner=line.analytic_account_id.partner_id)
 +            res[line.id] = taxes['total']
 +            if line.analytic_account_id:
 +                cur = line.analytic_account_id.currency_id
 +                res[line.id] = cur_obj.round(cr, uid, cur, res[line.id])
 +        return res
 +
 +    def _get_tax_lines(self, cr, uid, ids,name, arg, context=None):
 +        res = {}
 +        product_ids = []
 +        product_obj = self.pool.get('product.product')
 +        account_obj = self.pool.get('account.account')
 +        for line in self.browse(cr, uid, ids, context=context):
 +            res[line.id] = []
 +            if not line.product_id:
 +                continue
 +            product = product_obj.browse(cr, uid, line.product_id.id, context=context)
 +            a = product.property_account_income.id
 +            if not a:
 +                a = product.categ_id.property_account_income_categ.id
 +            taxes = product.taxes_id and product.taxes_id or (a and account_obj.browse(cr, uid, a, context=context).tax_ids or False)
 +            res[line.id] = [x.id for x in taxes]
 +        return res
 +
 +    _columns = {
 +        'product_id': fields.many2one('product.product','Product'),
 +        'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
 +        'name': fields.char('Description', size=64, readonly=True),
 +        'qty': fields.float('Quantity', readonly=True),
 +        'uom': fields.many2one('product.uom', 'Unit of Measure', required=True),
 +        'unit_price': fields.float('Unit Price', readonly=True),
 +        'sub_total': fields.function(_amount_line, string='Amount', type="float",
 +            digits_compute= dp.get_precision('Account')),
 +        'tax_ids':fields.function(_get_tax_lines, type='many2many', relation='account.tax', string='Taxes'),
 +    }
 +
 +    _order = 'name desc'
 +
 +    def init(self, cr):
 +        tools.drop_view_if_exists(cr, 'account_virtual_invoice')
 +        cr.execute("""
 +        create or replace view account_virtual_invoice as (
 +        
 +        SELECT
 +        l.id as id,
 +        account.id as analytic_account_id,
 +        l.product_id as product_id,
 +        l.name as name,
 +        l.unit_amount as qty,
 +        l.product_uom_id as uom,
 +        t.list_price as unit_price
 +        FROM
 +        account_analytic_line as l 
 +        LEFT JOIN account_analytic_account account ON (l.account_id = account.id)
 +        LEFT JOIN account_analytic_journal journal ON (l.journal_id = journal.id)
 +        left join product_product p on (l.product_id=p.id)
 +        left join product_template t on (p.product_tmpl_id=t.id)
 +        WHERE (l.to_invoice IS NOT NULL) and (l.invoice_id IS NULL)
 +UNION 
 +    SELECT
 +        sol.id as id,
 +        account.id as analytic_account_id,
 +        sol.product_id as product_id,
 +        sol.name as name,
 +        sol.product_uom_qty as qty,
 +        sol.product_uom as uom,
 +        sol.price_unit as unit_price
 +        FROM
 +        sale_order as so 
 +        LEFT JOIN account_analytic_account account ON (so.project_id = account.id)
 +    LEFT JOIN sale_order_line sol on (so.id = sol.order_id)
 +        WHERE so.partner_id = account.partner_id
 +UNION 
 +
 +    SELECT
 +        exp.id as id,
 +        account.id as analytic_account_id,
 +        exp.product_id as product_id,
 +        exp.name as name,
 +        exp.unit_quantity as qty,
 +        exp.uom_id as uom,
 +        exp.unit_amount as unit_price
 +        FROM
 +    hr_expense_line as exp
 +        LEFT JOIN account_analytic_account account ON (exp.analytic_account = account.id)
 +        
 +        )
 +         """)
 +account_virtual_invoice()
 +
  class account_analytic_account(osv.osv):
      _name = "account.analytic.account"
      _inherit = "account.analytic.account"
              res['value']['pricelist_id'] = template.pricelist_id.id
          return res
  
 +    def onchange_recurring_invoices(self, cr, uid, ids, recurring_invoices, date_start=False, context=None):
 +        result = {}
 +        if not ids:
 +            result = {'value': {
 +                    'next_date': lambda *a: time.strftime('%Y-%m-%d'),
 +                    'rrule_type':'monthly'
 +                    }
 +                }
 +        if date_start and recurring_invoices == True:
 +            result = {'value': {
 +                    'next_date': date_start,
 +                    'rrule_type':'monthly'
 +                    }
 +                }
 +        return result
 +
- account_analytic_account()
+     def cron_account_analytic_account(self, cr, uid, context=None):
+         if context is None:
+             context = {}
+         remind = {}
+         def fill_remind(key, domain, write_pending=False):
+             base_domain = [
+                 ('type', '=', 'contract'),
+                 ('partner_id', '!=', False),
+                 ('manager_id', '!=', False),
+                 ('manager_id.email', '!=', False),
+             ]
+             base_domain.extend(domain)
+             accounts_ids = self.search(cr, uid, base_domain, context=context, order='name asc')
+             accounts = self.browse(cr, uid, accounts_ids, context=context)
+             for account in accounts:
+                 if write_pending:
+                     account.write({'state' : 'pending'}, context=context)
+                 remind_user = remind.setdefault(account.manager_id.id, {})
+                 remind_type = remind_user.setdefault(key, {})
+                 remind_partner = remind_type.setdefault(account.partner_id, []).append(account)
+         # Already expired
+         fill_remind("old", [('state', 'in', ['pending'])])
+         # Expires now
+         fill_remind("new", [('state', 'in', ['draft', 'open']), '|', '&', ('date', '!=', False), ('date', '<=', time.strftime('%Y-%m-%d')), ('is_overdue_quantity', '=', True)], True)
+         # Expires in less than 30 days
+         fill_remind("future", [('state', 'in', ['draft', 'open']), ('date', '!=', False), ('date', '<', (datetime.datetime.now() + datetime.timedelta(30)).strftime("%Y-%m-%d"))])
+         context['base_url'] = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
+         context['action_id'] = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_analytic_analysis', 'action_account_analytic_overdue_all')[1]
+         template_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_analytic_analysis', 'account_analytic_cron_email_template')[1]
+         for user_id, data in remind.items():
+             context["data"] = data
+             _logger.debug("Sending reminder to uid %s", user_id)
+             self.pool.get('email.template').send_mail(cr, uid, template_id, user_id, context=context)
+         return True
++    def cron_create_invoice(self, cr, uid, context=None):
++        res = []
++        inv_obj = self.pool.get('account.invoice')
++        journal_obj = self.pool.get('account.journal')
++        inv_lines = []
++        contract_ids = self.search(cr, uid, [('next_date','<=',time.strftime("%Y-%m-%d")), ('state','=', 'open'), ('recurring_invoices','=', True)], context=context, order='name asc')
++        a = self.pool.get('hr.timesheet.invoice.create.final').do_create(cr, uid, contract_ids, context=None)
++        contracts = self.browse(cr, uid, contract_ids, context=context)
++        for contract in contracts:
++            next_date = datetime.datetime.strptime(contract.next_date, "%Y-%m-%d")
++            interval = contract.interval
++
++            if contract.rrule_type == 'monthly':
++                new_date = next_date+relativedelta(months=+interval)
++            if contract.rrule_type == 'daily':
++                new_date = next_date+relativedelta(days=+interval)
++            if contract.rrule_type == 'weekly':
++                new_date = next_date+relativedelta(weeks=+interval)
++
++            # Link this new invoice to related contract
++            contract.write({'next_date':new_date}, context=context)
++        return True
 +
  class account_analytic_account_summary_user(osv.osv):
      _name = "account_analytic_analysis.summary.user"
      _description = "Hours Summary by User"
@@@ -6,23 -68,10 +68,23 @@@ Hello ${object.name}
              <field name="interval_number">1</field>
              <field name="interval_type">weeks</field>
              <field name="numbercall">-1</field>
-             <field eval="False" name="doall"/>
-             <field eval="'account.analytic.account'" name="model"/>
-             <field eval="'cron_account_analytic_account'" name="function"/>
-             <field eval="'()'" name="args"/>
+             <field name="doall" eval="False"/>
+             <field name="model" eval="'account.analytic.account'"/>
+             <field name="function" eval="'cron_account_analytic_account'"/>
+             <field name="args" eval="'()'" />
          </record>
 +
 +        <record model="ir.cron" id="account_analytic_cron_for_invoice">
 +            <field name="name">Recurrent Report for Invoice</field>
 +            <field eval="True" name="active" />
 +           <field name="user_id" ref="base.user_root" />
 +           <field name="interval_number">1</field>
 +           <field name="interval_type">minutes</field>
 +           <field name="numbercall">-1</field>
 +           <field eval="'account.analytic.account'" name="model" />
 +           <field eval="'cron_create_invoice'" name="function" />
 +           <field eval="'(False,)'" name="args" />
 +        </record>
 +
      </data>
  </openerp>
                      terms and conditions of the contract.
                  </p>
              </field>
-              
          </record>
          <menuitem action="template_of_contract_action" id="menu_template_of_contract_action" parent="base.menu_base_config"/>
 -
 +        <menuitem action="action_account_virtual_invoice"
 +            id="menu_action_account_virtual_invoice"
 +            groups="analytic.group_analytic_accounting"
 +            parent="menu_template_of_contract_action" sequence="4"/>
      </data>
  </openerp>
Simple merge