Browse Source

[ADD] Initial Commit

pull/78/head
Sreejith 8 years ago
parent
commit
13e3dc436f
  1. 4
      partner_ageing_billwise_xlsx/__init__.py
  2. 44
      partner_ageing_billwise_xlsx/__manifest__.py
  3. 3
      partner_ageing_billwise_xlsx/models/__init__.py
  4. 42
      partner_ageing_billwise_xlsx/models/report_aged_partner_balance.py
  5. 3
      partner_ageing_billwise_xlsx/report/__init__.py
  6. 346
      partner_ageing_billwise_xlsx/report/account_aged_partner_balance.py
  7. BIN
      partner_ageing_billwise_xlsx/static/description/aged_partner_wiz.png
  8. BIN
      partner_ageing_billwise_xlsx/static/description/banner.jpg
  9. BIN
      partner_ageing_billwise_xlsx/static/description/cybro_logo.png
  10. BIN
      partner_ageing_billwise_xlsx/static/description/excel_report_menu.png
  11. 78
      partner_ageing_billwise_xlsx/static/description/index.html
  12. BIN
      partner_ageing_billwise_xlsx/static/description/report_xls.png
  13. BIN
      partner_ageing_billwise_xlsx/static/src/img/icon.png
  14. 53
      partner_ageing_billwise_xlsx/views/report_aged_partner_billwise.xml

4
partner_ageing_billwise_xlsx/__init__.py

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

44
partner_ageing_billwise_xlsx/__manifest__.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
###################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: LINTO C.T.(<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) 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': 'Aged Partner Balance In Excel',
'version': '10.0.1.0.0',
'category': 'Accounting',
'summary': 'Bill-Wise Aged Partner Balance in Excel Format',
'description': """
This module provides features to take an excel report of bill-wise aged partner balance.
""",
'author': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'depends': ['report_xlsx', 'account_accountant'],
'data': [
'views/report_aged_partner_billwise.xml',
],
'demo': [],
'images': ['static/description/banner.jpg'],
'license': 'LGPL-3',
'installable': True,
'application': False,
'auto_install': False,
}

3
partner_ageing_billwise_xlsx/models/__init__.py

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

