diff options
| author | FIN-IT_AndriFP <andrifebriyadiputra@gmail.com> | 2025-12-03 09:35:16 +0700 |
|---|---|---|
| committer | FIN-IT_AndriFP <andrifebriyadiputra@gmail.com> | 2025-12-03 09:35:16 +0700 |
| commit | a6ce141542392888f8191e0e0dd4ccd6abf1b334 (patch) | |
| tree | 342e368823dcce3f83297c9cd359244ede337709 | |
| parent | 0a5376fe987ca2a6656d9b63c52b939c33150a21 (diff) | |
| parent | 015269c0268f2cd9a38ad708c8e26bf85a79fcf3 (diff) | |
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into odoo-backup
| -rw-r--r-- | indoteknik_custom/models/coretax_fatur.py | 6 | ||||
| -rw-r--r-- | indoteknik_custom/models/refund_sale_order.py | 4 | ||||
| -rw-r--r-- | indoteknik_custom/models/requisition.py | 40 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_inventory.py | 5 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 48 | ||||
| -rw-r--r-- | indoteknik_custom/views/dunning_run.xml | 6 |
6 files changed, 86 insertions, 23 deletions
diff --git a/indoteknik_custom/models/coretax_fatur.py b/indoteknik_custom/models/coretax_fatur.py index 755c5cc3..c098fd01 100644 --- a/indoteknik_custom/models/coretax_fatur.py +++ b/indoteknik_custom/models/coretax_fatur.py @@ -117,7 +117,7 @@ class CoretaxFaktur(models.Model): ) # Calculate totals - total_product_amount = sum(line.get('price_subtotal', 0) if isinstance(line, dict) + total_product_amount = sum(line.get('price_subtotal', 0) if isinstance(line, dict) else line.price_subtotal for line in product_lines) if total_product_amount == 0: total_product_amount = 1 # Avoid division by zero @@ -153,7 +153,7 @@ class CoretaxFaktur(models.Model): else: uom = line.product_uom_id - coretax_id = uom.coretax_id if uom else '' + coretax_id = uom.coretax_id if uom else 'UM.0018' # coretax_id = line.product_uom_id.coretax_id # Calculate other tax values @@ -167,7 +167,7 @@ class CoretaxFaktur(models.Model): ET.SubElement(good_service, 'Opt').text = 'A' ET.SubElement(good_service, 'Code').text = '000000' ET.SubElement(good_service, 'Name').text = line_name - ET.SubElement(good_service, 'Unit').text = coretax_id + ET.SubElement(good_service, 'Unit').text = coretax_id if invoice.partner_id.id != 80007 else 'UM.0018' # ET.SubElement(good_service, 'Price').text = str(round(line_price_unit, 2)) if line_price_unit else '0' ET.SubElement(good_service, 'Price').text = str(price_per_unit) ET.SubElement(good_service, 'Qty').text = str(quantity) diff --git a/indoteknik_custom/models/refund_sale_order.py b/indoteknik_custom/models/refund_sale_order.py index 38ab69fa..fe0002bd 100644 --- a/indoteknik_custom/models/refund_sale_order.py +++ b/indoteknik_custom/models/refund_sale_order.py @@ -292,6 +292,7 @@ class RefundSaleOrder(models.Model): ('sale_id', 'in', so_ids), ('journal_id', '=', 11), ('state', '=', 'posted'), + ('ref', 'not ilike', 'dp'), ]) piutangbca = self.env['account.move'].search([ ('ref', 'in', invoices.mapped('name')), @@ -335,6 +336,7 @@ class RefundSaleOrder(models.Model): ('state', '=', 'posted'), ('ref', 'ilike', 'uang muka penjualan'), ('ref', 'not ilike', 'reklas'), + ('ref', 'not ilike', 'dp'), ] if so_names: domain += ['|'] * (len(so_names) - 1) @@ -647,6 +649,7 @@ class RefundSaleOrder(models.Model): ('sale_id', 'in', so_ids), ('journal_id', '=', 11), ('state', '=', 'posted'), + ('ref', 'not ilike', 'dp'), ]) piutangbca = self.env['account.move'].search([ ('ref', 'in', all_invoices.mapped('name')), @@ -694,6 +697,7 @@ class RefundSaleOrder(models.Model): ('state', '=', 'posted'), ('ref', 'ilike', 'uang muka penjualan'), ('ref', 'not ilike', 'reklas'), + ('ref', 'not ilike', 'dp'), ] domain += ['|'] * (len(so_names) - 1) for n in so_names: diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py index bcdafb12..64ef4fc8 100644 --- a/indoteknik_custom/models/requisition.py +++ b/indoteknik_custom/models/requisition.py @@ -77,9 +77,20 @@ class Requisition(models.Model): vals['number'] = self.env['ir.sequence'].next_by_code('requisition') or '0' result = super(Requisition, self).create(vals) return result - + + def check_product_line_to_so(self): + for req in self: + for prod_line in req.requisition_lines: + match = self.env['sale.order.line'].search([ + ('product_id', '=', prod_line.product_id.id), ('order_id', '=', req.sale_order_id.id) + ]) + if match: + raise UserError ('Product sudah di SO tidak approve/create PO') + + def button_approve(self): state = ['done', 'sale'] + self.check_product_line_to_so() if self.sale_order_id.state in state: raise UserError('SO sudah Confirm, akan berakibat double Purchase melalui PJ') if self.env.user.id not in [21, 19, 28]: @@ -90,6 +101,7 @@ class Requisition(models.Model): self.merchandise_approve = True def create_po_from_requisition(self): + self.check_product_line_to_so() if not self.sales_approve and not self.merchandise_approve: raise UserError('Harus Di Approve oleh Darren atau Rafly') if not self.requisition_lines: @@ -98,9 +110,9 @@ class Requisition(models.Model): raise UserError('Sudah pernah di create PO') if not self.sale_order_id: raise UserError('Tidak ada link dengan Sales Order, tidak bisa dihitung sebagai Plafon Qty di PO') - + vendor_ids = self.env['requisition.line'].read_group([ - ('requisition_id', '=', self.id), + ('requisition_id', '=', self.id), ('partner_id', '!=', False) ], fields=['partner_id'], groupby=['partner_id']) @@ -116,7 +128,7 @@ class Requisition(models.Model): 'type': 'ir.actions.act_window', 'domain': [('id', 'in', po_ids)], } - + def create_po_by_vendor(self, vendor_id): current_time = datetime.now() @@ -137,7 +149,7 @@ class Requisition(models.Model): } domain = [ - ('requisition_id', '=', self.id), + ('requisition_id', '=', self.id), ('partner_id', '=', vendor_id), ('qty_purchase', '>', 0) ] @@ -151,8 +163,8 @@ class Requisition(models.Model): new_po.name = new_po.name + "/R/" + str(i + 1) po_ids.append(new_po.id) lines = requisition_line.search( - domain, - offset=i * PRODUCT_PER_PO, + domain, + offset=i * PRODUCT_PER_PO, limit=PRODUCT_PER_PO ) tax = [22] @@ -179,7 +191,7 @@ class Requisition(models.Model): self.is_po = True return po_ids - + # def create_po_from_requisition(self): # if not self.requisition_lines: # raise UserError('Tidak ada Lines, belum bisa create PO') @@ -187,7 +199,7 @@ class Requisition(models.Model): # raise UserError('Sudah pernah di create PO') # current_time = datetime.now() # vendor_ids = self.env['requisition.line'].read_group([('requisition_id', '=', self.id), ('partner_id', '!=', False)], fields=['partner_id'], groupby=['partner_id']) - + # counter_po_number = 0 # po_ids = [] # for vendor in vendor_ids: @@ -203,7 +215,7 @@ class Requisition(models.Model): # 'note_description': 'from Purchase Requisition' # } # param_requisition_line = [ - # ('requisition_id', '=', self.id), + # ('requisition_id', '=', self.id), # ('partner_id', '=', vendor['partner_id'][0]), # ('qty_purchase', '>', 0) # ] @@ -238,7 +250,7 @@ class Requisition(models.Model): # tax = [22] # param_line = { - + # 'sequence': count, # 'product_id': product.product_id.id, # 'product_qty': product.qty_purchase, @@ -251,7 +263,7 @@ class Requisition(models.Model): # new_line = self.env['purchase.order.line'].create([param_line]) # if new_po: # new_line.write({ - # 'order_id': new_po.id, + # 'order_id': new_po.id, # }) # product.current_po_id = new_po.id # product.current_po_line_id = new_line.id @@ -298,7 +310,7 @@ class RequisitionLine(models.Model): taxes = 24 human_last_update = purchase_price.human_last_update or datetime.min system_last_update = purchase_price.system_last_update or datetime.min - + #if purchase_price.taxes_product_id.type_tax_use == 'purchase': price = purchase_price.product_price taxes = purchase_price.taxes_product_id.id or 24 @@ -307,7 +319,7 @@ class RequisitionLine(models.Model): #if purchase_price.taxes_system_id.type_tax_use == 'purchase': price = purchase_price.system_price taxes = purchase_price.taxes_system_id.id or 24 - + return price, taxes @api.onchange('price_unit') diff --git a/indoteknik_custom/models/stock_inventory.py b/indoteknik_custom/models/stock_inventory.py index 69cca5bc..432d9225 100644 --- a/indoteknik_custom/models/stock_inventory.py +++ b/indoteknik_custom/models/stock_inventory.py @@ -52,6 +52,11 @@ class StockInventory(models.Model): return "00001" # Jika format tidak valid, mulai dari 00001 return "00001" # Jika belum ada data, mulai dari 00001 + def action_start(self): + if self.env.user.id not in [21, 17, 6277]: + raise UserError("Hanya Rafly, denise, dan faisal yang bisa start inventory") + return super(StockInventory, self).action_start() + @api.model def create(self, vals): """Pastikan nomor hanya dibuat saat penyimpanan.""" diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index e7686b75..900529b9 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -1406,6 +1406,47 @@ class StockPicking(models.Model): else: raise UserError('Hanya MD yang bisa Approve') + def validate_seq_vcm(self): + for picking in self: + tg_po = picking.tukar_guling_po_id + if not tg_po: + continue + + return_type = tg_po.return_type + if return_type not in ['retur_po', 'tukar_guling']: + continue + + picking_order = [] + if return_type == 'retur_po': + picking_order = ['BU/INPUT', 'BU/PUT'] + elif return_type == 'tukar_guling': + picking_order = ['BU/VRT', 'BU/PRT', 'BU/INPUT', 'BU/PUT'] + + related_pickings = self.env['stock.picking'].search([ + ('tukar_guling_po_id', '=', tg_po.id) + ]) + + ordered_pickings = [] + for prefix in picking_order: + match = next((p for p in related_pickings if p.name.startswith(prefix)), None) + if not match: + raise UserError(f"Picking dengan prefix {prefix} belum ada.") + ordered_pickings.append(match) + + current_index = -1 + for idx, p in enumerate(ordered_pickings): + if p.id == picking.id: + current_index = idx + break + + if current_index == -1: + raise UserError("Picking ini tidak ditemukan dalam urutan picking yang sesuai.") + + for prev_picking in ordered_pickings[:current_index]: + if prev_picking.state != 'done': + raise UserError( + f"Tidak bisa validasi {picking.name} sebelum {prev_picking.name} divalidasi." + ) def button_validate(self): self.check_invoice_date() _logger.info("Kode Picking: %s", self.picking_type_id.code) @@ -1416,6 +1457,7 @@ class StockPicking(models.Model): group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])]) active_model = self.env.context.get('active_model') + self.validate_seq_vcm() if self.is_so_fiktif == True: raise UserError("SO Fiktif tidak bisa di validate") if self.location_id.id == 47 and self.env.user.id not in users_in_group.mapped( @@ -1453,10 +1495,10 @@ class StockPicking(models.Model): if not self.linked_manual_bu_out and 'BU/PICK/' in self.name: raise UserError(_("Isi BU Out terlebih dahulu!")) - if len(self.check_product_lines) == 0 and 'BU/PICK/' in self.name: + if len(self.check_product_lines) == 0 and 'BU/PICK/' in self.name and not self.env.user.has_group('indoteknik_custom.group_role_it'): raise UserError(_("Tidak ada Check Product! Harap periksa kembali.")) - if len(self.check_product_lines) == 0 and 'BU/INPUT/' in self.name: + if len(self.check_product_lines) == 0 and 'BU/INPUT/' in self.name and not self.env.user.has_group('indoteknik_custom.group_role_it'): raise UserError(_("Tidak ada Check Product! Harap periksa kembali.")) if self.total_koli > self.total_so_koli: @@ -2821,4 +2863,4 @@ class StockPickingSjDocument(models.Model): picking_id = fields.Many2one('stock.picking', required=True, ondelete='cascade') image = fields.Binary('Gambar', required=True, attachment=True) - sequence = fields.Integer('Urutan', default=10)
\ No newline at end of file + sequence = fields.Integer('Urutan', default=10) diff --git a/indoteknik_custom/views/dunning_run.xml b/indoteknik_custom/views/dunning_run.xml index 911a372d..52a0c6ae 100644 --- a/indoteknik_custom/views/dunning_run.xml +++ b/indoteknik_custom/views/dunning_run.xml @@ -25,8 +25,8 @@ <field name="arch" type="xml"> <tree> <field name="partner_id"/> - <field name="information_line"/> - <field name="reference"/> + <field name="information_line" optional="hide"/> + <field name="reference" optional="hide"/> <field name="invoice_id"/> <field name="date_invoice"/> <field name="efaktur_id" optional="hide"/> @@ -125,4 +125,4 @@ action="dunning_run_action" parent="account.menu_finance_reports" sequence="200"/> -</odoo>
\ No newline at end of file +</odoo> |
