summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-09-12 15:00:12 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-09-12 15:00:12 +0700
commitbb49da69c2af4d32c6bbc99cbc74e86e1f695424 (patch)
treedef59116d071d38a712b925480ee1ab94d7e21c5
parentf1b119641b64b77427caa5199d9ce04e5c965c52 (diff)
schema sisa uang muka
-rw-r--r--fixco_custom/models/account_move.py29
-rw-r--r--fixco_custom/models/invoice_reklas.py33
-rw-r--r--fixco_custom/models/purchase_order.py12
-rwxr-xr-xfixco_custom/models/sale.py31
-rwxr-xr-xfixco_custom/models/stock_picking.py9
-rw-r--r--fixco_custom/models/uangmuka_penjualan.py1
-rw-r--r--fixco_custom/views/account_move.xml24
-rwxr-xr-xfixco_custom/views/sale_order.xml16
8 files changed, 141 insertions, 14 deletions
diff --git a/fixco_custom/models/account_move.py b/fixco_custom/models/account_move.py
index d095eeb..836b878 100644
--- a/fixco_custom/models/account_move.py
+++ b/fixco_custom/models/account_move.py
@@ -37,6 +37,34 @@ class AccountMove(models.Model):
purchase_order_id = fields.Many2one('purchase.order', string='Purchase Order')
bill_id = fields.Many2one('account.move', string='Vendor Bill', domain=[('move_type', '=', 'in_invoice')], help='Bill asal dari proses reklas ini')
count_reverse = fields.Integer('Count Reverse', compute='_compute_count_reverse')
+ uangmuka = fields.Boolean('Uang Muka?')
+ reklas = fields.Boolean('Reklas?')
+ reklas_used = fields.Boolean('Reklas Used?', compute='_compute_reklas_used')
+ reklas_used_by = fields.Many2one('account.move', string='Reklas Used By', compute='_compute_reklas_used')
+
+ @api.depends('line_ids.reconciled', 'line_ids.matching_number')
+ def _compute_reklas_used(self):
+ for move in self:
+ move.reklas_used = False
+ move.reklas_used_by = None
+
+ if move.move_type != 'entry':
+ continue
+
+ matching_numbers = move.line_ids.filtered(lambda l: l.reconciled and l.matching_number).mapped('matching_number')
+
+ if not matching_numbers:
+ continue
+
+ invoice_lines = self.env['account.move.line'].search([
+ ('reconciled', '=', True),
+ ('matching_number', 'in', matching_numbers),
+ ('move_id.move_type', '=', 'out_invoice'),
+ ], limit=1)
+
+ if invoice_lines:
+ move.reklas_used = True
+ move.reklas_used_by = invoice_lines.move_id
def _compute_count_reverse(self):
for move in self:
@@ -46,7 +74,6 @@ class AccountMove(models.Model):
lambda p: move.id in p.reversed_entry_id.ids
)
-
move.count_reverse = len(reverse)
def action_view_related_reverse(self):
diff --git a/fixco_custom/models/invoice_reklas.py b/fixco_custom/models/invoice_reklas.py
index d97d868..584d357 100644
--- a/fixco_custom/models/invoice_reklas.py
+++ b/fixco_custom/models/invoice_reklas.py
@@ -73,16 +73,35 @@ class InvoiceReklas(models.TransientModel):
# 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:
+ for invoice in invoices:
# Ambil nama PO jika ada
po_name = invoice.purchase_id.name if invoice.purchase_id else ''
@@ -99,7 +118,9 @@ class InvoiceReklas(models.TransientModel):
parameters_header = {
'ref': ref_name,
'date': current_time,
- 'journal_id': 19
+ 'journal_id': 19,
+ 'sale_id': invoice.sale_id.id,
+ 'reklas': True,
}
if invoice.purchase_id:
@@ -123,7 +144,7 @@ class InvoiceReklas(models.TransientModel):
parameter_debit = {
'move_id': account_move.id,
'account_id': 578, # penerimaan belum alokasi
- 'partner_id': invoice.partner_id.id,
+ 'partner_id': invoice.line_ids[0].partner_id.id,
'currency_id': 12,
'debit': self.pay_amt,
'credit': 0,
@@ -132,7 +153,7 @@ class InvoiceReklas(models.TransientModel):
parameter_credit = {
'move_id': account_move.id,
'account_id': 347,
- 'partner_id': invoice.partner_id.id,
+ 'partner_id': invoice.line_ids[0].partner_id.id,
'currency_id': 12,
'debit': 0,
'credit': self.pay_amt,
@@ -142,7 +163,7 @@ class InvoiceReklas(models.TransientModel):
parameter_debit = {
'move_id': account_move.id,
'account_id': 388,
- 'partner_id': invoice.partner_id.id,
+ 'partner_id': invoice.line_ids[0].partner_id.id,
'currency_id': 12,
'debit': self.pay_amt,
'credit': 0,
@@ -151,7 +172,7 @@ class InvoiceReklas(models.TransientModel):
parameter_credit = {
'move_id': account_move.id,
'account_id': 579,
- 'partner_id': invoice.partner_id.id,
+ 'partner_id': invoice.line_ids[0].partner_id.id,
'currency_id': 12,
'debit': 0,
'credit': self.pay_amt,
diff --git a/fixco_custom/models/purchase_order.py b/fixco_custom/models/purchase_order.py
index 0869cc8..8c84215 100644
--- a/fixco_custom/models/purchase_order.py
+++ b/fixco_custom/models/purchase_order.py
@@ -21,10 +21,11 @@ class PurchaseOrder(models.Model):
'automatic.purchase',
string='Automatic Purchase Reference',
ondelete='set null',
- index=True
+ index=True,
+ copy=False
)
- sale_order_id = fields.Many2one('sale.order', string='Sales Order')
- move_entry_id = fields.Many2one('account.move', string='Journal Entries')
+ sale_order_id = fields.Many2one('sale.order', string='Sales Order', copy=False)
+ move_entry_id = fields.Many2one('account.move', string='Journal Entries', copy=False)
amount_discount = fields.Monetary(
string='Total Discount',
compute='_compute_amount_discount',
@@ -34,7 +35,8 @@ class PurchaseOrder(models.Model):
biaya_lain_lain = fields.Float(
'Biaya Lain Lain',
default=0.0,
- tracking=True
+ tracking=True,
+ copy=False
)
source = fields.Selection([
@@ -42,7 +44,7 @@ class PurchaseOrder(models.Model):
('reordering', 'Reordering'),
('purchasing_job', 'Purchasing Job'),
('manual', 'Manual')
- ], string='Source', default='manual')
+ ], string='Source', default='manual', copy=False)
count_journals = fields.Integer('Count Payment', compute='_compute_count_journals')
def _compute_count_journals(self):
diff --git a/fixco_custom/models/sale.py b/fixco_custom/models/sale.py
index 9943376..c6e9ccb 100755
--- a/fixco_custom/models/sale.py
+++ b/fixco_custom/models/sale.py
@@ -15,6 +15,37 @@ class SaleOrder(models.Model):
count_journals = fields.Integer('Count Payment', compute='_compute_count_journals')
+ remaining_down_payment = fields.Float('Remaining Down Payment', compute='_compute_remaining_down_payment')
+
+ def _compute_remaining_down_payment(self):
+ for order in self:
+ down_payments = self.env['account.move'].search([
+ ('sale_id', '=', order.id),
+ ('move_type', '=', 'entry'),
+ ('state', '=', 'posted'),
+ ('uangmuka', '=', True)
+ ])
+
+ reklas = self.env['account.move'].search([
+ ('sale_id', '=', order.id),
+ ('move_type', '=', 'entry'),
+ ('state', '=', 'posted'),
+ ('reklas', '=', True)
+ ])
+
+ def check_reklas_used(reklas):
+ for line in reklas.line_ids:
+ if line.reconciled and line.matching_number:
+ return True
+ return False
+
+ reklas = reklas.filtered(check_reklas_used)
+
+ nominal_down_payment = sum(down_payments.mapped('amount_total_signed')) if down_payments else 0
+ nominal_reklas = sum(reklas.mapped('amount_total_signed')) if reklas else 0
+
+ order.remaining_down_payment = nominal_down_payment - nominal_reklas
+
def _compute_count_journals(self):
for order in self:
journals = self.env['account.move'].search([
diff --git a/fixco_custom/models/stock_picking.py b/fixco_custom/models/stock_picking.py
index 408e055..73f4175 100755
--- a/fixco_custom/models/stock_picking.py
+++ b/fixco_custom/models/stock_picking.py
@@ -45,6 +45,15 @@ class StockPicking(models.Model):
)
is_printed = fields.Boolean(string="Sudah Dicetak", default=False)
+ def action_cancel(self):
+ for picking in self:
+ if not self.env.user.id == 13:
+ if picking.purchase_id.move_entry_id:
+ raise UserError(
+ 'Hanya Accounting yang bisa melakukan cancel karena di po nya sudah ada uang muka'
+ )
+ super(StockPicking, self).action_cancel()
+
def action_create_invoice_from_mr(self):
"""Create the invoice associated to the PO.
"""
diff --git a/fixco_custom/models/uangmuka_penjualan.py b/fixco_custom/models/uangmuka_penjualan.py
index f099b16..a08b030 100644
--- a/fixco_custom/models/uangmuka_penjualan.py
+++ b/fixco_custom/models/uangmuka_penjualan.py
@@ -64,6 +64,7 @@ class UangmukaPenjualan(models.TransientModel):
'date': current_time,
'journal_id': 24,
'sale_id': order.id,
+ 'uangmuka': True,
}
account_move = request.env['account.move'].create([param_header])
diff --git a/fixco_custom/views/account_move.xml b/fixco_custom/views/account_move.xml
index 0e0b381..88d3b46 100644
--- a/fixco_custom/views/account_move.xml
+++ b/fixco_custom/views/account_move.xml
@@ -9,7 +9,7 @@
<button name="action_post" position="after">
<button name="fixco_custom.action_view_invoice_reklas" string="Reklas"
- type="action" class="btn-primary" attrs="{'invisible': ['|', ('state', '!=', 'posted'), ('move_type', 'not in', ['out_invoice', 'in_invoice'])]}"/>
+ type="action" class="btn-primary" attrs="{'invisible': [('state', '!=', 'posted')]}"/>
</button>
<button name="open_reconcile_view" position="after">
@@ -40,7 +40,13 @@
<field name="partner_id" position="after">
<field name="address" readonly="1" attrs="{'invisible': [('move_type', '!=', 'out_invoice')]}"/>
</field>
-
+
+ <field name="reversed_entry_id" position="before">
+ <field name="uangmuka" readonly="1" attrs="{'invisible': [('move_type', '!=', 'entry')]}"/>
+ <field name="reklas" readonly="1" attrs="{'invisible': [('move_type', '!=', 'entry')]}"/>
+ <field name="reklas_used" readonly="1" attrs="{'invisible': [('move_type', '!=', 'entry')]}"/>
+ <field name="reklas_used_by" readonly="1" attrs="{'invisible': [('move_type', '!=', 'entry')]}"/>
+ </field>
<field name="invoice_date" position="after">
<field name="sale_id" readonly="1" attrs="{'invisible': [('move_type', 'not in', ('out_invoice','entry'))]}"/>
<field name="purchase_order_id" readonly="1" attrs="{'invisible': [('move_type', 'not in', ('in_invoice','entry'))]}"/>
@@ -95,5 +101,19 @@
</field>
</field>
</record>
+
+ <record id="account_move_tree_inherit" model="ir.ui.view">
+ <field name="name">Account Move</field>
+ <field name="model">account.move</field>
+ <field name="inherit_id" ref="account.view_invoice_tree"/>
+ <field name="arch" type="xml">
+ <field name="state" position="after">
+ <field name="uangmuka" optional="hide"/>
+ <field name="reklas" optional="hide"/>
+ <field name="reklas_used" optional="hide"/>
+ <field name="reklas_used_by" optional="hide"/>
+ </field>
+ </field>
+ </record>
</data>
</odoo> \ No newline at end of file
diff --git a/fixco_custom/views/sale_order.xml b/fixco_custom/views/sale_order.xml
index 48e4a31..00234d9 100755
--- a/fixco_custom/views/sale_order.xml
+++ b/fixco_custom/views/sale_order.xml
@@ -38,6 +38,22 @@
<field name="invoice_mp" required="1"/>
<field name="note_by_buyer" readonly="1"/>
</field>
+ <field name="amount_total" position="after">
+ <field name="remaining_down_payment"/>
+ </field>
+ </field>
+ </record>
+ </data>
+
+ <data>
+ <record id="sale_order_tree_inherit" model="ir.ui.view">
+ <field name="name">Sale Order</field>
+ <field name="model">sale.order</field>
+ <field name="inherit_id" ref="sale.view_order_tree"/>
+ <field name="arch" type="xml">
+ <field name="amount_total" position="after">
+ <field name="remaining_down_payment" optional="hide"/>
+ </field>
</field>
</record>
</data>