From e59d33ea416afbe5d2e531f524be37c1eeef6015 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 19 Jun 2023 17:08:38 +0700 Subject: Create due extension when approve so --- indoteknik_custom/models/sale_order.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index cbc6a60a..e2693688 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -282,7 +282,18 @@ class SaleOrder(models.Model): def sale_order_approve(self): # raise UserError("Bisa langsung Confirm") self.check_due() + invoices = self.env['account.move'].search([ + ('partner_id', '=', self.partner_id.id), + ('invoice_day_to_due', '<', 0) + ]) + due_extension_obj = self.env['due.extension'] for order in self: + for invoice in invoices: + if invoice.invoice_day_to_due < 0: + value = { + 'invoice_id': invoice.id + } + due_extension_obj.create(value) if order.warehouse_id.id != 8: #GD Bandengan raise UserError('Gudang harus Bandengan') if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': @@ -323,7 +334,9 @@ class SaleOrder(models.Model): elif order.total_percent_margin <= 22 and not self.env.user.is_leader and not self.env.user.is_sales_manager: order.approval_status = 'pengajuan1' elif order._have_outstanding_invoices() and not self.env.user.is_leader and not self.env.user.is_sales_manager: - order.approval_status = 'pengajuan1' + order.approval_status = 'pengajuan1' + elif invoice.invoice_day_to_due < 0: + raise UserError("Anda Harus Memperbarui Due Date di Due Extension") else: raise UserError("Bisa langsung Confirm") -- cgit v1.2.3 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 --- indoteknik_custom/models/__init__.py | 1 + .../models/account_move_due_extension.py | 121 +++++++++++++++++++++ indoteknik_custom/models/sale_order.py | 120 +++++++++++++++----- 3 files changed, 217 insertions(+), 25 deletions(-) create mode 100644 indoteknik_custom/models/account_move_due_extension.py (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 9764e0c0..9d0f8d47 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -63,3 +63,4 @@ from . import procurement_monitoring_detail from . import brand_vendor from . import manufacturing from . import requisition +from . import account_move_due_extension 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 diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index e99876c2..d531c869 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -78,6 +78,7 @@ class SaleOrder(models.Model): delivery_service_type = fields.Char(string='Delivery Service Type', help='data dari rajaongkir') grand_total = fields.Monetary(string='Grand Total', help='Amount total + amount delivery', compute='_compute_grand_total') payment_link_midtrans = fields.Char(string='Payment Link', help='Url payment yg digenerate oleh midtrans, harap diserahkan ke customer agar dapat dilakukan pembayaran secara mandiri') + due_id = fields.Many2one('due.extension', string="Due Extension", readonly=True) def generate_payment_link_midtrans_sales_order(self): # midtrans_url = 'https://app.sandbox.midtrans.com/snap/v1/transactions' # dev - sandbox @@ -282,18 +283,10 @@ class SaleOrder(models.Model): def sale_order_approve(self): # raise UserError("Bisa langsung Confirm") self.check_due() - invoices = self.env['account.move'].search([ - ('partner_id', '=', self.partner_id.id), - ('invoice_day_to_due', '<', 0) - ]) - due_extension_obj = self.env['due.extension'] + parent_id = self.partner_id.parent_id.id + parent_id = parent_id if parent_id else self.partner_id.id + for order in self: - for invoice in invoices: - if invoice.invoice_day_to_due < 0: - value = { - 'invoice_id': invoice.id - } - due_extension_obj.create(value) if order.warehouse_id.id != 8: #GD Bandengan raise UserError('Gudang harus Bandengan') if order.state == 'cancel' or order.state == 'done' or order.state == 'sale': @@ -329,14 +322,16 @@ class SaleOrder(models.Model): raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price: raise UserError(_('Isi Vendor dan Harga Beli sebelum Request Approval')) - if order.total_percent_margin <= 15 and not self.env.user.is_leader: + + if order.validate_partner_invoice_due(): + return self._notification_has_unapprove_due() + + if order._notification_margin_leader(): order.approval_status = 'pengajuan2' - elif order.total_percent_margin <= 22 and not self.env.user.is_leader and not self.env.user.is_sales_manager: + return self._notification_has_margin_leader() + elif order._notification_margin_manager(): order.approval_status = 'pengajuan1' - elif order._have_outstanding_invoices() and not self.env.user.is_leader and not self.env.user.is_sales_manager: - order.approval_status = 'pengajuan1' - elif invoice.invoice_day_to_due < 0: - raise UserError("Anda Harus Memperbarui Due Date di Due Extension") + return self._notification_has_margin_manager() else: raise UserError("Bisa langsung Confirm") @@ -354,9 +349,81 @@ class SaleOrder(models.Model): self.approval_status = False return super(SaleOrder, self).action_cancel() + + def validate_partner_invoice_due(self): + parent_id = self.partner_id.parent_id.id + parent_id = parent_id if parent_id else self.partner_id.id + if self.due_id and self.due_id.is_approve == False: + raise UserError('Document Over Due Yang Anda Buat Belum Di Approve') + + if not self.env.user.is_leader and not self.env.user.is_sales_manager: + query = [ + ('partner_id', '=', parent_id), + ('state', '=', 'posted'), + ('move_type', '=', 'out_invoice'), + ('amount_residual_signed', '>', 0) + ] + invoices = self.env['account.move'].search(query, order='invoice_date') + due_extension = self.env['due.extension'].create([{ + 'partner_id': parent_id, + 'day_extension': '3', + 'order_id': self.id, + }]) + due_extension.generate_due_line() + self.due_id = due_extension.id + if len(self.due_id.due_line) > 0: + return True + else: + due_extension.unlink() + return False + + def _notification_margin_leader(self): + if self.total_percent_margin <= 15 and not self.env.user.is_leader: + return True + else: + return False + + def _notification_margin_manager(self): + if self.total_percent_margin <= 22 and not self.env.user.is_leader and not self.env.user.is_sales_manager: + return True + else: + return False + + def _notification_has_unapprove_due(self): + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'Notification', + 'message': 'Ada Invoice Yang Sudah Over Due, Silahkan Memperbarui Over Due di Due Extension', + 'next': {'type': 'ir.actions.act_window_close'}, + } + } + + def _notification_has_margin_leader(self): + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'Notification', + 'message': 'SO Harus Di Approve Oleh Pimpinan', + 'next': {'type': 'ir.actions.act_window_close'}, + } + } + + def _notification_has_margin_manager(self): + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'Notification', + 'message': 'SO Harus Di Approve Oleh Sales Manager', + 'next': {'type': 'ir.actions.act_window_close'}, + } + } + def action_confirm(self): - res = super(SaleOrder, self).action_confirm() for order in self: if order.warehouse_id.id != 8: #GD Bandengan raise UserError('Gudang harus Bandengan') @@ -375,16 +442,19 @@ class SaleOrder(models.Model): raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price or not line.purchase_tax_id: raise UserError(_('Isi Vendor, Harga Beli, dan Tax sebelum Request Approval')) - if order.total_percent_margin <= 15 and not self.env.user.is_leader: - raise UserError("Harus diapprove oleh Pimpinan") - elif order.total_percent_margin <= 22 and not self.env.user.is_leader and not self.env.user.is_sales_manager: - raise UserError("Harus diapprove oleh Manager") - elif order._have_outstanding_invoices() and not self.env.user.is_leader and not self.env.user.is_sales_manager: - raise UserError("Ada invoice due date, harus diapprove oleh Manager") + + if order.validate_partner_invoice_due(): + return self._notification_has_unapprove_due() + + if order._notification_margin_leader(): + return self._notification_has_margin_leader() + elif order._notification_margin_manager(): + return self._notification_has_margin_manager() else: order.approval_status = 'approved' - order.calculate_line_no() + order.calculate_line_no() + res = super(SaleOrder, self).action_confirm() return res def _have_outstanding_invoices(self): -- cgit v1.2.3 From dbe06610522bea7ff86d517dea626d91a59a73c8 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 23 Jun 2023 15:31:23 +0700 Subject: non pkp and pkp --- indoteknik_custom/models/res_partner.py | 5 +++++ indoteknik_custom/models/sale_order.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 77abaaf9..08e5b9e8 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -13,6 +13,11 @@ class ResPartner(models.Model): company_type_id = fields.Many2one('res.partner.company_type', string='Company Type') custom_pricelist_id = fields.Many2one('product.pricelist', string='Price Matrix') group_partner_id = fields.Many2one('group.partner', string='Group Partner') + customer_type = fields.Selection([ + ('pkp', 'PKP'), + ('non_pkp', 'Non PKP') + ]) + sppkp = fields.Char(string="SPPKP") def unlink(self): if self._name == 'res.partner': diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index d531c869..6a040ff3 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -79,6 +79,13 @@ class SaleOrder(models.Model): grand_total = fields.Monetary(string='Grand Total', help='Amount total + amount delivery', compute='_compute_grand_total') payment_link_midtrans = fields.Char(string='Payment Link', help='Url payment yg digenerate oleh midtrans, harap diserahkan ke customer agar dapat dilakukan pembayaran secara mandiri') due_id = fields.Many2one('due.extension', string="Due Extension", readonly=True) + customer_type = fields.Selection([ + ('pkp', 'PKP'), + ('nonpkp', 'Non PKP') + ]) + sppkp = fields.Char(string="SPPKP") + npwp = fields.Char(string="NPWP") + def generate_payment_link_midtrans_sales_order(self): # midtrans_url = 'https://app.sandbox.midtrans.com/snap/v1/transactions' # dev - sandbox @@ -423,6 +430,17 @@ class SaleOrder(models.Model): } } + def _set_sppkp_npwp_contact(self): + for contact in self: + partner_customer_type = contact.customer_type + contact.partner_id.customer_type = partner_customer_type + + partner_npwp = contact.npwp + contact.partner_id.npwp = partner_npwp + + partner_sppkp = contact.sppkp + contact.partner_id.sppkp = partner_sppkp + def action_confirm(self): for order in self: if order.warehouse_id.id != 8: #GD Bandengan @@ -451,6 +469,7 @@ class SaleOrder(models.Model): elif order._notification_margin_manager(): return self._notification_has_margin_manager() else: + order._set_sppkp_npwp_contact() order.approval_status = 'approved' order.calculate_line_no() -- cgit v1.2.3 From e22cda13f913f3c2839009095b42ebee440f599d Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 23 Jun 2023 15:38:11 +0700 Subject: fix bug customer_type selection value --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 08e5b9e8..bdeb8a2c 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -15,7 +15,7 @@ class ResPartner(models.Model): group_partner_id = fields.Many2one('group.partner', string='Group Partner') customer_type = fields.Selection([ ('pkp', 'PKP'), - ('non_pkp', 'Non PKP') + ('nonpkp', 'Non PKP') ]) sppkp = fields.Char(string="SPPKP") -- 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 +++++----------------- indoteknik_custom/models/sale_order.py | 11 ++++++++--- 2 files changed, 13 insertions(+), 20 deletions(-) (limited to 'indoteknik_custom/models') 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') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 6a040ff3..5bb93805 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -215,6 +215,12 @@ class SaleOrder(models.Model): def onchange_partner_shipping(self): self.real_shipping_id = self.partner_shipping_id + @api.onchange('partner_id') + def onchange_partner_contact(self): + self.npwp = self.partner_id.npwp + self.sppkp = self.partner_id.sppkp + self.customer_type = self.partner_id.customer_type + def _get_purchases(self): po_state = ['done', 'draft', 'purchase'] for order in self: @@ -290,8 +296,6 @@ class SaleOrder(models.Model): def sale_order_approve(self): # raise UserError("Bisa langsung Confirm") self.check_due() - parent_id = self.partner_id.parent_id.id - parent_id = parent_id if parent_id else self.partner_id.id for order in self: if order.warehouse_id.id != 8: #GD Bandengan @@ -355,6 +359,7 @@ class SaleOrder(models.Model): # raise UserError("PO harus di Cancel dahulu") self.approval_status = False + self.due_id = False return super(SaleOrder, self).action_cancel() def validate_partner_invoice_due(self): @@ -469,8 +474,8 @@ class SaleOrder(models.Model): elif order._notification_margin_manager(): return self._notification_has_margin_manager() else: - order._set_sppkp_npwp_contact() order.approval_status = 'approved' + order._set_sppkp_npwp_contact() order.calculate_line_no() res = super(SaleOrder, self).action_confirm() -- 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') 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 --- .../models/account_move_due_extension.py | 7 ++++--- indoteknik_custom/models/sale_order.py | 20 +++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) (limited to 'indoteknik_custom/models') 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 diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 5bb93805..a17cf7c8 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -217,9 +217,12 @@ class SaleOrder(models.Model): @api.onchange('partner_id') def onchange_partner_contact(self): - self.npwp = self.partner_id.npwp - self.sppkp = self.partner_id.sppkp - self.customer_type = self.partner_id.customer_type + parent_id = self.partner_id.parent_id + parent_id = parent_id if parent_id else self.partner_id + + self.npwp = parent_id.npwp + self.sppkp = parent_id.sppkp + self.customer_type = parent_id.customer_type def _get_purchases(self): po_state = ['done', 'draft', 'purchase'] @@ -435,16 +438,19 @@ class SaleOrder(models.Model): } } - def _set_sppkp_npwp_contact(self): + def _set_sppkp_npwp_contact(self): + parent_id = self.partner_id.parent_id + parent_id = parent_id if parent_id else self.partner_id + for contact in self: partner_customer_type = contact.customer_type - contact.partner_id.customer_type = partner_customer_type + parent_id.customer_type = partner_customer_type partner_npwp = contact.npwp - contact.partner_id.npwp = partner_npwp + parent_id.npwp = partner_npwp partner_sppkp = contact.sppkp - contact.partner_id.sppkp = partner_sppkp + parent_id.sppkp = partner_sppkp def action_confirm(self): for order in self: -- 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 +++++++++++++++- indoteknik_custom/models/sale_order.py | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models') 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 diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1a16f462..bf415dbb 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -78,7 +78,7 @@ class SaleOrder(models.Model): delivery_service_type = fields.Char(string='Delivery Service Type', help='data dari rajaongkir') grand_total = fields.Monetary(string='Grand Total', help='Amount total + amount delivery', compute='_compute_grand_total') payment_link_midtrans = fields.Char(string='Payment Link', help='Url payment yg digenerate oleh midtrans, harap diserahkan ke customer agar dapat dilakukan pembayaran secara mandiri') - due_id = fields.Many2one('due.extension', string="Due Extension", readonly=True) + due_id = fields.Many2one('due.extension', string="Due Extension", readonly=True, tracking=True) customer_type = fields.Selection([ ('pkp', 'PKP'), ('nonpkp', 'Non PKP') -- cgit v1.2.3 From 0c3abd74ac9aa0b3f1b6fe4e2435698922387b0b Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 27 Jun 2023 16:44:25 +0700 Subject: add new field subtotal_vendot to so line --- indoteknik_custom/models/sale_order.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 0a794f6d..d980e1fe 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -462,7 +462,7 @@ class SaleOrderLine(models.Model): 'res.partner', string='Vendor', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, change_default=True, index=True, tracking=1, - domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", ) + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) purchase_price = fields.Float('Purchase', required=True, digits='Product Price', default=0.0) purchase_tax_id = fields.Many2one('account.tax', string='Tax', domain=['|', ('active', '=', False), ('active', '=', True)]) @@ -470,6 +470,23 @@ class SaleOrderLine(models.Model): fee_third_party_line = fields.Float('FeeThirdPartyLine', compute='compute_fee_third_party_line', default=0) line_no = fields.Integer('No', default=0, copy=False) note_procurement = fields.Char(string='Note', help="Harap diisi jika ada keterangan tambahan dari Procurement, agar dapat dimonitoring") + vendor_subtotal = fields.Float( + string='Vendor Subtotal', compute="compute_vendor_subtotal") + + def compute_vendor_subtotal(self): + # self.vendor_subtotal = 1 + for line in self: + if line.vendor_id: + product = line.product_id + + if product: + vendor_price = line.purchase_price + if line.purchase_tax_id.price_include: + vendor_price = line.purchase_price + else: + vendor_price = line.purchase_price + (line.purchase_price*11/100) + + line.vendor_subtotal = vendor_price * line.product_uom_qty def compute_item_margin(self): for line in self: -- cgit v1.2.3 From e4f968ba874b899aa4af89b06abe83674ced938b Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Jun 2023 10:34:32 +0700 Subject: change id of produk sementara --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 0a794f6d..2fc1055b 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -324,7 +324,7 @@ class SaleOrder(models.Model): # must add product can sell validation if not line.product_id.product_tmpl_id.sale_ok: raise UserError('Product %s belum bisa dijual, harap hubungi finance' % line.product_id.display_name) - if line.product_id.id == 232383: + if line.product_id.id == 224484: raise UserError(_('Tidak bisa Confirm menggunakan Produk Sementara')) if not line.vendor_id or not line.purchase_price: raise UserError(_('Isi Vendor dan Harga Beli sebelum Request Approval')) -- cgit v1.2.3 From ecf9d25de623c5cef7f051b650c065c054a08a14 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Jun 2023 12:09:45 +0700 Subject: fix error vendor subtotal --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 09ee88fa..a15a2572 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -476,7 +476,7 @@ class SaleOrderLine(models.Model): def compute_vendor_subtotal(self): # self.vendor_subtotal = 1 for line in self: - if line.vendor_id: + if line.purchase_price: product = line.product_id if product: -- cgit v1.2.3 From 4501a0a17ae56ca822827a7aa500ce269391ee78 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Jun 2023 12:17:53 +0700 Subject: bug fix --- indoteknik_custom/models/sale_order.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index a15a2572..3b3ce13a 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -476,17 +476,17 @@ class SaleOrderLine(models.Model): def compute_vendor_subtotal(self): # self.vendor_subtotal = 1 for line in self: - if line.purchase_price: - product = line.product_id + if line.purchase_price > 0: + # product = line.product_id - if product: - vendor_price = line.purchase_price - if line.purchase_tax_id.price_include: - vendor_price = line.purchase_price - else: - vendor_price = line.purchase_price + (line.purchase_price*11/100) + # if product: + # vendor_price = line.purchase_price + # if line.purchase_tax_id.price_include: + # vendor_price = line.purchase_price + # else: + # vendor_price = line.purchase_price + (line.purchase_price*11/100) - line.vendor_subtotal = vendor_price * line.product_uom_qty + line.vendor_subtotal = line.purchase_price * line.product_uom_qty def compute_item_margin(self): for line in self: -- cgit v1.2.3 From ff7390468fb11915b35c9f522379132dde19a54d Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Jun 2023 12:29:12 +0700 Subject: bug fix vendor subtotal --- indoteknik_custom/models/sale_order.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 3b3ce13a..5f37e3b2 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -470,13 +470,11 @@ class SaleOrderLine(models.Model): fee_third_party_line = fields.Float('FeeThirdPartyLine', compute='compute_fee_third_party_line', default=0) line_no = fields.Integer('No', default=0, copy=False) note_procurement = fields.Char(string='Note', help="Harap diisi jika ada keterangan tambahan dari Procurement, agar dapat dimonitoring") - vendor_subtotal = fields.Float( - string='Vendor Subtotal', compute="compute_vendor_subtotal") + vendor_subtotal = fields.Float(string='Vendor Subtotal', compute="_compute_vendor_subtotal") - def compute_vendor_subtotal(self): - # self.vendor_subtotal = 1 + def _compute_vendor_subtotal(self): for line in self: - if line.purchase_price > 0: + if line.purchase_price > 0 and line.product_uom_qty > 0: # product = line.product_id # if product: @@ -485,8 +483,10 @@ class SaleOrderLine(models.Model): # vendor_price = line.purchase_price # else: # vendor_price = line.purchase_price + (line.purchase_price*11/100) - - line.vendor_subtotal = line.purchase_price * line.product_uom_qty + subtotal = line.purchase_price * line.product_uom_qty + line.vendor_subtotal = subtotal + else: + line.vendor_subtotal = 0 def compute_item_margin(self): for line in self: -- cgit v1.2.3 From 595b7a5d6409d218802bcc6437201a8fad13749a Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Jun 2023 15:53:06 +0700 Subject: add customer in delivery order scan --- indoteknik_custom/models/delivery_order.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/delivery_order.py b/indoteknik_custom/models/delivery_order.py index 3f8da384..be5fd2e0 100644 --- a/indoteknik_custom/models/delivery_order.py +++ b/indoteknik_custom/models/delivery_order.py @@ -74,6 +74,7 @@ class DeliveryOrderLine(models.TransientModel): carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') tracking_no = fields.Char(string='Tracking No') delivery_order_id = fields.Many2one('delivery.order', string='Delivery Order') + partner_id = fields.Many2one('res.partner', string='Customer') @api.onchange('name') def onchange_name(self): @@ -98,6 +99,8 @@ class DeliveryOrderLine(models.TransientModel): self.tracking_no = picking.delivery_tracking_no + self.partner_id = picking.partner_id + delivery_type = self.get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date) if delivery_type != 'departure': self.departure_date = picking.driver_departure_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') -- cgit v1.2.3 From 43ac0072bbf65bc7feb882bc3da8bbaefed5a6fe Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 Jun 2023 17:12:22 +0700 Subject: add sum purchase total --- indoteknik_custom/models/sale_order.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 5f37e3b2..7741aab7 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -78,6 +78,14 @@ class SaleOrder(models.Model): delivery_service_type = fields.Char(string='Delivery Service Type', help='data dari rajaongkir') grand_total = fields.Monetary(string='Grand Total', help='Amount total + amount delivery', compute='_compute_grand_total') payment_link_midtrans = fields.Char(string='Payment Link', help='Url payment yg digenerate oleh midtrans, harap diserahkan ke customer agar dapat dilakukan pembayaran secara mandiri') + purchase_total = fields.Char(string='Purchase Total', compute='_compute_purchase_total') + + def _compute_purchase_total(self): + for order in self: + total = 0 + for line in order.order_line: + total += line.vendor_subtotal + order.purchase_total = total def generate_payment_link_midtrans_sales_order(self): # midtrans_url = 'https://app.sandbox.midtrans.com/snap/v1/transactions' # dev - sandbox -- cgit v1.2.3 From 08bab33de9381b9a6d7ed53bb64976d52f0d7ecc Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Fri, 30 Jun 2023 10:24:17 +0700 Subject: change type of purchase total in sale order --- indoteknik_custom/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 7741aab7..9407db30 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -78,7 +78,7 @@ class SaleOrder(models.Model): delivery_service_type = fields.Char(string='Delivery Service Type', help='data dari rajaongkir') grand_total = fields.Monetary(string='Grand Total', help='Amount total + amount delivery', compute='_compute_grand_total') payment_link_midtrans = fields.Char(string='Payment Link', help='Url payment yg digenerate oleh midtrans, harap diserahkan ke customer agar dapat dilakukan pembayaran secara mandiri') - purchase_total = fields.Char(string='Purchase Total', compute='_compute_purchase_total') + purchase_total = fields.Monetary(string='Purchase Total', compute='_compute_purchase_total') def _compute_purchase_total(self): for order in self: -- cgit v1.2.3 From bba6f1f21dc0e62ae0a4f65ccbf3e2957cb07f3d Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 3 Jul 2023 10:42:46 +0700 Subject: Remove stock picking validation quantity --- indoteknik_custom/models/stock_picking.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index a14e71a3..2ddb5f75 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -298,14 +298,14 @@ class StockPicking(models.Model): # continue # raise UserError('Sudah pernah dikirim kalender') - if self.picking_type_id.code == 'outgoing': - for line in self.move_line_ids_without_package: - if line.move_id.sale_line_id.qty_delivered + line.qty_done > line.move_id.sale_line_id.product_uom_qty: - raise UserError("Qty Delivered akan lebih dari Qty SO") - elif self.picking_type_id.code == 'incoming': - for line in self.move_ids_without_package: - if line.purchase_line_id.qty_received + line.quantity_done > line.purchase_line_id.product_qty: - raise UserError('Qty Received akan lebih dari Qty PO') + # if self.picking_type_id.code == 'outgoing': + # for line in self.move_line_ids_without_package: + # if line.move_id.sale_line_id.qty_delivered + line.qty_done > line.move_id.sale_line_id.product_uom_qty: + # raise UserError("Qty Delivered akan lebih dari Qty SO") + # elif self.picking_type_id.code == 'incoming': + # for line in self.move_ids_without_package: + # if line.purchase_line_id.qty_received + line.quantity_done > line.purchase_line_id.product_qty: + # raise UserError('Qty Received akan lebih dari Qty PO') if self.is_internal_use: self.approval_status = 'approved' -- cgit v1.2.3 From 3f91265277c06429f78276c5096e06b9a622eef5 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 3 Jul 2023 15:09:13 +0700 Subject: fix bug pkp quotation --- indoteknik_custom/models/sale_order.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index c5169420..ecd43960 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -459,15 +459,9 @@ class SaleOrder(models.Model): parent_id = self.partner_id.parent_id parent_id = parent_id if parent_id else self.partner_id - for contact in self: - partner_customer_type = contact.customer_type - parent_id.customer_type = partner_customer_type - - partner_npwp = contact.npwp - parent_id.npwp = partner_npwp - - partner_sppkp = contact.sppkp - parent_id.sppkp = partner_sppkp + parent_id.customer_type = self.customer_type + parent_id.npwp = self.npwp + parent_id.sppkp = self.sppkp def action_confirm(self): for order in self: -- cgit v1.2.3 From 8ae9c244aa06c07d3723cf7a330125bc743c7533 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Thu, 6 Jul 2023 16:55:03 +0700 Subject: if purchase_ok false then cant running action confirm on po --- indoteknik_custom/models/purchase_order.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index 13ff2931..1eb76370 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -191,6 +191,9 @@ class PurchaseOrder(models.Model): raise UserError("Beda Margin dengan Sales, harus approval Manager") if not self.sale_order_id and not self.env.user.is_purchasing_manager and not self.env.user.is_leader: raise UserError("Tidak ada link dengan SO, harus approval Manager") + for line in self.order_line: + if not line.product_id.purchase_ok: + raise UserError("Terdapat barang yang tidak bisa di proses") self.approval_status = 'approved' self.po_status = 'menunggu' -- cgit v1.2.3 From 292ce85b0e841f14e41a35ff7fad420009b6b600 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 7 Jul 2023 14:14:49 +0700 Subject: count due --- .../models/account_move_due_extension.py | 56 +++++++++++++--------- indoteknik_custom/models/res_partner.py | 1 + 2 files changed, 34 insertions(+), 23 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py index 93dfe62b..1e3bdad1 100644 --- a/indoteknik_custom/models/account_move_due_extension.py +++ b/indoteknik_custom/models/account_move_due_extension.py @@ -27,6 +27,11 @@ class DueExtension(models.Model): ('7', '7 Hari'), ('14', '14 Hari'), ], string='Day Extension', help='Menambah Due Date yang sudah limit dari hari ini', tracking=True) + counter = fields.Integer(string="Counter", compute='_compute_counter') + + def _compute_counter(self): + for due in self: + due.counter = due.partner_id.counter @api.model def create(self, vals): @@ -58,32 +63,37 @@ class DueExtension(models.Model): def approve_new_due(self): if self.env.user.is_accounting: - self.is_approve = True - self.approval_status = 'approved' + if not self.approval_status == 'approved': + self.is_approve = True + self.approval_status = 'approved' + + self.partner_id.counter+=1 - if self.partner_id: - if self.day_extension: - day_extension = int(self.day_extension) - new_due = date.today() + timedelta(days=day_extension) + 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 - 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_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.state = 'sale' - sales.action_confirm() - self.order_id.due_id = self.id + 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.state = 'sale' + sales.action_confirm() + self.order_id.due_id = self.id + else: + raise UserError('Document ini sudah di approve') else: raise UserError('Hanya Finance Yang Bisa Approve') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index bdeb8a2c..5dec8da8 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -18,6 +18,7 @@ class ResPartner(models.Model): ('nonpkp', 'Non PKP') ]) sppkp = fields.Char(string="SPPKP") + counter = fields.Integer(string="Counter", default=0) def unlink(self): if self._name == 'res.partner': -- cgit v1.2.3 From 2028568c5aba7a63a3dd5e4786d2e78fa77f0906 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Fri, 7 Jul 2023 15:45:56 +0700 Subject: fix bug purchase price so --- indoteknik_custom/models/sale_order.py | 1 + 1 file changed, 1 insertion(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index ecd43960..5a3cada9 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -661,6 +661,7 @@ class SaleOrderLine(models.Model): [('product_id', '=', self.product_id.id)], limit=1, order='product_price ASC') line.vendor_id = purchase_price.vendor_id line.tax_id = line.order_id.sales_tax_id + line.purchase_price = purchase_price.product_price def compute_delivery_amt_line(self): for line in self: -- cgit v1.2.3 From f60d2e5a3011a06d5b72c4aac80e11da642368e2 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 10 Jul 2023 14:51:39 +0700 Subject: Re-Calculate SO di PO --- indoteknik_custom/models/purchase_order.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index 1eb76370..efc98e2f 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -215,6 +215,18 @@ class PurchaseOrder(models.Model): else: self.approval_status = 'pengajuan1' + def re_calculate(self): + for line in self.order_line: + sale_order_line = self.env['sale.order.line'].search( + [('product_id', '=', line.product_id.id), + ('order_id', '=', line.order_id.sale_order_id.id)], limit=1, order='price_reduce_taxexcl') + + unit_price = line.price_unit + sale_order_line.purchase_price = unit_price + + total_percent_margin = self.total_percent_margin + self.sale_order_id.total_percent_margin = total_percent_margin + def button_cancel(self): res = super(PurchaseOrder, self).button_cancel() self.approval_status = False -- cgit v1.2.3 From fca284ba540d92c8e379d7779173278408a8d31f Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 10 Jul 2023 15:20:13 +0700 Subject: refactor Re-Calculate SO di PO --- indoteknik_custom/models/purchase_order.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index efc98e2f..db76a919 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -220,12 +220,9 @@ class PurchaseOrder(models.Model): sale_order_line = self.env['sale.order.line'].search( [('product_id', '=', line.product_id.id), ('order_id', '=', line.order_id.sale_order_id.id)], limit=1, order='price_reduce_taxexcl') - - unit_price = line.price_unit - sale_order_line.purchase_price = unit_price - - total_percent_margin = self.total_percent_margin - self.sale_order_id.total_percent_margin = total_percent_margin + for so_line in sale_order_line: + unit_price = line.price_unit + so_line.purchase_price = unit_price def button_cancel(self): res = super(PurchaseOrder, self).button_cancel() -- cgit v1.2.3 From 03910d19a28cf5c7507a2763bc42875546f2b139 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Mon, 10 Jul 2023 15:55:55 +0700 Subject: refactor re calculate po --- indoteknik_custom/models/purchase_order.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index db76a919..7091bb72 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -217,9 +217,10 @@ class PurchaseOrder(models.Model): def re_calculate(self): for line in self.order_line: - sale_order_line = self.env['sale.order.line'].search( - [('product_id', '=', line.product_id.id), - ('order_id', '=', line.order_id.sale_order_id.id)], limit=1, order='price_reduce_taxexcl') + sale_order_line = self.env['sale.order.line'].search([ + ('product_id', '=', line.product_id.id), + ('order_id', '=', line.order_id.sale_order_id.id) + ], limit=1, order='price_reduce_taxexcl') for so_line in sale_order_line: unit_price = line.price_unit so_line.purchase_price = unit_price -- cgit v1.2.3 From d0751f51877b0c339943a11a5693b6ced535111e Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 11 Jul 2023 11:50:05 +0700 Subject: fix bug automatic purchase --- indoteknik_custom/models/automatic_purchase.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/automatic_purchase.py b/indoteknik_custom/models/automatic_purchase.py index 87319bf6..bc65f8e2 100644 --- a/indoteknik_custom/models/automatic_purchase.py +++ b/indoteknik_custom/models/automatic_purchase.py @@ -59,15 +59,22 @@ class AutomaticPurchase(models.Model): # new_po = self.env['purchase.order'].create([param_header]) brand_id = product.brand_id.id count += 10 + + qty_available = product.product_id.qty_onhand_bandengan + product.product_id.qty_incoming_bandengan - product.product_id.outgoing_qty + suggest = 'harus beli' param_line = { 'order_id': new_po.id, 'sequence': count, 'product_id': product.product_id.id, 'product_qty': product.qty_purchase, + 'qty_available_store': qty_available, + 'suggest': suggest, 'product_uom_qty': product.qty_purchase, 'price_unit': product.last_price, } - new_line = self.env['purchase.order.line'].create([param_line]) + new_line = self.env['purchase.order.line'].create([param_line]) + if qty_available > new_line.product_qty: + suggest = 'masih cukup' product.current_po_id = new_po.id product.current_po_line_id = new_line.id _logger.info('Automatic Create PO Line %s' % product.product_id.name) -- cgit v1.2.3 From 66e8844d3a9c327229d312aa6319a245899ad83a Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 11 Jul 2023 11:52:39 +0700 Subject: refactor code automatic purchase --- indoteknik_custom/models/automatic_purchase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/automatic_purchase.py b/indoteknik_custom/models/automatic_purchase.py index bc65f8e2..7067141e 100644 --- a/indoteknik_custom/models/automatic_purchase.py +++ b/indoteknik_custom/models/automatic_purchase.py @@ -74,7 +74,7 @@ class AutomaticPurchase(models.Model): } new_line = self.env['purchase.order.line'].create([param_line]) if qty_available > new_line.product_qty: - suggest = 'masih cukup' + new_line.suggest = 'masih cukup' product.current_po_id = new_po.id product.current_po_line_id = new_line.id _logger.info('Automatic Create PO Line %s' % product.product_id.name) -- cgit v1.2.3 From 0c60b3eb92bcae1e5170d17d4d5cc66ae14d6451 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 11 Jul 2023 11:59:44 +0700 Subject: refactor code automatic purchase --- indoteknik_custom/models/automatic_purchase.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/automatic_purchase.py b/indoteknik_custom/models/automatic_purchase.py index 7067141e..e21b411d 100644 --- a/indoteknik_custom/models/automatic_purchase.py +++ b/indoteknik_custom/models/automatic_purchase.py @@ -62,6 +62,8 @@ class AutomaticPurchase(models.Model): qty_available = product.product_id.qty_onhand_bandengan + product.product_id.qty_incoming_bandengan - product.product_id.outgoing_qty suggest = 'harus beli' + if qty_available > product.qty_purchase: + suggest = 'masih cukup' param_line = { 'order_id': new_po.id, 'sequence': count, @@ -72,9 +74,7 @@ class AutomaticPurchase(models.Model): 'product_uom_qty': product.qty_purchase, 'price_unit': product.last_price, } - new_line = self.env['purchase.order.line'].create([param_line]) - if qty_available > new_line.product_qty: - new_line.suggest = 'masih cukup' + new_line = self.env['purchase.order.line'].create([param_line]) product.current_po_id = new_po.id product.current_po_line_id = new_line.id _logger.info('Automatic Create PO Line %s' % product.product_id.name) -- cgit v1.2.3