14 changed files with 573 additions and 0 deletions
@ -0,0 +1,4 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from . import report |
||||
|
from . import models |
@ -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, |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from . import report_aged_partner_balance |
@ -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 |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from . import account_aged_partner_balance |
@ -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') |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 38 KiB |
@ -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;"> ☑ </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> |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 36 KiB |
@ -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…
Reference in new issue