from odoo import models, fields, api, _, tools 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): tools.drop_view_if_exists(self.env.cr, 'snk_bank_and_cash_report') company = self.env['res.company'].browse(1) currency_id = company.currency_id.id self.env.cr.execute(""" CREATE OR REPLACE VIEW snk_bank_and_cash_report AS ( select ROW_NUMBER () OVER () as id, 'Begining Balance' as description, null as partner_id, null as account_id, {currency_id} as currency_id, max(acm.date) as date, sum(acm.debit) as debit, sum(acm.credit) as credit, sum(acm.debit - acm.credit) as balance from account_move_line acm left join account_journal aj on acm.journal_id = aj.id where date < '{start_date}' and aj.type in ('bank', 'cash') union all select ROW_NUMBER () OVER () + 1 as id, acm.name as description, null as partner_id, acm.account_id, {currency_id} as currency_id, acm.date, acm.debit, acm.credit,acm.balance from account_move_line acm left join account_journal aj on acm.journal_id = aj.id where date between '{start_date}' and '{end_date}' and aj.type in ('bank', 'cash') )""".format(start_date=self.date_from,end_date=self.date_to, currency_id=currency_id)) return { 'name': _('Sillo Report Bank and Cash'), 'type': 'ir.actions.act_window', 'view_mode': 'tree', 'res_model': 'snk.bank.and.cash.report', 'views': [(False, 'tree')], 'target': False } # 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('snk_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'], # } # }