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 PurchaseOrderMultiUangmukaPenjualan(models.TransientModel): _name = 'sale.order.multi_uangmuka_penjualan' _description = 'digunakan untuk membuat Uang Muka Penjualan' 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_uangmukapenjualanselected(self): so_ids = self._context['so_ids'] orders = self.env['sale.order'].browse(so_ids) po_is_uangmuka = self.env['sale.order'].search([ ('id', 'in', [x.id for x in orders]) ]) 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 penjualan') 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 PENJUALAN {order_names} {partner_name}' param_header = { 'ref': ref_label, 'date': current_time, 'journal_id': 11, # 'sale_id': order.id, } account_move = self.env['account.move'].create([param_header]) debit_entries = [] pay_amt = 0 for order in orders: _logger.info('Success Create Uang Muka P %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_credit = { 'move_id': account_move.id, 'account_id': 668, # penerimaan belum alokasi 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': order.amount_total, 'name': f'UANG MUKA PENJUALAN {order.name} {partner}', } param_ongkir_credit = { 'move_id': account_move.id, 'account_id': 550, # pendapatan ongkos kirim 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': self.ongkir_amt, 'name': f'UANG MUKA PENJUALAN {order.name} {partner}', } param_selisih_credit = { 'move_id': account_move.id, 'account_id': 561, # selisih pembayaran 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': self.selisih_amt, 'name': f'UANG MUKA PENJUALAN {order.name} {partner}', } debit_entries.append(param_credit) pay_amt += order.amount_total if is_have_ongkir: debit_entries.append(param_ongkir_credit) pay_amt += self.ongkir_amt if is_have_selisih: debit_entries.append(param_selisih_credit) pay_amt += self.selisih_amt param_debit = { 'move_id': account_move.id, 'account_id': self.account_id.id, # intransit 'partner_id': partner_id, 'currency_id': 12, 'debit': pay_amt, 'credit': 0, 'name': ref_label, } debit_entries.append(param_debit) # 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_uangmukapenjualanselected(purchase, is_create_uangmuka)