42
partner_ageing_billwise_xlsx/models/report_aged_partner_balance.py

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo import models, _
from odoo.exceptions import UserError
class AgedTrialBalanceBillwise(models.TransientModel):
_name = 'account.aged.trial.balance.xls'
_inherit = 'account.aged.trial.balance'
_description = 'Account Aged Trial balance Report Bill-wise'
def _print_report(self, data):
res = {}
data = self.pre_print_report(data)
data['form'].update(self.read(['period_length'])[0])
period_length = data['form']['period_length']
if period_length <= 0:
raise UserError(_('You must set a period length greater than 0.'))
if not data['form']['date_from']:
raise UserError(_('You must set a start date.'))
start = datetime.strptime(data['form']['date_from'], "%Y-%m-%d")
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length - 1)
res[str(i)] = {
'name': (i != 0 and (str((5-(i+1)) * period_length) + '-' + str((5-i) * period_length)) or ('+'+str(4 * period_length))),
'stop': start.strftime('%Y-%m-%d'),
'start': (i != 0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop - relativedelta(days=1)
data['form'].update(res)
return {
'name': 'Aged Partner Balance Excel',
'type': 'ir.actions.report.xml',
'report_name': 'partner_ageing_billwise_xlsx.partner_balance_xlsx.xlsx',
'datas': data
}

3
partner_ageing_billwise_xlsx/report/__init__.py

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

346
partner_ageing_billwise_xlsx/report/account_aged_partner_balance.py

@ -0,0 +1,346 @@
# -*- coding: utf-8 -*-
import time
from datetime import datetime
from odoo import _
from odoo.addons.report_xlsx.report.report_xlsx import ReportXlsx
from odoo.tools import float_is_zero
from dateutil.relativedelta import relativedelta
class AgedBillwiseXlsx(ReportXlsx):
def _get_billwise_move_lines(self, account_type, date_from, target_move, period_length):
periods = {}
start = datetime.strptime(date_from, "%Y-%m-%d")
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length)
periods[str(i)] = {
'name': (i!=0 and (str((5-(i+1)) * period_length) + '-' + str((5-i) * period_length)) or ('+'+str(4 * period_length))),
'stop': start.strftime('%Y-%m-%d'),
'start': (i!=0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop - relativedelta(days=1)
res = []
total = []
cr = self.env.cr
user_company = self.env.user.company_id.id
move_state = ['draft', 'posted']
if target_move == 'posted':
move_state = ['posted']
arg_list = (tuple(move_state), tuple(account_type))
#build the reconciliation clause to see what partner needs to be printed
reconciliation_clause = '(l.reconciled IS FALSE)'
cr.execute('SELECT debit_move_id, credit_move_id FROM account_partial_reconcile where create_date > %s', (date_from,))
reconciled_after_date = []
for row in cr.fetchall():
reconciled_after_date += [row[0], row[1]]
if reconciled_after_date:
reconciliation_clause = '(l.reconciled IS FALSE OR l.id IN %s)'
arg_list += (tuple(reconciled_after_date),)
arg_list += (date_from, user_company)
query = '''
SELECT DISTINCT l.partner_id, UPPER(res_partner.name)
FROM account_move_line AS l left join res_partner on l.partner_id = res_partner.id, account_account, account_move am
WHERE (l.account_id = account_account.id)
AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.internal_type IN %s)
AND ''' + reconciliation_clause + '''
AND (l.date <= %s)
AND l.company_id = %s
ORDER BY UPPER(res_partner.name)'''
cr.execute(query, arg_list)
partners = cr.dictfetchall()
# put a total of 0
for i in range(7):
total.append(0)
# Build a string like (1,2,3) for easy use in SQL query
partner_ids = [partner['partner_id'] for partner in partners if partner['partner_id']]
lines = dict((partner['partner_id'] or False, []) for partner in partners)
if not partner_ids:
return [], [], []
# This dictionary will store the not due amount of all partners
undue_amounts = {}
query = '''SELECT l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.internal_type IN %s)
AND (COALESCE(l.date_maturity,l.date) > %s)\
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
AND (l.date <= %s)
AND l.company_id = %s'''
cr.execute(query, (tuple(move_state), tuple(account_type), date_from, tuple(partner_ids), date_from, user_company))
aml_ids = cr.fetchall()
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
for line in self.env['account.move.line'].browse(aml_ids):
partner_id = line.partner_id.id or False
if partner_id not in undue_amounts:
undue_amounts[partner_id] = 0.0
line_amount = line.balance
if line.balance == 0:
continue
for partial_line in line.matched_debit_ids:
if partial_line.create_date[:10] <= date_from:
line_amount += partial_line.amount
for partial_line in line.matched_credit_ids:
if partial_line.create_date[:10] <= date_from:
line_amount -= partial_line.amount
undue_amounts[partner_id] += line_amount
lines[partner_id].append({
'line': line,
'amount': line_amount,
'period': 6,
})
# Use one query per period and store results in history (a list variable)
# Each history will contain: history[1] = {'<partner_id>': <partner_debit-credit>}
history = []
for i in range(5):
args_list = (tuple(move_state), tuple(account_type), tuple(partner_ids),)
dates_query = '(COALESCE(l.date_maturity,l.date)'
if periods[str(i)]['start'] and periods[str(i)]['stop']:
dates_query += ' BETWEEN %s AND %s)'
args_list += (periods[str(i)]['start'], periods[str(i)]['stop'])
elif periods[str(i)]['start']:
dates_query += ' >= %s)'
args_list += (periods[str(i)]['start'],)
else:
dates_query += ' <= %s)'
args_list += (periods[str(i)]['stop'],)
args_list += (date_from, user_company)
query = '''SELECT l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.internal_type IN %s)
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
AND ''' + dates_query + '''
AND (l.date <= %s)
AND l.company_id = %s'''
cr.execute(query, args_list)
partners_amount = {}
aml_ids = cr.fetchall()
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
for line in self.env['account.move.line'].browse(aml_ids):
partner_id = line.partner_id.id or False
if partner_id not in partners_amount:
partners_amount[partner_id] = 0.0
line_amount = line.balance
if line.balance == 0:
continue
for partial_line in line.matched_debit_ids:
if partial_line.create_date[:10] <= date_from:
line_amount += partial_line.amount
for partial_line in line.matched_credit_ids:
if partial_line.create_date[:10] <= date_from:
line_amount -= partial_line.amount
partners_amount[partner_id] += line_amount
lines[partner_id].append({
'line': line,
'amount': line_amount,
'period': i + 1,
})
history.append(partners_amount)
for partner in partners:
at_least_one_amount = False
values = {}
undue_amt = 0.0
if partner['partner_id'] in undue_amounts: # Making sure this partner actually was found by the query
undue_amt = undue_amounts[partner['partner_id']]
total[6] = total[6] + undue_amt
values['direction'] = undue_amt
if not float_is_zero(values['direction'], precision_rounding=self.env.user.company_id.currency_id.rounding):
at_least_one_amount = True
for i in range(5):
during = False
if partner['partner_id'] in history[i]:
during = [history[i][partner['partner_id']]]
# Adding counter
total[(i)] = total[(i)] + (during and during[0] or 0)
values[str(i)] = during and during[0] or 0.0
if not float_is_zero(values[str(i)], precision_rounding=self.env.user.company_id.currency_id.rounding):
at_least_one_amount = True
values['total'] = sum([values['direction']] + [values[str(i)] for i in range(5)])
## Add for total
total[(i + 1)] += values['total']
values['partner_id'] = partner['partner_id']
if partner['partner_id']:
browsed_partner = self.env['res.partner'].browse(partner['partner_id'])
values['name'] = browsed_partner.name and len(browsed_partner.name) >= 45 and browsed_partner.name[0:40] + '...' or browsed_partner.name
values['trust'] = browsed_partner.trust
else:
values['name'] = _('Unknown Partner')
values['trust'] = False
if at_least_one_amount:
res.append(values)
return res, total, lines
def generate_xlsx_report(self, workbook, data, obj):
currency = self.env.user.company_id.currency_id.symbol or ''
sheet = workbook.add_worksheet()
format1 = workbook.add_format({'font_size': 16, 'align': 'vcenter', 'bg_color': '#D3D3D3', 'bold': True})
format1.set_font_color('#000080')
format2 = workbook.add_format({'font_size': 12})
format3 = workbook.add_format({'font_size': 10, 'bold': True})
format4 = workbook.add_format({'font_size': 10})
format5 = workbook.add_format({'font_size': 12, 'bold': True, 'bg_color': '#D3D3D3'})
format1.set_align('center')
format2.set_align('left')
format3.set_align('left')
format4.set_align('center')
sheet.merge_range('A2:J3', 'Aged Partner Balance', format1)
row = 5
col = 0
if data['form']['result_selection'] == 'customer':
account_type = ['receivable']
elif data['form']['result_selection'] == 'supplier':
account_type = ['payable']
else:
account_type = ['payable', 'receivable']
date_from = data['form'].get('date_from', time.strftime('%Y-%m-%d'))
target_move = data['form'].get('target_move', 'all')
movelines, total, dummy = self._get_billwise_move_lines(account_type,
date_from, target_move,
data['form']['period_length'])
for partner in dummy:
for line in dummy[partner]:
line['intervals'] = {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'total': 0
}
line['intervals'][str(line['period'] - 1)] = line['amount']
line['intervals']['total'] += line['amount']
form = data['form']
sheet.merge_range(row, col, row, col+2, 'Start Date :', format2)
sheet.merge_range(row, col+3, row, col+6, form['date_from'], format2)
row += 1
sheet.merge_range(row, col, row, col+2, 'Period Length (days) :', format2)
sheet.merge_range(row, col+3, row, col+6, form['period_length'], format2)
row += 1
account_type = ""
if form['result_selection'] == 'customer':
account_type += "Receivable Accounts"
elif form['result_selection'] == 'supplier':
account_type += "Payable Accounts"
elif form['result_selection'] == 'customer_supplier':
account_type += "Receivable & Payable Accounts"
target_move = ""
if form['target_move'] == 'all':
target_move += "All Entries"
elif form['result_selection'] == 'posted':
target_move += "All Posted Entries"
sheet.merge_range(row, col, row, col+2, "Partner's :", format2)
sheet.merge_range(row, col + 3, row, col + 6, account_type, format2)
row += 1
sheet.merge_range(row, col, row, col+2, 'Report Type :', format2)
sheet.merge_range(row, col+3, row, col+6,
"Bill-Wise", format2)
row += 2
# constructing the table
sheet.merge_range(row, col, row, col+2, "Partners", format5)
sheet.set_column(col+2, col+9, 10)
sheet.write(row, col+3, "Not Due", format5)
sheet.write(row, col+4, form['4']['name'], format5)
sheet.write(row, col+5, form['3']['name'], format5)
sheet.write(row, col+6, form['2']['name'], format5)
sheet.write(row, col+7, form['1']['name'], format5)
sheet.write(row, col+8, form['0']['name'], format5)
sheet.write(row, col+9, "Total", format5)
row += 2
sheet.merge_range(row, col, row, col+2, "Account Total", format3)
if total:
sheet.write(row, col + 3,
total[6] and str(total[6])+" "+currency or '__',
format2)
sheet.write(row, col + 4,
total[4] and str(total[4])+" "+currency or '__',
format2)
sheet.write(row, col + 5,
total[3] and str(total[3])+" "+currency or '__',
format2)
sheet.write(row, col + 6,
total[2] and str(total[2])+" "+currency or '__',
format2)
sheet.write(row, col + 7,
total[1] and str(total[1])+" "+currency or '__',
format2)
sheet.write(row, col + 8,
total[0] and str(total[0])+" "+currency or '__',
format2)
sheet.write(row, col + 9,
total[5] and str(total[5])+" "+currency or '__',
format2)
row += 1
for partner in movelines:
sheet.merge_range(row, col, row, col + 2, partner['name'], format3)
sheet.write(row, col + 3,
partner['direction'] and str(partner['direction'])+" "+currency or '__',
format2)
sheet.write(row, col + 4,
partner['4'] and str(partner['4'])+" "+currency or '__',
format2)
sheet.write(row, col + 5,
partner['3'] and str(partner['3'])+" "+currency or '__',
format2)
sheet.write(row, col + 6,
partner['2'] and str(partner['2'])+" "+currency or '__',
format2)
sheet.write(row, col + 7,
partner['1'] and str(partner['1'])+" "+currency or '__',
format2)
sheet.write(row, col + 8,
partner['0'] and str(partner['0'])+" "+currency or '__',
format2)
sheet.write(row, col + 9,
partner['total'] and str(partner['total'])+" "+currency or '__',
format2)
row += 1
for line in dummy[partner['partner_id']]:
if line['amount'] > 0:
sheet.merge_range(row, col, row, col + 2, line['line'].invoice_id.number, format4)
sheet.write(row, col + 3,
line['intervals'].get('5') and str(line['intervals'].get('5'))+" "+currency or '__',
format2)
sheet.write(row, col + 4,
line['intervals'].get('4') and str(line['intervals'].get('4'))+" "+currency or '__',
format2)
sheet.write(row, col + 5,
line['intervals'].get('3') and str(line['intervals'].get('3'))+" "+currency or '__',
format2)
sheet.write(row, col + 6,
line['intervals'].get('2') and str(line['intervals'].get('2'))+" "+currency or '__',
format2)
sheet.write(row, col + 7,
line['intervals'].get('1') and str(line['intervals'].get('1'))+" "+currency or '__',
format2)
sheet.write(row, col + 8,
line['intervals'].get('0') and str(line['intervals'].get('0'))+" "+currency or '__',
format2)
sheet.write(row, col + 9,
line['intervals'].get('total') and str(line['intervals'].get('total'))+" "+currency or '__',
format2)
row += 1
row += 1
AgedBillwiseXlsx('report.partner_ageing_billwise_xlsx.partner_balance_xlsx.xlsx',
'account.aged.trial.balance.xls')

BIN
partner_ageing_billwise_xlsx/static/description/aged_partner_wiz.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
partner_ageing_billwise_xlsx/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

BIN
partner_ageing_billwise_xlsx/static/description/cybro_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
partner_ageing_billwise_xlsx/static/description/excel_report_menu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

78
partner_ageing_billwise_xlsx/static/description/index.html

@ -0,0 +1,78 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Aged Partner Balance in Excel(Bill-Wise)</h2>
<h3 class="oe_slogan"></h3>
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4>
</div>
<div class="oe_row oe_spaced" style="padding-left:65px;">
<h3><p style="margin-left: 42px;"><b>Features:</b></p></h3>
<div>
<span style="color:green;"> &#9745; </span> Bill-wise aged partner balance report in excel format.<br/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_picture">
<h3 class="oe_slogan">Overview</h3>
<p class="oe_mt32 text-justify" style="text-align: center;">
By default, Odoo doesn't have a bill-wise aged partner balance report.
With this module, we can have an excel report of bill-wise aged partner balance report.
</p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h5 class="oe_slogan"><b>New menu is added for excel aged partner balance.</b></h5>
<div style="text-align:center;">
<div class=" oe_demo oe_picture oe_screenshot">
<img style="width:35%;" src="excel_report_menu.png">
</div>
</div>
<br />
<div class="oe_row oe_spaced">
<h5 class="oe_slogan"><b>This menu will open a wizard where we can provide all the details such as period length, start date, account type etc.. </b></h5>
</div>
<div class="col-md-12">
<div class="oe_row_img oe_demo oe_picture oe_screenshot">
<img src="aged_partner_wiz.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="col-md-12">
<div class=" oe_demo oe_picture oe_screenshot">
<img src="report_xls.png">
<div class="oe_demo_footer oe_centeralign" style="background-color:rgba(162, 70, 137, 0.7);">Bill-Wise Report</div>
</div>
</div>
</section>
<section class="oe_container">
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2>
<div class="oe_slogan" style="margin-top:10px !important;">
<div>
<a class="btn btn-primary btn-lg mt8"
style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i
class="fa fa-envelope"></i> Email </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;"
href="https://www.cybrosys.com/contact/"><i
class="fa fa-phone"></i> Contact Us </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;"
href="https://www.cybrosys.com/odoo-customization-and-installation/"><i
class="fa fa-check-square"></i> Request Customization </a>
</div>
<br>
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block">
<div>
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td>
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td>
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td>
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td>
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td>
</div>
</div>
</section>

BIN
partner_ageing_billwise_xlsx/static/description/report_xls.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
partner_ageing_billwise_xlsx/static/src/img/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

53
partner_ageing_billwise_xlsx/views/report_aged_partner_billwise.xml

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<report
id="financial_report_xlsx"
model="account.aged.trial.balance.xls"
string=" "
report_type="xlsx"
name="partner_ageing_billwise_xlsx.partner_balance_xlsx.xlsx"
file="partner_ageing_billwise_xlsx.partner_balance_xlsx.xlsx"
attachment_use="False"
/>
<record id="aged_balance_view_billwise_xls" model="ir.ui.view">
<field name="name">Aged Partner Balance Billwise Excel</field>
<field name="model">account.aged.trial.balance.xls</field>
<!--<field name="inherit_id" ref="account.account_aged_balance_view" />-->
<field name="arch" type="xml">
<form string="Report Options">
<separator string="Aged Partner Balance"/>
<label string="Aged Partner Balance is a more detailed report of your receivables by intervals. Odoo calculates a table of credit balance by start Date. So if you request an interval of 30 days Odoo generates an analysis of creditors for the past month, past two months, and so on. "/>
<group col="4">
<field name="date_from"/>
<field name="period_length"/>
<newline/>
<field name="result_selection" widget="radio"/>
<field name="target_move" widget="radio"/>
</group>
<field name="journal_ids" required="0" invisible="1"/>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_aged_partner_balance_xls">
<field name="name">Partner Ageing Billwise Excel</field>
<field name="res_model">account.aged.trial.balance.xls</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="aged_balance_view_billwise_xls" />
<field name="target">new</field>
</record>
<menuitem name="Excel Reports" parent="account.menu_finance_reports"
id="excel_reports_menu" sequence="3" />
<menuitem name="Excel Reports" parent="excel_reports_menu"
id="aged_partner_xls" sequence="1"
action="action_aged_partner_balance_xls"
/>
</odoo>
Loading…
Cancel
Save