diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2025-06-16 14:37:23 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2025-06-16 14:37:23 +0700 |
| commit | 4a65f46a5b7fd1bc48bc04cbf456119332fff0fe (patch) | |
| tree | 97219770248095c25a673d44dd8d0053d792a0f2 | |
| parent | 55936047e729cadcd462a57c7838f77f7c57ee1a (diff) | |
uangmuka penjualan and cr schema shipment group
| -rwxr-xr-x | fixco_custom/__manifest__.py | 1 | ||||
| -rwxr-xr-x | fixco_custom/models/__init__.py | 1 | ||||
| -rwxr-xr-x | fixco_custom/models/sale.py | 11 | ||||
| -rw-r--r-- | fixco_custom/models/shipment_group.py | 52 | ||||
| -rw-r--r-- | fixco_custom/models/uangmuka_penjualan.py | 118 | ||||
| -rwxr-xr-x | fixco_custom/security/ir.model.access.csv | 3 | ||||
| -rw-r--r-- | fixco_custom/views/account_move.xml | 3 | ||||
| -rwxr-xr-x | fixco_custom/views/detail_order.xml | 2 | ||||
| -rwxr-xr-x | fixco_custom/views/sale_order.xml | 5 | ||||
| -rw-r--r-- | fixco_custom/views/shipment_group.xml | 2 | ||||
| -rw-r--r-- | fixco_custom/views/uangmuka_penjualan.xml | 33 |
11 files changed, 229 insertions, 2 deletions
diff --git a/fixco_custom/__manifest__.py b/fixco_custom/__manifest__.py index 83d085a..ffcbb6a 100755 --- a/fixco_custom/__manifest__.py +++ b/fixco_custom/__manifest__.py @@ -27,6 +27,7 @@ 'views/stock_picking_shipment_group.xml', 'views/stock_picking_print_picking_list.xml', 'views/print_picking_list.xml', + 'views/uangmuka_penjualan.xml', ], 'demo': [], 'css': [], diff --git a/fixco_custom/models/__init__.py b/fixco_custom/models/__init__.py index 9eba2c6..6ef28e0 100755 --- a/fixco_custom/models/__init__.py +++ b/fixco_custom/models/__init__.py @@ -13,3 +13,4 @@ from . import shipment_group from . import stock_picking_shipment_group from . import print_picking_list from . import stock_picking_print_picking_list +from . import uangmuka_penjualan diff --git a/fixco_custom/models/sale.py b/fixco_custom/models/sale.py index bc7a734..fc46f3d 100755 --- a/fixco_custom/models/sale.py +++ b/fixco_custom/models/sale.py @@ -72,3 +72,14 @@ class SaleOrder(models.Model): } } + def open_form_uangmuka_penjualan(self): + return { + 'name': _('Create uang muka penjualan'), + 'type': 'ir.actions.act_window', + 'res_model': 'uangmuka.penjualan', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'so_ids': self.ids, + } + } diff --git a/fixco_custom/models/shipment_group.py b/fixco_custom/models/shipment_group.py index 71d7981..5f6c315 100644 --- a/fixco_custom/models/shipment_group.py +++ b/fixco_custom/models/shipment_group.py @@ -13,6 +13,58 @@ class ShipmentGroup(models.Model): number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True) shipment_line = fields.One2many('shipment.group.line', 'shipment_id', string='Shipment Group Lines', auto_join=True) + scan_invoice = fields.Char(string="Scan Invoice Marketplace") + + @api.onchange('scan_invoice') + def _onchange_scan_invoice(self): + if self.scan_invoice: + result = self.add_lines_from_scan(self.scan_invoice) + self.scan_invoice = False # Reset field setelah scan + return result + + def add_lines_from_scan(self, scan_value): + self.ensure_one() + picking = self.env['stock.picking'].search([ + ('invoice_mp', '=', scan_value) + ], limit=1) + + if not picking: + return { + 'warning': { + 'title': 'Not Found', + 'message': f'No picking found with invoice: {scan_value}' + } + } + + # Cek duplikat + existing_lines = self.shipment_line.filtered(lambda l: l.picking_id == picking) + if existing_lines: + return { + 'warning': { + 'title': 'Duplicate', + 'message': 'This picking has already been added to the shipment group' + } + } + + # Buat line untuk setiap move + created_lines = [] + for move in picking.move_ids_without_package: + line = self.env['shipment.group.line'].create({ + 'shipment_id': self.id, + 'product_id': move.product_id.id, + 'carrier': picking.carrier, + 'invoice_marketplace': picking.invoice_mp, + 'picking_id': picking.id, + }) + created_lines.append(line.id) + + return { + 'effect': { + 'fadeout': 'slow', + 'message': f'Added {len(created_lines)} products from {picking.name}', + 'type': 'rainbow_man', + } + } @api.model def create(self, vals): diff --git a/fixco_custom/models/uangmuka_penjualan.py b/fixco_custom/models/uangmuka_penjualan.py new file mode 100644 index 0000000..9673bf1 --- /dev/null +++ b/fixco_custom/models/uangmuka_penjualan.py @@ -0,0 +1,118 @@ +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=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_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': 24, + 'sale_id': order.id, + } + + 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]) + 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 + } diff --git a/fixco_custom/security/ir.model.access.csv b/fixco_custom/security/ir.model.access.csv index ef91758..422d603 100755 --- a/fixco_custom/security/ir.model.access.csv +++ b/fixco_custom/security/ir.model.access.csv @@ -16,4 +16,5 @@ access_stock_picking_shipment_group,access.stock.picking.shipment_group,model_st access_bundling_line,access.bundling.line,model_bundling_line,,1,1,1,1 access_print_picking_list,access.shipment.group,model_print_picking_list,,1,1,1,1 access_print_picking_list_line,access.shipment.group.line,model_print_picking_list_line,,1,1,1,1 -access_stock_picking_print_picking_list,access.stock.picking.print_picking_list,model_stock_picking_print_picking_list,,1,1,1,1
\ No newline at end of file +access_stock_picking_print_picking_list,access.stock.picking.print_picking_list,model_stock_picking_print_picking_list,,1,1,1,1 +access_uangmuka_penjualan,access.uangmuka.penjualan,model_uangmuka_penjualan,,1,1,1,1
\ No newline at end of file diff --git a/fixco_custom/views/account_move.xml b/fixco_custom/views/account_move.xml index 97414e6..1157212 100644 --- a/fixco_custom/views/account_move.xml +++ b/fixco_custom/views/account_move.xml @@ -6,6 +6,9 @@ <field name="model">account.move</field> <field name="inherit_id" ref="account.view_move_form"/> <field name="arch" type="xml"> + <!-- <field name="ref" position="after"> + <field name="sale_id" readonly="1" attrs="{'invisible': [('move_type', '!=', 'entry')]}"/> + </field> --> <field name="payment_reference" position="after"> <field name="invoice_marketplace" readonly="1"/> <field name="transaction_type" readonly="1"/> diff --git a/fixco_custom/views/detail_order.xml b/fixco_custom/views/detail_order.xml index 60a335c..3132874 100755 --- a/fixco_custom/views/detail_order.xml +++ b/fixco_custom/views/detail_order.xml @@ -24,7 +24,7 @@ <button name="execute_queue" string="Create Detail Order" type="object" - attrs="{'readonly': [('detail_order', '!=', False)]}" + attrs="{'invisible': [('detail_order', '!=', False)]}" /> <button name="execute_queue_detail" string="Create SO" diff --git a/fixco_custom/views/sale_order.xml b/fixco_custom/views/sale_order.xml index 2b2b000..2fd452e 100755 --- a/fixco_custom/views/sale_order.xml +++ b/fixco_custom/views/sale_order.xml @@ -6,6 +6,11 @@ <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> + <button id="action_confirm" position="after"> + <button name="open_form_uangmuka_penjualan" + string="UangMuka" + type="object" attrs="{'invisible': [('state', '!=', 'sale')]}"/> + </button> <field name="tag_ids" position="after"> <field name="carrier"/> </field> diff --git a/fixco_custom/views/shipment_group.xml b/fixco_custom/views/shipment_group.xml index 4239bea..ed3f4c9 100644 --- a/fixco_custom/views/shipment_group.xml +++ b/fixco_custom/views/shipment_group.xml @@ -32,6 +32,8 @@ <group> <group> <field name="number" readonly="1"/> + <field name="scan_invoice" widget="scan_barcode" + placeholder="Scan Invoice Marketplace"/> </group> </group> <notebook> diff --git a/fixco_custom/views/uangmuka_penjualan.xml b/fixco_custom/views/uangmuka_penjualan.xml new file mode 100644 index 0000000..447d89b --- /dev/null +++ b/fixco_custom/views/uangmuka_penjualan.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record id="view_uangmuka_penjualan" model="ir.ui.view"> + <field name="name">Uangmuka Penjualan</field> + <field name="model">uangmuka.penjualan</field> + <field name="arch" type="xml"> + <form string="Invoice Sales Order"> + <p class="oe_grey"> + Pembuatan semi otomatis Uang Muka Penjualan, mohon dicek kembali + </p> + <group> + <field name="pay_amt"/> + <field name="ongkir_amt"/> + <field name="selisih_amt"/> + <field name="account_id" domain="[('name', 'ilike', 'in transit')]"/> + <field name="total_amt" readonly="1"/> + </group> + <footer> + <button name="create_uangmukapenjualan" id="create_uangmukapenjualan" string="Create" type="object" required="1"/> + </footer> + </form> + </field> + </record> + + <record id="action_view_uangmuka_penjualan" model="ir.actions.act_window"> + <field name="name">Create Uang Muka Penjualan</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">uangmuka.penjualan</field> + <field name="view_mode">form</field> + <field name="target">new</field> + </record> + +</odoo> |
