from odoo import api, fields, models, _ from odoo.exceptions import UserError from datetime import datetime from odoo.http import request import logging _logger = logging.getLogger(__name__) class InvoiceReklas(models.TransientModel): _name = 'invoice.reklas' _description = "digunakan untuk reklas Uang Muka Penjualan" reklas_id = fields.Many2one('account.move', string='Nomor CAB', domain="[('move_type','=','entry')]") pay_amt = fields.Float(string='Yang dibayarkan') reklas_type = fields.Selection([ ('penjualan', 'Penjualan'), ('pembelian', 'Pembelian'), ], string='Reklas Tipe') @api.onchange('reklas_type') def _onchange_reklas_type(self): active_ids = self._context.get('active_ids', []) if not active_ids: return move = self.env['account.move'].browse(active_ids[0]) cab = False # Deteksi dari mana asal CAB if move.move_type == 'entry': cab = move elif move.move_type == 'in_invoice': if move.reklas_misc_id: cab = move.reklas_misc_id elif move.purchase_id and move.purchase_id.move_id: cab = move.purchase_id.move_id # Isi field Nomor CAB jika ditemukan if cab: self.reklas_id = cab.id # Nilai yang dibayarkan harus tetap ambil dari invoice/bill self.pay_amt = move.amount_total @api.model def default_get(self, fields): res = super().default_get(fields) active_ids = self._context.get('active_ids', []) if active_ids: move = self.env['account.move'].browse(active_ids[0]) cab = False if move.move_type == 'entry': cab = move elif move.move_type == 'in_invoice': if move.reklas_misc_id: cab = move.reklas_misc_id elif move.purchase_id and move.purchase_id.move_id: cab = move.purchase_id.move_id if cab: res['reklas_id'] = cab.id res['pay_amt'] = move.amount_total return res # @api.onchange('reklas_type') # def _onchange_reklas_type(self): # if self.reklas_type == 'penjualan': # invoices = self.env['account.move'].browse(self._context.get('active_ids', [])) # self.pay_amt = invoices.amount_total def compare_amount_uangmuka_reklas(self): if self.reklas_type == 'penjualan': invoices = self.env['account.move'].browse(self._context.get('active_ids', [])) if invoices.uangmuka == True: uangmuka = invoices.amount_total reklas = self.env['account.move'].search([ ('sale_id', '=', invoices.sale_id.id), ('move_type', '=', 'entry'), ('reklas', '=', True), ('state', '=', 'posted') ]) reklas_uangmuka = sum(reklas.mapped('amount_total_signed')) or 0 total_reklas = reklas_uangmuka + self.pay_amt if total_reklas > uangmuka: raise UserError('Total reklas tidak boleh melebihi total uang muka') def create_reklas(self): if not self.reklas_type: raise UserError('Reklas Tipe harus diisi') if not self.reklas_id: raise UserError('Nomor CAB harus diisi') self.compare_amount_uangmuka_reklas() invoices = self.env['account.move'].browse(self._context.get('active_ids', [])) current_time = datetime.now() for invoice in invoices: # Ambil nama PO jika ada po_name = invoice.purchase_id.name if invoice.purchase_id else '' # Susun nama referensi dengan aman ref_name = 'REKLAS {} UANG MUKA {}{}{} {}'.format( self.reklas_id.name or '', 'PENJUALAN' if self.reklas_type == 'penjualan' else 'PEMBELIAN', f" {invoice.name}" if invoice.name != self.reklas_id.name else '', f" - {po_name}" if po_name else '', invoice.partner_id.name or '' ) # Header jurnal reklas parameters_header = { 'ref': ref_name, 'date': current_time, 'journal_id': 19, 'sale_id': invoice.sale_id.id, 'reklas': True, } if invoice.purchase_id: parameters_header['purchase_id'] = invoice.purchase_id.id account_move = request.env['account.move'].create([parameters_header]) _logger.info('Success Reklas with %s' % account_move.name) # ✅ Set Bill asal sebagai source document if invoice.move_type == 'in_invoice': account_move.bill_id = invoice.id # Tambahkan info asal invoice ke jurnal (opsional) account_move.invoice_origin = invoice.name # Simpan hubungan balik ke invoice invoice.reklas_misc_id = account_move.id # Buat line debit dan kredit if self.reklas_type == 'penjualan': parameter_debit = { 'move_id': account_move.id, 'account_id': 578, # penerimaan belum alokasi 'partner_id': invoice.line_ids[0].partner_id.id, 'currency_id': 12, 'debit': self.pay_amt, 'credit': 0, 'name': ref_name } parameter_credit = { 'move_id': account_move.id, 'account_id': 347, 'partner_id': invoice.line_ids[0].partner_id.id, 'currency_id': 12, 'debit': 0, 'credit': self.pay_amt, 'name': ref_name } else: # pembelian parameter_debit = { 'move_id': account_move.id, 'account_id': 388, 'partner_id': invoice.line_ids[0].partner_id.id, 'currency_id': 12, 'debit': self.pay_amt, 'credit': 0, 'name': ref_name } parameter_credit = { 'move_id': account_move.id, 'account_id': 579, 'partner_id': invoice.line_ids[0].partner_id.id, 'currency_id': 12, 'debit': 0, 'credit': self.pay_amt, 'name': ref_name } # Simpan journal lines request.env['account.move.line'].create([parameter_debit, parameter_credit]) # Tampilkan hasil jurnal reklas return { 'name': _('Journal Entries'), 'view_mode': 'form', 'res_model': 'account.move', 'target': 'current', 'view_id': False, 'type': 'ir.actions.act_window', 'res_id': account_move.id }