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.
		
		
		
		
		
			
		
			
				
					
					
						
							162 lines
						
					
					
						
							7.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							162 lines
						
					
					
						
							7.0 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | |
| # | |
| #    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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| from odoo import models, fields, api, _ | |
| from odoo.exceptions import UserError | |
| 
 | |
| 
 | |
| class AccountRegisterPayments(models.TransientModel): | |
|     _inherit = "account.payment.register" | |
| 
 | |
|     bank_reference = fields.Char(copy=False) | |
|     cheque_reference = fields.Char(copy=False) | |
|     effective_date = fields.Date('Effective Date', | |
|                                  help='Effective date of PDC', copy=False, | |
|                                  default=False) | |
| 
 | |
|     def _prepare_payment_vals(self, invoices): | |
|         res = super(AccountRegisterPayments, self)._prepare_payment_vals( | |
|             invoices) | |
|         # Check payment method is Check or PDC | |
|         check_pdc_ids = self.env['account.payment.method'].search( | |
|             [('code', 'in', ['pdc', 'check_printing'])]) | |
|         if self.payment_method_id.id in check_pdc_ids.ids: | |
|             currency_id = self.env['res.currency'].browse(res['currency_id']) | |
|             journal_id = self.env['account.journal'].browse(res['journal_id']) | |
|             # Updating values in case of Multi payments | |
|             res.update({ | |
|                 'bank_reference': self.bank_reference, | |
|                 'cheque_reference': self.cheque_reference, | |
|                 'check_manual_sequencing': journal_id.check_manual_sequencing, | |
|                 'effective_date': self.effective_date, | |
|                 'check_amount_in_words': currency_id.amount_to_text( | |
|                     res['amount']), | |
|             }) | |
|         return res | |
| 
 | |
| 
 | |
| 
 | |
| class AccountPayment(models.Model): | |
|     _inherit = "account.payment" | |
| 
 | |
|     bank_reference = fields.Char(copy=False) | |
|     cheque_reference = fields.Char(copy=False) | |
|     effective_date = fields.Date('Effective Date', | |
|                                  help='Effective date of PDC', copy=False, | |
|                                  default=False) | |
| 
 | |
|     def open_payment_matching_screen(self): | |
|         # Open reconciliation view for customers/suppliers | |
|         move_line_id = False | |
|         for move_line in self.line_ids: | |
|             if move_line.account_id.reconcile: | |
|                 move_line_id = move_line.id | |
|                 break | |
|         if not self.partner_id: | |
|             raise UserError(_("Payments without a customer can't be matched")) | |
|         action_context = {'company_ids': [self.company_id.id], 'partner_ids': [ | |
|             self.partner_id.commercial_partner_id.id]} | |
|         if self.partner_type == 'customer': | |
|             action_context.update({'mode': 'customers'}) | |
|         elif self.partner_type == 'supplier': | |
|             action_context.update({'mode': 'suppliers'}) | |
|         if move_line_id: | |
|             action_context.update({'move_line_id': move_line_id}) | |
|         return { | |
|             'type': 'ir.actions.client', | |
|             'tag': 'manual_reconciliation_view', | |
|             'context': action_context, | |
|         } | |
| 
 | |
|     def print_checks(self): | |
|         """ Check that the recordset is valid, set the payments state to | |
|         sent and call print_checks() """ | |
|         # Since this method can be called via a client_action_multi, we | |
|         # need to make sure the received records are what we expect | |
|         selfs = self.filtered(lambda r: | |
|                              r.payment_method_id.code | |
|                              in ['check_printing', 'pdc'] | |
|                              and r.state != 'reconciled') | |
|         if len(selfs) == 0: | |
|             raise UserError(_( | |
|                 "Payments to print as a checks must have 'Check' " | |
|                 "or 'PDC' selected as payment method and " | |
|                 "not have already been reconciled")) | |
|         if any(payment.journal_id != selfs[0].journal_id for payment in selfs): | |
|             raise UserError(_( | |
|                 "In order to print multiple checks at once, they " | |
|                 "must belong to the same bank journal.")) | |
| 
 | |
|         if not selfs[0].journal_id.check_manual_sequencing: | |
|             # The wizard asks for the number printed on the first | |
|             # pre-printed check so payments are attributed the | |
|             # number of the check the'll be printed on. | |
|             last_printed_check = selfs.search([ | |
|                 ('journal_id', '=', selfs[0].journal_id.id), | |
|                 ('check_number', '!=', "0")], order="check_number desc", | |
|                 limit=1) | |
|             next_check_number = last_printed_check and int( | |
|                 last_printed_check.check_number) + 1 or 1 | |
|             return { | |
|                 'name': _('Print Pre-numbered Checks'), | |
|                 'type': 'ir.actions.act_window', | |
|                 'res_model': 'print.prenumbered.checks', | |
|                 'view_mode': 'form', | |
|                 'target': 'new', | |
|                 'context': { | |
|                     'payment_ids': self.ids, | |
|                     'default_next_check_number': next_check_number, | |
|                 } | |
|             } | |
|         else: | |
|             self.filtered(lambda r: r.state == 'draft').post() | |
|             self.write({'state': 'sent'}) | |
|             return self.do_print_checks() | |
| 
 | |
|     def _prepare_payment_moves(self): | |
|         """ supered function to set effective date """ | |
|         res = super(AccountPayment, self)._prepare_payment_moves() | |
|         inbound_pdc_id = self.env.ref( | |
|             'base_accounting_kit.account_payment_method_pdc_in').id | |
|         outbound_pdc_id = self.env.ref( | |
|             'base_accounting_kit.account_payment_method_pdc_out').id | |
|         if self.payment_method_id.id == inbound_pdc_id or \ | |
|                 self.payment_method_id.id == outbound_pdc_id \ | |
|                 and self.effective_date: | |
|             res[0]['date'] = self.effective_date | |
|             for line in res[0]['line_ids']: | |
|                 line[2]['date_maturity'] = self.effective_date | |
|         return res | |
| 
 | |
|     def mark_as_sent(self): | |
|         self.write({'is_move_sent': True}) | |
| 
 | |
|     def unmark_as_sent(self): | |
|         self.write({'is_move_sent': False}) | |
| 
 | |
| class AccountPaymentMethod(models.Model): | |
|     _inherit = "account.payment.method" | |
| 
 | |
|     @api.model | |
|     def _get_payment_method_information(self): | |
|         res = super()._get_payment_method_information() | |
|         res['pdc'] = {'mode': 'multi', 'domain': [('type', '=', 'bank')]} | |
|         return res
 | |
| 
 |