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 UangmukaPenjualan(models.TransientModel): _name = '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 Penjualan') account_id = fields.Many2one( 'account.account', string='Bank Intransit', default=lambda self: self._default_account_id(), ) 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') def _default_account_id(self): partner_name = self.env.context.get('default_partner_name', '') domain = [ ('name', 'not ilike', 'in transit'), ('name', 'ilike', partner_name) ] account = self.env['account.account'].search(domain, limit=1) return account.id if account else 389 @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_uangmukapenjualan(self): if self.pay_amt <= 0: raise UserError('Payment Amount harus diisi') if not self.account_id: raise UserError('Bank Intransit harus diisi') 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 # elif self.selisih_amt > 0: # is_have_selisih = True orders = self.env['sale.order'].browse(self._context.get('active_ids',[])) current_time = datetime.now() for order in orders: partner_name = order.partner_id.name if order.partner_id.parent_id: partner_name = order.partner_id.parent_id.name ref_label = 'UANG MUKA PENJUALAN '+order.name+' '+partner_name param_header = { 'ref': ref_label, 'date': current_time, 'journal_id': 21, 'sale_id': order.id, 'uangmuka': True, } account_move = request.env['account.move'].create([param_header]) account_move.sale_id = order.id _logger.info('Success Create Uang Muka Penjualan %s' % account_move.name) if order.partner_id.parent_id: partner_id = order.partner_id.parent_id.id else: partner_id = order.partner_id.id param_debit = { 'move_id': account_move.id, 'account_id': self.account_id.id, # intransit 'partner_id': partner_id, 'currency_id': 12, 'debit': self.pay_amt + self.ongkir_amt + self.selisih_amt, 'credit': 0, 'name': ref_label, } # sisa di credit untuk uang muka penjualan, diluar ongkir dan selisih param_credit = { 'move_id': account_move.id, 'account_id': 578, # penerimaan belum alokasi 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': self.pay_amt, 'name': ref_label, } param_ongkir_credit = { 'move_id': account_move.id, 'account_id': 488, # pendapatan ongkos kirim 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': self.ongkir_amt, 'name': ref_label, } param_selisih_credit = { 'move_id': account_move.id, 'account_id': 767, # selisih pembayaran 'partner_id': partner_id, 'currency_id': 12, 'debit': 0, 'credit': self.selisih_amt, 'name': ref_label, } if is_have_ongkir and is_have_selisih: request.env['account.move.line'].create([param_debit, param_credit, param_ongkir_credit, param_selisih_credit]) elif is_have_ongkir: request.env['account.move.line'].create([param_debit, param_credit, param_ongkir_credit]) elif is_have_selisih: request.env['account.move.line'].create([param_debit, param_credit, param_selisih_credit]) else: request.env['account.move.line'].create([param_debit, param_credit]) order.uangmuka_exist = True 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 }