diff --git a/account_pdc/__init__.py b/account_pdc/__init__.py new file mode 100644 index 000000000..5d93c0e13 --- /dev/null +++ b/account_pdc/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Cybrosys Technologies() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# 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 +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import models +import wizard +import report diff --git a/account_pdc/__manifest__.py b/account_pdc/__manifest__.py new file mode 100644 index 000000000..83193e896 --- /dev/null +++ b/account_pdc/__manifest__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Cybrosys Technologies() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# 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 +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'PDC Management', + 'version': '10.0.1.0', + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': 'http://www.cybrosys.com', + 'category': 'Accounting', + 'summary': 'Extension on Cheques to handle Post Dated Cheques', + 'description': """ Extension on Cheques to handle Post Dated Cheques """, + 'depends': ['account_check_printing'], + 'data': [ + 'data/account_pdc_data.xml', + 'views/account_payment_view.xml', + 'views/report_payment.xml', + 'wizard/account_report_payment_view.xml', + ], + 'images': ['static/description/banner.jpg'], + 'license': 'LGPL-3', + 'installable': True, + 'auto_install': False, +} diff --git a/account_pdc/data/account_pdc_data.xml b/account_pdc/data/account_pdc_data.xml new file mode 100644 index 000000000..54ec4ca7f --- /dev/null +++ b/account_pdc/data/account_pdc_data.xml @@ -0,0 +1,19 @@ + + + + + + PDC + pdc + inbound + + + PDC + pdc + outbound + + + + + + \ No newline at end of file diff --git a/account_pdc/models/__init__.py b/account_pdc/models/__init__.py new file mode 100644 index 000000000..fdd64429b --- /dev/null +++ b/account_pdc/models/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Cybrosys Technologies() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# 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 +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## + +import account_journal +import account_payment diff --git a/account_pdc/models/account_journal.py b/account_pdc/models/account_journal.py new file mode 100644 index 000000000..996a0f079 --- /dev/null +++ b/account_pdc/models/account_journal.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Cybrosys Technologies() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# 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 +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## + +from odoo import models, api, _ + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + @api.one + @api.depends('outbound_payment_method_ids') + def _compute_check_printing_payment_method_selected(self): + self.check_printing_payment_method_selected = any( + pm.code in ['check_printing', 'pdc'] for pm in self.outbound_payment_method_ids) + + @api.model + def _enable_pdc_on_bank_journals(self): + """ Enables check printing payment method and add a check sequence on bank journals. + Called upon module installation via data file. + """ + pdcin = self.env.ref('account_pdc.account_payment_method_pdc_in') + pdcout = self.env.ref('account_pdc.account_payment_method_pdc_out') + bank_journals = self.search([('type', '=', 'bank')]) + for bank_journal in bank_journals: + # bank_journal._create_check_sequence() + bank_journal.write({ + 'inbound_payment_method_ids': [(4, pdcin.id, None)], + 'outbound_payment_method_ids': [(4, pdcout.id, None)], + }) diff --git a/account_pdc/models/account_payment.py b/account_pdc/models/account_payment.py new file mode 100644 index 000000000..fce6fe15e --- /dev/null +++ b/account_pdc/models/account_payment.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2017-TODAY Cybrosys Technologies(). +# Author: Cybrosys Technologies() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# 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 +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## + +from odoo import models, fields, api, _ +from odoo.exceptions import UserError + + +class AccountRegisterPayments(models.TransientModel): + _inherit = "account.register.payments" + + effective_date = fields.Date('Effective Date', help='Effective date of PDC', copy=False, default=False) + + def get_payment_vals(self): + res = super(AccountRegisterPayments, self).get_payment_vals() + if self.payment_method_id == self.env.ref('account_check_printing.account_payment_method_check'): + res.update({ + 'check_amount_in_words': self.check_amount_in_words, + 'check_manual_sequencing': self.check_manual_sequencing, + 'effective_date': self.effective_date, + }) + 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) + + @api.multi + 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 + self = self.filtered(lambda r: r.payment_method_id.code in ['check_printing', 'pdc'] and r.state != 'reconciled') + + if len(self) == 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 != self[0].journal_id for payment in self): + raise UserError(_("In order to print multiple checks at once, they must belong to the same bank journal.")) + + if not self[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 = self.search([ + ('journal_id', '=', self[0].journal_id.id), + ('check_number', '!=', 0)], order="check_number desc", limit=1) + next_check_number = last_printed_check and 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_type': 'form', + '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 _get_move_vals(self, journal=None): + """ Return dict to create the payment move + """ + journal = journal or self.journal_id + if not journal.sequence_id: + raise UserError(_('Configuration Error !'), + _('The journal %s does not have a sequence, please specify one.') % journal.name) + if not journal.sequence_id.active: + raise UserError(_('Configuration Error !'), _('The sequence of journal %s is deactivated.') % journal.name) + name = self.move_name or journal.with_context(ir_sequence_date=self.payment_date).sequence_id.next_by_id() + if self.payment_method_code =='pdc': + date = self.effective_date + else: + date = self.payment_date + return { + 'name': name, + 'date': date, + 'ref': self.communication or '', + 'company_id': self.company_id.id, + 'journal_id': journal.id, + } diff --git a/account_pdc/report/__init__.py b/account_pdc/report/__init__.py new file mode 100644 index 000000000..935b971f3 --- /dev/null +++ b/account_pdc/report/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +import report_payment + diff --git a/account_pdc/report/report_payment.py b/account_pdc/report/report_payment.py new file mode 100644 index 000000000..5cbcd286a --- /dev/null +++ b/account_pdc/report/report_payment.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +import time +from odoo import api, models +import logging + +_logger = logging.getLogger(__name__) + + +class ReportPayment(models.AbstractModel): + _name = 'report.account_pdc.report_payment_template' + + def lines(self, payment_type, journal_ids, pdc_only, data): + domain = [] + if isinstance(journal_ids, int): + journal_ids = [journal_ids] + domain.append(('journal_id', 'in', journal_ids)) + if payment_type == 'inbound': + domain.append(('payment_type', '=', 'inbound')) + elif payment_type == 'outbound': + domain.append(('payment_type', '=', 'outbound')) + if data['form']['date_from']: + domain.append(('payment_date', '>=', data['form']['date_from'])) + if data['form']['date_to']: + domain.append(('payment_date', '<=', data['form']['date_to'])) + if data['form']['company_id']: + domain.append(('company_id', '=', data['form']['company_id'][0])) + if pdc_only: + domain.append(('payment_method_id.code', '=', 'pdc')) + if data['form']['effective_date_from']: + domain.append(('effective_date_from', '>=', data['form']['effective_date_from'])) + if data['form']['effective_date_to']: + domain.append(('effective_date_to', '<=', data['form']['effective_date_to'])) + + + return self.env['account.payment'].search(domain) + + + @api.model + def render_html(self, docids, data=None): + _logger.info("................................1..............................") + # target_move = data['form'].get('target_move', 'all') + # sort_selection = data['form'].get('sort_selection', 'date') + payment_type = data['form']['payment_type'] + pdc_only = data['form']['pdc_only'] + # effective_date_from = data['form']['effective_date_from'] + # effective_date_to = data['form']['effective_date_to'] + + res = {} + for journal in data['form']['journal_ids']: + res[journal] = self.with_context(data['form'].get('used_context', {})).lines(payment_type, journal, pdc_only, data) + docargs = { + 'doc_ids': data['form']['journal_ids'], + 'doc_model': self.env['account.journal'], + 'data': data, + 'docs': self.env['account.journal'].browse(data['form']['journal_ids']), + 'time': time, + 'lines': res, + } + return self.env['report'].render('account_pdc.report_payment_template', docargs) diff --git a/account_pdc/static/description/banner.jpg b/account_pdc/static/description/banner.jpg new file mode 100644 index 000000000..a1a674866 Binary files /dev/null and b/account_pdc/static/description/banner.jpg differ diff --git a/account_pdc/static/description/cybro_logo.png b/account_pdc/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/account_pdc/static/description/cybro_logo.png differ diff --git a/account_pdc/static/description/icon.png b/account_pdc/static/description/icon.png new file mode 100644 index 000000000..f47728351 Binary files /dev/null and b/account_pdc/static/description/icon.png differ diff --git a/account_pdc/static/description/index.html b/account_pdc/static/description/index.html new file mode 100644 index 000000000..afa39140e --- /dev/null +++ b/account_pdc/static/description/index.html @@ -0,0 +1,105 @@ +
+
+
+

