From fb8abc000707a2b8ba1fb0d16c1d8cbbd640ea34 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 23 Jun 2023 14:12:49 +0700 Subject: Fiture Over Due Limit --- .../models/account_move_due_extension.py | 121 +++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 indoteknik_custom/models/account_move_due_extension.py (limited to 'indoteknik_custom/models/account_move_due_extension.py') diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py new file mode 100644 index 00000000..1de34408 --- /dev/null +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -0,0 +1,121 @@ +from odoo import models, api, fields +from odoo.exceptions import AccessError, UserError, ValidationError +from datetime import timedelta, date +import logging + +_logger = logging.getLogger(__name__) + +class DueExtension(models.Model): + _name = "due.extension" + _rec_name = 'number' + + number = fields.Char(string='Document No', index=True, copy=False, readonly=True) + partner_id = fields.Many2one('res.partner', string="Customer") + order_id = fields.Many2one('sale.order', string="SO", readonly=True) + due_line = fields.One2many('due.extension.line', 'due_id', string='Due Extension Lines', auto_join=True) + old_due = fields.Date(string="Old Due") + is_approve = fields.Boolean(string="Is Approve", readonly=True) + day_extension = fields.Selection([ + ('3', '3 Hari'), + ('7', '7 Hari'), + ('14', '14 Hari'), + ], string='Day Extension', help='Menambah Due Date yang sudah limit dari hari ini') + + @api.model + def create(self, vals): + vals['number'] = self.env['ir.sequence'].next_by_code('due.extension') or '0' + result = super(DueExtension, self).create(vals) + return result + + def approve_new_due(self): + if self.env.user.is_accounting: + if not self.day_extension: + raise UserError('Day Extension is not set.') + if not self.due_line: + raise UserError('Tidak ada data di due line.') + + self.is_approve = True + + if self.partner_id: + if self.day_extension: + day_extension = int(self.day_extension) + new_due = date.today() + timedelta(days=day_extension) + + for line in self.due_line: + line.invoice_id.invoice_date_due = new_due + + if self.order_id._notification_margin_leader(): + self.order_id.approval_status = 'pengajuan2' + return self.order_id._notification_has_margin_leader() + + if self.order_id._notification_margin_manager(): + self.order_id.approval_status = 'pengajuan1' + return self.order_id._notification_has_margin_manager() + + sales = self.env['sale.order'].search([ + ('id', '=', self.order_id.id) + ]) + + sales.action_confirm() + else: + raise UserError('Hanya Finance Yang Bisa Approve') + + def generate_due_line(self): + if self.is_approve: + raise UserError('Sudah di approve, tidak bisa digenerate ulang') + if self.due_line: + raise UserError('Harus hapus semua line jika ingin generate ulang') + if self.partner_id.parent_id: + raise UserError('Harus pilih parent company') + + + partners = [] + partners += self.partner_id.child_ids + partners.append(self.partner_id) + + + for partner in partners: + query = [ + ('partner_id', '=', partner.id), + ('state', '=', 'posted'), + ('move_type', '=', 'out_invoice'), + ('amount_residual_signed', '>', 0) + ] + invoices = self.env['account.move'].search(query, order='invoice_date') + count = 0 + + for invoice in invoices: + if invoice.invoice_day_to_due < 0: + self.env['due.extension.line'].create([{ + 'due_id': self.id, + 'partner_id': invoice.partner_id.id, + 'invoice_id': invoice.id, + 'date_invoice': invoice.invoice_date, + 'efaktur_id': invoice.efaktur_id.id, + 'reference': invoice.ref, + 'total_amt': invoice.amount_total, + 'open_amt': invoice.amount_residual_signed, + 'due_date': invoice.invoice_date_due + }]) + count += 1 + _logger.info("Due Extension Line generated %s" % count) + +class DueExtensionLine(models.Model): + _name = 'due.extension.line' + _description = 'Due Extension Line' + _order = 'due_id, id' + + due_id = fields.Many2one('due.extension', string='Dunning Ref', required=True, ondelete='cascade', index=True, copy=False) + partner_id = fields.Many2one('res.partner', string='Customer') + invoice_id = fields.Many2one('account.move', string='Invoice') + date_invoice = fields.Date(string='Invoice Date') + efaktur_id = fields.Many2one('vit.efaktur', string='Faktur Pajak') + reference = fields.Char(string='Reference') + total_amt = fields.Float(string='Total Amount') + open_amt = fields.Float(string='Open Amount') + due_date = fields.Date(string='Due Date') + day_to_due = fields.Integer(string='Day To Due', compute="_compute_day_to_due") + + def _compute_day_to_due(self): + for line in self: + line.day_to_due = line.invoice_id.invoice_day_to_due -- cgit v1.2.3 From 787fe14fc0b14ed67f3d25a634c7a5a7e1a27204 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 26 Jun 2023 09:45:46 +0700 Subject: invisible field due_id after action cancel --- .../models/account_move_due_extension.py | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) (limited to 'indoteknik_custom/models/account_move_due_extension.py') diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index 1de34408..fbb8efe1 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -10,7 +10,7 @@ class DueExtension(models.Model): _rec_name = 'number' number = fields.Char(string='Document No', index=True, copy=False, readonly=True) - partner_id = fields.Many2one('res.partner', string="Customer") + partner_id = fields.Many2one('res.partner', string="Customer", readonly=True) order_id = fields.Many2one('sale.order', string="SO", readonly=True) due_line = fields.One2many('due.extension.line', 'due_id', string='Due Extension Lines', auto_join=True) old_due = fields.Date(string="Old Due") @@ -29,11 +29,6 @@ class DueExtension(models.Model): def approve_new_due(self): if self.env.user.is_accounting: - if not self.day_extension: - raise UserError('Day Extension is not set.') - if not self.due_line: - raise UserError('Tidak ada data di due line.') - self.is_approve = True if self.partner_id: @@ -56,19 +51,11 @@ class DueExtension(models.Model): ('id', '=', self.order_id.id) ]) - sales.action_confirm() + sales.state = 'sale' else: raise UserError('Hanya Finance Yang Bisa Approve') def generate_due_line(self): - if self.is_approve: - raise UserError('Sudah di approve, tidak bisa digenerate ulang') - if self.due_line: - raise UserError('Harus hapus semua line jika ingin generate ulang') - if self.partner_id.parent_id: - raise UserError('Harus pilih parent company') - - partners = [] partners += self.partner_id.child_ids partners.append(self.partner_id) @@ -99,13 +86,14 @@ class DueExtension(models.Model): }]) count += 1 _logger.info("Due Extension Line generated %s" % count) - + + class DueExtensionLine(models.Model): _name = 'due.extension.line' _description = 'Due Extension Line' _order = 'due_id, id' - due_id = fields.Many2one('due.extension', string='Dunning Ref', required=True, ondelete='cascade', index=True, copy=False) + due_id = fields.Many2one('due.extension', string='Due Ref', required=True, ondelete='cascade', index=True, copy=False) partner_id = fields.Many2one('res.partner', string='Customer') invoice_id = fields.Many2one('account.move', string='Invoice') date_invoice = fields.Date(string='Invoice Date') -- cgit v1.2.3 From 25a124e690cfea45d69ac34f051f0ee8749cda83 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 26 Jun 2023 16:42:08 +0700 Subject: add new field and log to due extension --- .../models/account_move_due_extension.py | 33 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'indoteknik_custom/models/account_move_due_extension.py') diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index fbb8efe1..f4ad1076 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -7,6 +7,8 @@ _logger = logging.getLogger(__name__) class DueExtension(models.Model): _name = "due.extension" + _description = "Due Extension" + _inherit = ['mail.thread'] _rec_name = 'number' number = fields.Char(string='Document No', index=True, copy=False, readonly=True) @@ -14,12 +16,17 @@ class DueExtension(models.Model): order_id = fields.Many2one('sale.order', string="SO", readonly=True) due_line = fields.One2many('due.extension.line', 'due_id', string='Due Extension Lines', auto_join=True) old_due = fields.Date(string="Old Due") - is_approve = fields.Boolean(string="Is Approve", readonly=True) + description = fields.Text(string="Description") + is_approve = fields.Boolean(string="Is Approve", readonly=True, tracking=True) + approval_status = fields.Selection([ + ('pengajuan', 'Pengajuan'), + ('approved', 'Approved'), + ], string='Approval Status', readonly=True, copy=False, index=True, tracking=3) day_extension = fields.Selection([ ('3', '3 Hari'), ('7', '7 Hari'), ('14', '14 Hari'), - ], string='Day Extension', help='Menambah Due Date yang sudah limit dari hari ini') + ], string='Day Extension', help='Menambah Due Date yang sudah limit dari hari ini', tracking=True) @api.model def create(self, vals): @@ -27,9 +34,19 @@ class DueExtension(models.Model): result = super(DueExtension, self).create(vals) return result + def due_extension_approval(self): + if not self.approval_status: + self.approval_status = 'pengajuan' + elif self.approval_status == 'pengajuan': + raise UserError('Anda sudah mengajukan ask approval') + elif self.approval_status == 'approved': + raise UserError('Document sudah di approve') + + def approve_new_due(self): if self.env.user.is_accounting: self.is_approve = True + self.approval_status = 'approved' if self.partner_id: if self.day_extension: @@ -86,6 +103,11 @@ class DueExtension(models.Model): }]) count += 1 _logger.info("Due Extension Line generated %s" % count) + def unlink(self): + res = super(DueExtension, self).unlink() + if self._name == 'due.extension': + raise UserError('Due Extension tidak bisa didelete') + return res class DueExtensionLine(models.Model): @@ -101,9 +123,14 @@ class DueExtensionLine(models.Model): reference = fields.Char(string='Reference') total_amt = fields.Float(string='Total Amount') open_amt = fields.Float(string='Open Amount') - due_date = fields.Date(string='Due Date') + due_date = fields.Date(string='Due Date', compute="_compute_due_date") day_to_due = fields.Integer(string='Day To Due', compute="_compute_day_to_due") def _compute_day_to_due(self): for line in self: line.day_to_due = line.invoice_id.invoice_day_to_due + + def _compute_due_date(self): + for line in self: + line.due_date = line.invoice_id.invoice_date_due + -- cgit v1.2.3 From 72888c5c59078195420f6a6da3ae1c65766390d7 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 27 Jun 2023 09:51:36 +0700 Subject: fix pkp non pkp quotation --- indoteknik_custom/models/account_move_due_extension.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'indoteknik_custom/models/account_move_due_extension.py') diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index f4ad1076..2e52f66c 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -41,7 +41,6 @@ class DueExtension(models.Model): raise UserError('Anda sudah mengajukan ask approval') elif self.approval_status == 'approved': raise UserError('Document sudah di approve') - def approve_new_due(self): if self.env.user.is_accounting: @@ -68,7 +67,9 @@ class DueExtension(models.Model): ('id', '=', self.order_id.id) ]) - sales.state = 'sale' + # sales.state = 'sale' + sales.action_confirm() + self.order_id.due_id = self.id else: raise UserError('Hanya Finance Yang Bisa Approve') @@ -105,7 +106,7 @@ class DueExtension(models.Model): _logger.info("Due Extension Line generated %s" % count) def unlink(self): res = super(DueExtension, self).unlink() - if self._name == 'due.extension': + if not self._name == 'due.extension': raise UserError('Due Extension tidak bisa didelete') return res -- cgit v1.2.3 From 0c7c0ad2e8dca7a1e47cd5a13642543f01a74afd Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 27 Jun 2023 11:45:07 +0700 Subject: add button cancel to due extension --- indoteknik_custom/models/account_move_due_extension.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models/account_move_due_extension.py') diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index 2e52f66c..93dfe62b 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -11,7 +11,7 @@ class DueExtension(models.Model): _inherit = ['mail.thread'] _rec_name = 'number' - number = fields.Char(string='Document No', index=True, copy=False, readonly=True) + number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) partner_id = fields.Many2one('res.partner', string="Customer", readonly=True) order_id = fields.Many2one('sale.order', string="SO", readonly=True) due_line = fields.One2many('due.extension.line', 'due_id', string='Due Extension Lines', auto_join=True) @@ -42,6 +42,20 @@ class DueExtension(models.Model): elif self.approval_status == 'approved': raise UserError('Document sudah di approve') + def due_extension_cancel(self): + if self.env.user.is_accounting: + if not self.approval_status or self.approval_status == 'pengajuan': + self.approval_status = False + sales = self.env['sale.order'].search([ + ('id', '=', self.order_id.id) + ]) + + sales.action_cancel() + elif self.approval_status == 'approved': + raise UserError('Document sudah di approve, Tidak bisa di cancel') + else: + raise UserError('Hanya Finance yang bisa cancel') + def approve_new_due(self): if self.env.user.is_accounting: self.is_approve = True -- cgit v1.2.3