from odoo import models, fields, api, _ from datetime import date, datetime, timedelta from dateutil.relativedelta import relativedelta from odoo.exceptions import ValidationError class WzLedgerBankAndCash(models.TransientModel): _name = 'wz.ledger.bank.and.cash' _description = 'Wizard Bank and Cash Report' def default_user_type(self): return self.env['account.account.type'].sudo().search([('name', '=', 'Bank and Cash')], limit=1) date_from = fields.Date("From Date") date_to = fields.Date("To Date") account_ids = fields.Many2many('account.account', string='Account') user_type_id = fields.Many2one('account.account.type', string='User Type', default=lambda self:self.default_user_type()) @api.constrains("date_from", "date_to") def _check_filtered(self): for rec in self: if rec.date_from > rec.date_to: raise ValidationError(_("Invalid Date ! End date should be greater than the start date")) def generate(self): beginning_balance = 0 balance = 0 total_balance = 0 start = self.date_from end = self.date_to move_line = self.env['account.move.line'].search([('date', '>=', start), ('date', '<=', end),('account_id', 'in', self.account_ids.ids), ('move_id.state', '=', 'posted')]) bank_cash = self.env['ledger.bank.and.cash'] move_line2 = self.env['account.move.line'].search([('date', '<=', start), ('account_id', 'in', self.account_ids.ids), ('move_id.state', '=', 'posted')]) self.env.cr.execute(""" delete from ledger_bank_and_cash """) if move_line: no = 1 mv_line_sorted = sorted(move_line, key=lambda x: x["date"]) for account in self.account_ids: for rec in mv_line_sorted: if rec.account_id.id == account.id: beginning_balance = sum(move_line2.filtered(lambda x : x.account_id.id == rec.account_id.id).mapped('balance')) if no == 1: balance = beginning_balance + (rec.debit - rec.credit) total_balance = balance else: total_balance += rec.balance bank_cash.create({ 'date': rec.date, 'account_id': rec.account_id.id, 'move_id': rec.move_id.id, 'partner_id': rec.partner_id.id, 'currency_id': rec.currency_id.id, 'beginning_balance': beginning_balance, 'balance': total_balance, 'debit': rec.debit, 'credit': rec.credit, }) no += 1 no = 1 if bank_cash: bank_cash.sorted(key=lambda r: (r.date, r.account_id)) return { 'name': _("Cash and Bank Book Period %s s/d %s" %(self.date_from.strftime("%d-%m-%Y"), self.date_to.strftime("%d-%m-%Y"))), 'view_mode': 'list', 'view_id': self.env.ref('accounting_report.accounting_report_ledger_bank_and_cash_view_tree').id, 'res_model': 'ledger.bank.and.cash', 'type': 'ir.actions.act_window', 'context': { 'group_by': ['account_id'], } }