You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

127 lines
4.9 KiB

# -*- coding: utf-8 -*-
# Author: Andrea andrea4ever Gallina
# Author: Francesco OpenCode Apruzzese
# Author: Ciro CiroBoxHub Urselli
# Copyright 2016 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import models, fields, api, _
from openerp.exceptions import Warning as UserError
from datetime import datetime
class OpenInvoiceWizard(models.TransientModel):
_name = 'open.invoice.wizard'
company_id = fields.Many2one(
'res.company', required=True,
default=lambda s: s.env.user.company_id)
at_date = fields.Date(
required=True,
default=fields.Date.to_string(datetime.today()))
partner_ids = fields.Many2many(
'res.partner', string='Filter partners')
amount_currency = fields.Boolean(
"With Currency", help="It adds the currency column")
group_by_currency = fields.Boolean(
"Group Partner by currency", help="It adds the currency column")
result_selection = fields.Selection([
('customer', 'Receivable Accounts'),
('supplier', 'Payable Accounts'),
('customer_supplier', 'Receivable and Payable Accounts')],
"Partner's", required=True, default='customer')
target_move = fields.Selection([
('posted', 'All Posted Entries'),
('all', 'All Entries')], 'Target Moves',
required=True, default='all')
until_date = fields.Date(
"Clearance date",
help="""The clearance date is essentially a tool used for debtors
provisionning calculation.
By default, this date is equal to the the end date (
ie: 31/12/2011 if you select fy 2011).
By amending the clearance date, you will be, for instance,
able to answer the question : 'based on my last
year end debtors open invoices, which invoices are still
unpaid today (today is my clearance date)?'""")
@api.onchange('at_date')
def onchange_atdate(self):
self.until_date = self.at_date
@api.onchange('until_date')
def onchange_untildate(self):
# ---- until_date must be always >= of at_date
if self.until_date:
if self.until_date < self.at_date:
raise UserError(
'Until Date must be equal or greater than At Date')
@staticmethod
def _get_domain(data):
account_type = ('payable', 'receivable')
if data['result_selection'] == 'customer':
account_type = ('receivable', )
elif data['result_selection'] == 'supplier':
account_type = ('payable', )
domain = [
('reconciled', '=', False),
('company_id', '=', data['company_id'].id),
('move_id.date', '<=', data['at_date']),
('account_id.user_type_id.type', 'in', account_type)
]
if data['target_move'] != 'all':
domain.append(('move_id.state', 'in', ('posted', )), )
if data['partner_ids']:
domain.append(('partner_id', 'in', [p.id
for p
in data['partner_ids']]), )
return domain
@staticmethod
def _get_move_line_data(move):
label = move.name
if move.invoice_id:
label = '{label} ({inv_nummber})'.format(
label=label, inv_nummber=move.invoice_id.number)
return {
'date': move.date,
'period': '',
'entry': move.move_id.name,
'journal': move.move_id.journal_id.code,
'reference': move.ref,
'label': label,
'rec': move.full_reconcile_id.name,
'due_date': move.date_maturity,
'debit': move.debit,
'credit': move.credit,
}
@api.multi
def print_report(self):
self.ensure_one()
moves = self.env['account.move.line'].search(self._get_domain(self))
if not moves:
return True # ----- Show a message here
datas = {}
for move in moves:
if move.account_id.name not in datas:
datas[move.account_id.name] = {}
if move.partner_id.name not in datas[move.account_id.name]:
datas[move.account_id.name][move.partner_id.name] = []
datas[move.account_id.name][move.partner_id.name].append(
self._get_move_line_data(move))
generals = {
'company': self.company_id.name,
'fiscal_year': '',
'at_date': self.at_date,
'account_filters': dict(
self._columns['result_selection'].selection)[
self.result_selection],
'target_moves': dict(
self._columns['target_move'].selection)[self.target_move],
}
return self.env['report'].with_context(landscape=True).get_action(
self, 'account_financial_report_qweb.open_invoice_report_qweb',
data={'data': datas, 'general': generals})