From 6ff3a1abae7c0d9db659991811b69d4ad66effb8 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Tue, 3 Mar 2026 13:37:56 +0700 Subject: (andri) edit date accounting pada journal entries sekaligus via tree --- indoteknik_custom/models/account_move.py | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py index a317dccc..914a5329 100644 --- a/indoteknik_custom/models/account_move.py +++ b/indoteknik_custom/models/account_move.py @@ -786,6 +786,24 @@ class AccountMove(models.Model): if rec.statement_line_id and not rec.statement_line_id.statement_id.is_edit and rec.statement_line_id.statement_id.state == 'confirm': raise UserError('Bank Statement di Lock, Minta admin reconcile untuk unlock') return res + + def action_open_change_date_wizard(self): + if not self.env.user.is_accounting: + raise UserError('Hanya Accounting yang bisa Reset to Draft') + non_draft = self.filtered(lambda m: m.state != 'draft') + if non_draft: + raise UserError('Hanya invoice dengan status draft yang bisa diubah tanggalnya. Mohon reset ke draft terlebih dahulu.') + return{ + 'name': 'Change Date Journal Entry', + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'account.move.change.date.wizard', + 'target': 'new', + 'context':{ + 'active_ids': self.ids, + 'active_model': self._name, + } + } def action_post(self): if self._name != 'account.move': @@ -997,3 +1015,31 @@ class SyncPromiseDateWizardLine(models.TransientModel): date_terima_tukar_faktur = fields.Date(related="invoice_id.date_terima_tukar_faktur", string="Tanggal Terima Tukar Faktur", readonly=True) amount_total = fields.Monetary(related="invoice_id.amount_total", string="Total", readonly=True) currency_id = fields.Many2one(related="invoice_id.currency_id", readonly=True) + +class AccountMoveChangeDateWizard(models.TransientModel): + _name = "account.move.change.date.wizard" + _description = "Account Move Change Date Wizard" + + # move_id = fields.Many2one('account.move', string="Journal Entry", required=True) + new_date = fields.Date(string="New Date", required=True) + + def action_change_date(self): + if not self.env.user.is_accounting: + raise UserError('Hanya Accounting yang bisa ubah tanggal') + + active_ids = self.env.context.get('active_ids', []) + moves = self.env['account.move'].browse(active_ids) + + if not moves: + raise UserError("Tidak ada journal entry yang dipilih.") + + non_draft_moves = moves.filtered(lambda m: m.state != 'draft') + if non_draft_moves: + raise UserError("Hanya journal entry dengan status 'Draft' yang dapat diubah tanggalnya.") + + for move in moves: + move.write({'date': self.new_date}) + move.message_post(body="Tanggal berhasil diubah") + + return {'type': 'ir.actions.act_window_close'} + \ No newline at end of file -- cgit v1.2.3 From d2d5a3b514d2974c97fac6eb922f7cd1f7b99096 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Tue, 3 Mar 2026 15:51:31 +0700 Subject: fix message --- indoteknik_custom/models/account_move.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py index 914a5329..723f225c 100644 --- a/indoteknik_custom/models/account_move.py +++ b/indoteknik_custom/models/account_move.py @@ -789,7 +789,7 @@ class AccountMove(models.Model): def action_open_change_date_wizard(self): if not self.env.user.is_accounting: - raise UserError('Hanya Accounting yang bisa Reset to Draft') + raise UserError('Hanya Accounting yang bisa edit tanggal journal entry') non_draft = self.filtered(lambda m: m.state != 'draft') if non_draft: raise UserError('Hanya invoice dengan status draft yang bisa diubah tanggalnya. Mohon reset ke draft terlebih dahulu.') -- cgit v1.2.3 From 2536527e464ca3b3bfe3f690e864e75593989e5a Mon Sep 17 00:00:00 2001 From: Mqdd Date: Thu, 5 Mar 2026 13:22:32 +0700 Subject: fix error --- indoteknik_custom/models/__init__.py | 1 + indoteknik_custom/models/upah_harian_office.py | 36 +++++++++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 31ee5108..b11b961f 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -170,3 +170,4 @@ from . import update_depreciation_move_wizard from . import keywords from . import token_log from . import kartu_stock +from . import upah_harian_office diff --git a/indoteknik_custom/models/upah_harian_office.py b/indoteknik_custom/models/upah_harian_office.py index b2c12bd5..7db56cdd 100644 --- a/indoteknik_custom/models/upah_harian_office.py +++ b/indoteknik_custom/models/upah_harian_office.py @@ -2,13 +2,17 @@ from odoo import models, fields, api from odoo.exceptions import UserError, ValidationError class UpahHarianOffice(models.Model): - _name = 'upah.harian.office' - _description = 'Upah Harian Office' + _name = 'upah.harian' + _description = 'Upah Harian' + _inherit = ['mail.thread', 'mail.activity.mixin'] name = fields.Char() pemohon = fields.Many2one('res.users', String='Pemohon', required=True) tanggal = fields.Date('Tanggal Pengajuan', required=True) - state = fields.Selection([('draft', 'Draft'), ('done', 'Done')], default='draft') + upah_harian = fields.Float('Upah Harian') + notes = fields.Text('Notes') + state = fields.Selection([('draft', 'Draft'), ('approved', 'Approved'), ('paid', 'Paid'), ('cancel', 'Canceled')], default='draft') + cancel_reason = fields.Text('Alasan Cancel') attachment = fields.Binary('Attachment') approved_by = fields.Char('Approved By') attachment_type = fields.Selection([('pdf', 'PDF'), ('image', 'Image')]) @@ -22,11 +26,11 @@ class UpahHarianOffice(models.Model): ('fat', 'FAT'), ('it', 'IT'), ('hr_ga', 'HR & GA'), - ('pimpinan', 'Pimpinan') ], string='Departement Type', tracking=3, required=True) + is_ganti_jam = fields.Boolean('Ganti Jam?', default="False") total_upah = fields.Float('Total Upah Harian', compute='_compute_total_upah') - @api.models + @api.model def create(self, vals): vals['name'] = self.env['ir.sequence'].next_by_code('upah.harian.office') return super(UpahHarianOffice, self).create(vals) @@ -40,18 +44,32 @@ class UpahHarianOffice(models.Model): raise UserError("Only PIC user can approve this document.") self.state = 'done' + def action_reset_to_draft(self): + if self.state == 'cancel': + self.state = 'draft' + + def action_cancel(self): + if self.state == 'draft': + if self.cancel_reason == '' or self.cancel_reason == False: + raise UserError ('Harus Isi Alasan Cancel') + else: + self.state = 'cancel' def _compute_total_upah(self): - for line in self: - line.total_upah = sum(line.mapped('upah_harian_line').mapped('upah_harian')) + if self.departement_type != 'logistic': + for line in self: + line.total_upah = sum(line.mapped('upah_harian_line').mapped('upah_harian')) + + def action_create_journal_entries(self): + return class UpahHarianOfficeLine(models.Model): _name = 'upah.harian.line' _description = 'Upah Harian Line' - upah_harian_id = fields.Many2one('upah.harian.office') - upah_harian= fields.Float('Upah Harian', required=True, compute='_compute_upah_harian') + upah_harian_id = fields.Many2one('upah.harian') + upah_harian_compute = fields.Float('Upah Harian Computed', required=True, compute='_compute_upah_harian') hari = fields.Char('Hari') jam_masuk = fields.Float('Jam Masuk', required=True) jam_keluar = fields.Float('Jam Keluar', required=True) -- cgit v1.2.3 From e3385d7f17ec3817b562cc1d9045b633ead00487 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Thu, 5 Mar 2026 15:18:50 +0700 Subject: done. TODO line --- indoteknik_custom/models/upah_harian_office.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/upah_harian_office.py b/indoteknik_custom/models/upah_harian_office.py index 7db56cdd..9666a304 100644 --- a/indoteknik_custom/models/upah_harian_office.py +++ b/indoteknik_custom/models/upah_harian_office.py @@ -6,8 +6,8 @@ class UpahHarianOffice(models.Model): _description = 'Upah Harian' _inherit = ['mail.thread', 'mail.activity.mixin'] - name = fields.Char() - pemohon = fields.Many2one('res.users', String='Pemohon', required=True) + name = fields.Char(readonly=True) + pemohon = fields.Many2one('res.users', String='Pemohon', required=True, domain = ([('active', '=', True), ('share', '=', False)])) tanggal = fields.Date('Tanggal Pengajuan', required=True) upah_harian = fields.Float('Upah Harian') notes = fields.Text('Notes') @@ -29,6 +29,18 @@ class UpahHarianOffice(models.Model): ], string='Departement Type', tracking=3, required=True) is_ganti_jam = fields.Boolean('Ganti Jam?', default="False") total_upah = fields.Float('Total Upah Harian', compute='_compute_total_upah') + attachment_file_image = fields.Binary(string='Attachment Image', attachment_filename='attachment_filename_image') + attachment_file_pdf = fields.Binary(string='Attachment PDF', attachment_filename='attachment_filename_pdf') + attachment_filename_image = fields.Char(string='Filename Image') + attachment_filename_pdf = fields.Char(string='Filename PDF') + + + @api.onchange('attachment_type') + def _onchange_attachment_type(self): + self.attachment_file_image = False + self.attachment_filename_image = False + self.attachment_file_pdf = False + self.attachment_filename_pdf = False @api.model def create(self, vals): @@ -73,10 +85,10 @@ class UpahHarianOfficeLine(models.Model): hari = fields.Char('Hari') jam_masuk = fields.Float('Jam Masuk', required=True) jam_keluar = fields.Float('Jam Keluar', required=True) - tanggal_line = fields.Datetime('Tanggal', required=True) + tanggal_line = fields.Date('Tanggal', required=True) kegiatan = fields.Char('Kegiatan', required=True) - jam = fields.Float('Jam', required=True) total_jam_kerja = fields.Float('Total Jam Kerja', compute='_compute_total_jam_kerja') + is_ganti_jam = fields.Boolean('Ganti Jam Kerja', default = False) def _compute_total_jam_kerja(self): for line in self: -- cgit v1.2.3 From 1d61c5c2f29270d2d1e9c84e887e9c94416d9027 Mon Sep 17 00:00:00 2001 From: FIN-IT_AndriFP Date: Fri, 6 Mar 2026 11:03:10 +0700 Subject: fix --- indoteknik_custom/models/purchase_order.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index a345b96b..244575ae 100755 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -1446,8 +1446,8 @@ class PurchaseOrder(models.Model): send_email = True break - if self.partner_id.id == 5571 and not self.revisi_po: - self.action_create_order_altama() + # if self.partner_id.id == 5571 and not self.revisi_po: + # self.action_create_order_altama() if send_email: if self.is_local_env(): @@ -1484,6 +1484,8 @@ class PurchaseOrder(models.Model): # if len(self) == 1: # _logger.info("Redirecting ke BU") # return self.action_view_related_bu() + if self.partner_id.id == 5571 and not self.revisi_po: + self.action_create_order_altama() return res -- cgit v1.2.3 From fdfe8fbfc45c1d5eb5cfef696bfb21024de19ab5 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Fri, 6 Mar 2026 14:11:05 +0700 Subject: start logic --- indoteknik_custom/models/upah_harian_office.py | 43 ++++++++++++++++++++------ 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/upah_harian_office.py b/indoteknik_custom/models/upah_harian_office.py index 9666a304..d18ce64d 100644 --- a/indoteknik_custom/models/upah_harian_office.py +++ b/indoteknik_custom/models/upah_harian_office.py @@ -28,7 +28,7 @@ class UpahHarianOffice(models.Model): ('hr_ga', 'HR & GA'), ], string='Departement Type', tracking=3, required=True) is_ganti_jam = fields.Boolean('Ganti Jam?', default="False") - total_upah = fields.Float('Total Upah Harian', compute='_compute_total_upah') + total_upah = fields.Float('Total Upah Harian', compute='_compute_total_upah', readonly=True) attachment_file_image = fields.Binary(string='Attachment Image', attachment_filename='attachment_filename_image') attachment_file_pdf = fields.Binary(string='Attachment PDF', attachment_filename='attachment_filename_pdf') attachment_filename_image = fields.Char(string='Filename Image') @@ -49,7 +49,7 @@ class UpahHarianOffice(models.Model): def action_approve(self): if self.state == 'draft' and self.env.user.pic: - self.state = 'done' + self.state = 'approved' self.approved_by = self.env.user.name if not self.env.user.pic: @@ -67,10 +67,10 @@ class UpahHarianOffice(models.Model): else: self.state = 'cancel' + @api.depends('upah_harian_line.upah_harian_compute') def _compute_total_upah(self): - if self.departement_type != 'logistic': - for line in self: - line.total_upah = sum(line.mapped('upah_harian_line').mapped('upah_harian')) + for rec in self: + rec.total_upah = sum(rec.upah_harian_line.mapped('upah_harian_compute')) def action_create_journal_entries(self): return @@ -79,6 +79,9 @@ class UpahHarianOffice(models.Model): class UpahHarianOfficeLine(models.Model): _name = 'upah.harian.line' _description = 'Upah Harian Line' + _order = 'id asc' + + MAX_WORKING_HOUR = 7.5 upah_harian_id = fields.Many2one('upah.harian') upah_harian_compute = fields.Float('Upah Harian Computed', required=True, compute='_compute_upah_harian') @@ -90,10 +93,32 @@ class UpahHarianOfficeLine(models.Model): total_jam_kerja = fields.Float('Total Jam Kerja', compute='_compute_total_jam_kerja') is_ganti_jam = fields.Boolean('Ganti Jam Kerja', default = False) - def _compute_total_jam_kerja(self): + @api.depends('total_jam_kerja', 'upah_harian_id.upah_harian') + def _compute_upah_harian(self): for line in self: - line.total_jam_kerja = line.jam + if line.upah_harian_id.upah_harian: + upah_full = line.upah_harian_id.upah_harian + rate_per_hour = upah_full / self.MAX_WORKING_HOUR + line.upah_harian_compute = rate_per_hour * line.total_jam_kerja + else: + line.upah_harian_compute = 0 - def _compute_upah_harian(self): + @api.depends('jam_masuk', 'jam_keluar') + def _compute_total_jam_kerja(self): + for line in self: + if line.jam_keluar and line.jam_masuk: + total = line.jam_keluar - line.jam_masuk + # Maksimal 7.5 jam + if total > self.MAX_WORKING_HOUR: + total = self.MAX_WORKING_HOUR + if total < 0: + total = 0 + line.total_jam_kerja = total + else: + line.total_jam_kerja = 0 + + @api.constrains('jam_masuk', 'jam_keluar') + def _check_jam_valid(self): for line in self: - line.upah_harian = line.jam + if line.jam_keluar <= line.jam_masuk: + raise ValidationError("Jam keluar harus lebih besar dari jam masuk.") \ No newline at end of file -- cgit v1.2.3 From 5c20bda1e65d72088af744481abf0784d30b710e Mon Sep 17 00:00:00 2001 From: HafidBuroiroh Date: Fri, 6 Mar 2026 14:50:43 +0700 Subject: push --- indoteknik_custom/models/refund_sale_order.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/refund_sale_order.py b/indoteknik_custom/models/refund_sale_order.py index 646376ab..28f88d0e 100644 --- a/indoteknik_custom/models/refund_sale_order.py +++ b/indoteknik_custom/models/refund_sale_order.py @@ -657,6 +657,20 @@ class RefundSaleOrder(models.Model): ('journal_id', '=', 13), ('state', '=', 'posted'), ]) + if rec.sale_order_ids: + so_records = rec.sale_order_ids + so_names = so_records.mapped('name') + domain = [ + ('journal_id', '=', 13), + ('state', '=', 'posted'), + ('sale_id', '=', False), + ('ref', 'ilike', 'selisih'), + ] + domain += ['|'] * (len(so_names) - 1) + for name in so_names: + domain.append(('ref', 'ilike', name)) + + misc = self.env['account.move'].search(domain) moves_ongkir = self.env['account.move'] if rec.sale_order_ids: -- cgit v1.2.3 From a58a4598cce99d33df5ff3f3d0d39c45c6d27362 Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 7 Mar 2026 10:12:42 +0700 Subject: add iqmal sulis --- indoteknik_custom/models/commision.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/commision.py b/indoteknik_custom/models/commision.py index 983c07fe..9226f5a7 100644 --- a/indoteknik_custom/models/commision.py +++ b/indoteknik_custom/models/commision.py @@ -443,7 +443,7 @@ class CustomerCommision(models.Model): self.approved_by = (self.approved_by + ', ' if self.approved_by else '') + self.env.user.name self.date_approved_pimpinan = now_naive self.position_pimpinan = 'Pimpinan' - elif self.status == 'pengajuan4' and (self.env.user.id == 1272 or self.env.user.has_group('indoteknik_custom.group_role_it')): + elif self.status == 'pengajuan4' and (self.env.user.id in [1272,571,14075] or self.env.user.has_group('indoteknik_custom.group_role_it')): for line in self.commision_lines: line.invoice_id.is_customer_commision = True if self.commision_type == 'fee': -- cgit v1.2.3 From ff474f82cd53d2fd6443fb38018e698186c1123e Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 7 Mar 2026 10:13:42 +0700 Subject: add iqmal sulis in CB --- indoteknik_custom/models/commision.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/commision.py b/indoteknik_custom/models/commision.py index 983c07fe..afd36bc7 100644 --- a/indoteknik_custom/models/commision.py +++ b/indoteknik_custom/models/commision.py @@ -443,7 +443,7 @@ class CustomerCommision(models.Model): self.approved_by = (self.approved_by + ', ' if self.approved_by else '') + self.env.user.name self.date_approved_pimpinan = now_naive self.position_pimpinan = 'Pimpinan' - elif self.status == 'pengajuan4' and (self.env.user.id == 1272 or self.env.user.has_group('indoteknik_custom.group_role_it')): + elif self.status == 'pengajuan4' and (self.env.user.id in [1272,14075,571] or self.env.user.has_group('indoteknik_custom.group_role_it')): for line in self.commision_lines: line.invoice_id.is_customer_commision = True if self.commision_type == 'fee': -- cgit v1.2.3 From 492eee56298aeb634f832a723aa0a3918a13c0de Mon Sep 17 00:00:00 2001 From: Mqdd Date: Sat, 7 Mar 2026 10:53:51 +0700 Subject: fix SO approval --- indoteknik_custom/models/sale_order.py | 44 ++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 21 deletions(-) (limited to 'indoteknik_custom/models') diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 0cb6670e..e42f0ce3 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -156,7 +156,7 @@ class SaleOrder(models.Model): total_margin_excl_third_party = fields.Float('Before Margin', help="Before Margin in Sales Order Header") approval_status = fields.Selection([ - ('pengajuan0', 'Approval Team Sales'), + ('pengajuan0', 'Approval Leader Team Sales'), ('pengajuan1', 'Approval Manager'), ('pengajuan2', 'Approval Pimpinan'), ('approved', 'Approved'), @@ -2391,12 +2391,15 @@ class SaleOrder(models.Model): self.check_credit_limit() self.check_limit_so_to_invoice() order.approval_status = 'pengajuan0' - order.message_post(body="Mengajukan approval ke Team Sales_") + order.message_post(body="Mengajukan approval ke Leader Team Sales_") + return self._create_approval_notification('Team Sales') + elif order._requires_approval_team_sales(): + self.check_product_bom() + self.check_credit_limit() + self.check_limit_so_to_invoice() + order.approval_status = 'pengajuan0' + order.message_post(body="Mengajukan approval ke Leader Team Sales") return self._create_approval_notification('Team Sales') - elif order._requires_approval_margin_leader(): - order.approval_status = 'pengajuan2' - order.message_post(body="Mengajukan approval ke Pimpinan") - return self._create_approval_notification('Pimpinan') elif order._requires_approval_margin_manager(): self.check_product_bom() self.check_credit_limit() @@ -2404,13 +2407,11 @@ class SaleOrder(models.Model): order.approval_status = 'pengajuan1' order.message_post(body="Mengajukan approval ke Sales Manager") return self._create_approval_notification('Sales Manager') - elif order._requires_approval_team_sales(): - self.check_product_bom() - self.check_credit_limit() - self.check_limit_so_to_invoice() - order.approval_status = 'pengajuan0' - order.message_post(body="Mengajukan approval ke Team Sales") - return self._create_approval_notification('Team Sales') + elif order._requires_approval_margin_leader(): + order.approval_status = 'pengajuan2' + order.message_post(body="Mengajukan approval ke Pimpinan") + return self._create_approval_notification('Pimpinan') + # elif value_trigger: # self.check_product_bom() # self.check_credit_limit() @@ -2685,18 +2686,19 @@ class SaleOrder(models.Model): value_trigger = order._requires_approval_by_value() if value_trigger: order.approval_status = 'pengajuan0' - order.message_post(body="Mengajukan approval ke Team Sales") + order.message_post(body="Mengajukan approval ke Leader Team Sales") return self._create_approval_notification('Team Sales') - elif order._requires_approval_margin_leader(): - order.approval_status = 'pengajuan2' - return self._create_approval_notification('Pimpinan') - elif order._requires_approval_margin_manager(): - order.approval_status = 'pengajuan1' - return self._create_approval_notification('Sales Manager') elif value_trigger or order._requires_approval_team_sales(): order.approval_status = 'pengajuan0' - order.message_post(body="Mengajukan approval ke Team Sales") + order.message_post(body="Mengajukan approval ke Leader Team Sales") return self._create_approval_notification('Team Sales') + elif order._requires_approval_margin_manager(): + order.approval_status = 'pengajuan1' + return self._create_approval_notification('Sales Manager') + elif order._requires_approval_margin_leader(): + order.approval_status = 'pengajuan2' + return self._create_approval_notification('Pimpinan') + # elif value_trigger: # order.approval_status = 'pengajuan0' # order.message_post(body="Mengajukan approval ke Team Sales (Total SO > 50jt)") -- cgit v1.2.3