PDC with Payments Report

+

...A simple way to handle Post Dated Checks...

+

Cybrosys Techno Solutions, www.cybrosys.com

+
+
+
+ +
+
+
+

Configuration

+
+
+
+ +
+
+
+

+

Select PDC:

+

As shown here, You have to select PDC to enable the PDC payment.This is only available with Journal of type 'Bank'

+

+
+
+
+ +
+
+
+

At The Time of Payment You Will Have

+
+
+
+ +
+
+
+

+

Payment form have two extra fields to put Bank and Check Detail.

+

+
+
+
+
+

+

When you select PDC, You can also put 'effective date' of PDC.

+

+
+
+
+ +
+
+
+
+ +
+
+
+

Yes,...You can generate a PDF report of all your payments.

+
+
+
+ +
+
+
+
+ +
+

Need Any Help?

+ +
+ + + + + + + + diff --git a/account_pdc/static/description/pdc_config.png b/account_pdc/static/description/pdc_config.png new file mode 100644 index 000000000..c046b55c0 Binary files /dev/null and b/account_pdc/static/description/pdc_config.png differ diff --git a/account_pdc/static/description/pdc_payment.png b/account_pdc/static/description/pdc_payment.png new file mode 100644 index 000000000..39aa93b15 Binary files /dev/null and b/account_pdc/static/description/pdc_payment.png differ diff --git a/account_pdc/static/description/pdc_payment_eff.png b/account_pdc/static/description/pdc_payment_eff.png new file mode 100644 index 000000000..ff9b1eb04 Binary files /dev/null and b/account_pdc/static/description/pdc_payment_eff.png differ diff --git a/account_pdc/static/description/pdc_report.png b/account_pdc/static/description/pdc_report.png new file mode 100644 index 000000000..1ff2cf4f0 Binary files /dev/null and b/account_pdc/static/description/pdc_report.png differ diff --git a/account_pdc/views/account_payment_view.xml b/account_pdc/views/account_payment_view.xml new file mode 100644 index 000000000..0cd82fc50 --- /dev/null +++ b/account_pdc/views/account_payment_view.xml @@ -0,0 +1,77 @@ + + + + account.payment.form.inherited + account.payment + + + +