from odoo import fields, models, _, api from odoo.exceptions import UserError from datetime import datetime from odoo.http import request import logging, math _logger = logging.getLogger(__name__) class PurchaseOrderMultiUangmuka(models.TransientModel): _name = 'purchase.order.multi_uangmuka' _description = 'digunakan untuk membuat Uang Muka Pembelian' pay_amt = fields.Float(string='Uang Muka', help='berapa nilai yang terbentuk untuk COA Uang Muka Pembelian') account_id = fields.Many2one('account.account', string='Bank Intransit', default=389, help='pilih COA intransit bank') ongkir_amt = fields.Float(string='Ongkir', help='masukan nilai yang akan menjadi Pendapatan Ongkos Kirim') selisih_amt = fields.Float(string='Selisih', help='masukan nilai yang akan menjadi Selisih Pembayaran') total_amt = fields.Float(string='Total', help='Total yang akan masuk di journal entries') @api.onchange('pay_amt', 'ongkir_amt', 'selisih_amt') def _compute_total_amt(self): for o in self: o.total_amt = o.pay_amt + o.ongkir_amt + o.selisih_amt def create_uangmukapembelianselected(self): po_ids = self._context['po_ids'] orders = self.env['purchase.order'].browse(po_ids) po_is_uangmuka = self.env['purchase.order'].search([ ('id', 'in', [x.id for x in orders]), ('is_create_uangmuka', '=', True) ]) for rec in orders: if rec.is_create_uangmuka: action = self.env['ir.actions.act_window']._for_xml_id('indoteknik_custom.action_purchase_order_multi_uangmuka2') action['context'] = { 'order_ids': [data.id for data in po_is_uangmuka] } return action if not self.account_id: raise UserError('Bank Intransit harus diisi') if not self.env.user.has_group('account.group_account_manager'): raise UserError('Hanya Finance yang dapat membuat Uang Muka Pembelian') current_time = datetime.now() is_have_ongkir = is_have_selisih = False if self.ongkir_amt > 0: is_have_ongkir = True if not math.isclose(self.selisih_amt, 0): is_have_selisih = True partner_name = orders[0].partner_id.name if orders[0].partner_id.parent_id: partner_name = orders[0].partner_id.parent_id.name order_names = ', '.join([data.name for data in orders]) # Menggabungkan nama order menjadi satu string ref_label = f'UANG MUKA PEMBELIAN {order_names} {partner_name}' param_header = { 'ref': ref_label, 'date': current_time, 'journal_id': 11 } account_move = self.env['account.move'].create([param_header]) debit_entries = [] pay_amt = 0 for order in orders: _logger.info('Success Create Uang Muka Pembelian %s' % account_move.name) partner_id = order.partner_id.parent_id.id if order.partner_id.parent_id else order.partner_id.id partner = order.partner_id.parent_id.name if order.partner_id.parent_id else order.partner_id.name param_debit = { 'move_id': account_move.id, 'account_id': 669, # uang muka persediaan barang dagang 'partner_id': partner_id, 'currency_id': 12, 'debit': order.amount_total, 'credit': 0, 'name': f'UANG MUKA PEMBELIAN {order.name} {partner}', } param_debit_ongkir = { 'move_id': account_move.id, 'account_id': 536, # biaya ongkos kirim 'partner_id': partner_id, 'currency_id': 12, 'debit': self.ongkir_amt, 'credit': 0, 'name': f'UANG MUKA PEMBELIAN {order.name} {partner}', } param_debit_selisih = { 'move_id': account_move.id, 'account_id': 561, # selisih pembayaran 'partner_id': partner_id, 'currency_id': 12, 'debit': self.selisih_amt, 'credit': 0, 'name': f'UANG MUKA PEMBELIAN {order.name} {partner}', } debit_entries.append(param_debit) pay_amt += order.amount_total if is_have_ongkir: debit_entries.append(param_debit_ongkir) pay_amt += self.ongkir_amt if is_have_selisih: debit_entries.append(param_debit_selisih) pay_amt += self.selisih_amt order.is_create_uangmuka = True order.move_id = account_move.id param_credit = { 'move_id': account_move.id, 'account_id': self.account_id.id, # bank in transit 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': pay_amt, 'name': ref_label, } debit_entries.append(param_credit) # Create all account.move.line entries at once self.env['account.move.line'].create(debit_entries) 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 } # def save_multi_create_uang_muka(self): # account_move = self.create_uangmukapembelianselected(purchase, is_create_uangmuka)