summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindoteknik_custom/__manifest__.py1
-rwxr-xr-xindoteknik_custom/models/__init__.py3
-rw-r--r--indoteknik_custom/models/account_move.py4
-rw-r--r--indoteknik_custom/models/account_move_due_extension.py119
-rw-r--r--indoteknik_custom/models/bill_receipt.py70
-rw-r--r--indoteknik_custom/models/res_partner.py8
-rwxr-xr-xindoteknik_custom/models/sale_order.py43
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv2
-rw-r--r--indoteknik_custom/views/account_move.xml12
-rw-r--r--indoteknik_custom/views/account_move_views.xml2
-rw-r--r--indoteknik_custom/views/bill_receipt.xml76
-rw-r--r--indoteknik_custom/views/ir_sequence.xml10
12 files changed, 262 insertions, 88 deletions
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py
index 4fa736f6..f91b33d7 100755
--- a/indoteknik_custom/__manifest__.py
+++ b/indoteknik_custom/__manifest__.py
@@ -79,6 +79,7 @@
'views/landedcost.xml',
'views/product_sla.xml',
'views/voucher.xml',
+ 'views/bill_receipt.xml',
'report/report.xml',
'report/report_banner_banner.xml',
'report/report_banner_banner2.xml',
diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py
index 9e4d2cf9..8b3296a5 100755
--- a/indoteknik_custom/models/__init__.py
+++ b/indoteknik_custom/models/__init__.py
@@ -66,4 +66,5 @@ from . import requisition
from . import token_storage
from . import product_sla
from . import account_move_due_extension
-from . import voucher \ No newline at end of file
+from . import voucher
+from . import bill_receipt \ No newline at end of file
diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py
index c2e93632..99439915 100644
--- a/indoteknik_custom/models/account_move.py
+++ b/indoteknik_custom/models/account_move.py
@@ -13,6 +13,8 @@ class AccountMove(models.Model):
resi_tukar_faktur = fields.Char(string='Resi Faktur')
date_terima_tukar_faktur = fields.Date(string='Terima Faktur')
shipper_faktur_id = fields.Many2one('delivery.carrier', string='Shipper Faktur')
+ due_extension = fields.Integer(string='Due Extension', default=0)
+ new_due_date = fields.Date(string='New Due')
def unlink(self):
res = super(AccountMove, self).unlink()
@@ -70,6 +72,8 @@ class AccountMove(models.Model):
invoice_day_to_due = 0
if invoice.payment_state not in ['paid', 'in_payment', 'reversed'] and invoice.invoice_date_due:
invoice_day_to_due = invoice.invoice_date_due - date.today()
+ if invoice.new_due_date:
+ invoice_day_to_due = invoice.new_due_date - date.today()
invoice_day_to_due = invoice_day_to_due.days
invoice.invoice_day_to_due = invoice_day_to_due
diff --git a/indoteknik_custom/models/account_move_due_extension.py b/indoteknik_custom/models/account_move_due_extension.py
index 1e3bdad1..27c8577d 100644
--- a/indoteknik_custom/models/account_move_due_extension.py
+++ b/indoteknik_custom/models/account_move_due_extension.py
@@ -62,72 +62,66 @@ class DueExtension(models.Model):
raise UserError('Hanya Finance yang bisa cancel')
def approve_new_due(self):
- if self.env.user.is_accounting:
- if not self.approval_status == 'approved':
- self.is_approve = True
- self.approval_status = 'approved'
+ if not self.env.user.is_accounting:
+ raise UserError('Hanya Finance Yang Bisa Approve')
+
+ if self.approval_status == 'approved':
+ raise UserError('Document ini sudah di approve')
+
+ self.is_approve = True
+ self.approval_status = 'approved'
- self.partner_id.counter+=1
+ self.partner_id.counter+=1
- if self.partner_id:
- if self.day_extension:
- day_extension = int(self.day_extension)
- new_due = date.today() + timedelta(days=day_extension)
-
- for line in self.due_line:
- line.invoice_id.invoice_date_due = new_due
-
- if self.order_id._notification_margin_leader():
- self.order_id.approval_status = 'pengajuan2'
- return self.order_id._notification_has_margin_leader()
+ day_extension = int(self.day_extension)
+ if self.partner_id:
+ new_due = date.today() + timedelta(days=day_extension)
+
+ for line in self.due_line:
+ line.invoice_id.new_due_date = new_due
+ line.invoice_id.due_extension = day_extension
+
+ if self.order_id._notification_margin_leader():
+ self.order_id.approval_status = 'pengajuan2'
+ return self.order_id._notification_has_margin_leader()
- if self.order_id._notification_margin_manager():
- self.order_id.approval_status = 'pengajuan1'
- return self.order_id._notification_has_margin_manager()
-
- sales = self.env['sale.order'].search([
- ('id', '=', self.order_id.id)
- ])
-
- # sales.state = 'sale'
- sales.action_confirm()
- self.order_id.due_id = self.id
- else:
- raise UserError('Document ini sudah di approve')
- else:
- raise UserError('Hanya Finance Yang Bisa Approve')
+ if self.order_id._notification_margin_manager():
+ self.order_id.approval_status = 'pengajuan1'
+ return self.order_id._notification_has_margin_manager()
+
+ sales = self.env['sale.order'].browse(self.order_id.id)
+
+ sales.action_confirm()
+ self.order_id.due_id = self.id
def generate_due_line(self):
- partners = []
- partners += self.partner_id.child_ids
- partners.append(self.partner_id)
-
+ partners = self.partner_id.get_child_ids()
- for partner in partners:
- query = [
- ('partner_id', '=', partner.id),
- ('state', '=', 'posted'),
- ('move_type', '=', 'out_invoice'),
- ('amount_residual_signed', '>', 0)
- ]
- invoices = self.env['account.move'].search(query, order='invoice_date')
- count = 0
-
- for invoice in invoices:
- if invoice.invoice_day_to_due < 0:
- self.env['due.extension.line'].create([{
- 'due_id': self.id,
- 'partner_id': invoice.partner_id.id,
- 'invoice_id': invoice.id,
- 'date_invoice': invoice.invoice_date,
- 'efaktur_id': invoice.efaktur_id.id,
- 'reference': invoice.ref,
- 'total_amt': invoice.amount_total,
- 'open_amt': invoice.amount_residual_signed,
- 'due_date': invoice.invoice_date_due
- }])
- count += 1
- _logger.info("Due Extension Line generated %s" % count)
+ query = [
+ ('partner_id', 'in', partners),
+ ('state', '=', 'posted'),
+ ('move_type', '=', 'out_invoice'),
+ ('amount_residual_signed', '>', 0)
+ ]
+ invoices = self.env['account.move'].search(query, order='invoice_date')
+ count = 0
+
+ for invoice in invoices:
+ day_to_due = invoice.invoice_day_to_due + invoice.due_extension
+ if day_to_due < 0:
+ self.env['due.extension.line'].create([{
+ 'due_id': self.id,
+ 'partner_id': invoice.partner_id.id,
+ 'invoice_id': invoice.id,
+ 'date_invoice': invoice.invoice_date,
+ 'efaktur_id': invoice.efaktur_id.id,
+ 'reference': invoice.ref,
+ 'total_amt': invoice.amount_total,
+ 'open_amt': invoice.amount_residual_signed
+ }])
+ count += 1
+ _logger.info("Due Extension Line generated %s" % count)
+
def unlink(self):
res = super(DueExtension, self).unlink()
if not self._name == 'due.extension':
@@ -157,5 +151,8 @@ class DueExtensionLine(models.Model):
def _compute_due_date(self):
for line in self:
- line.due_date = line.invoice_id.invoice_date_due
+ if line.invoice_id.new_due_date:
+ line.due_date = line.invoice_id.new_due_date
+ else:
+ line.due_date = line.invoice_id.invoice_date_due
diff --git a/indoteknik_custom/models/bill_receipt.py b/indoteknik_custom/models/bill_receipt.py
new file mode 100644
index 00000000..31c09b33
--- /dev/null
+++ b/indoteknik_custom/models/bill_receipt.py
@@ -0,0 +1,70 @@
+from odoo import models, api, fields
+from odoo.exceptions import AccessError, UserError, ValidationError
+from datetime import timedelta, date
+import logging
+
+_logger = logging.getLogger(__name__)
+
+class BillReceipt(models.Model):
+ _name = "bill.receipt"
+ _description = "Bill Receipt"
+ _rec_name = 'number'
+
+ number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True)
+ vendor_id = fields.Many2one('res.partner', string="Vendor")
+ document_date = fields.Date(string="Document Date")
+ description = fields.Text(string='Description')
+ validated = fields.Boolean(string="Validated", readonly=True)
+ bill_line = fields.One2many('bill.receipt.line', 'bill_id', string='Bill Receipt Lines')
+
+ @api.model
+ def create(self, vals):
+ vals['number'] = self.env['ir.sequence'].next_by_code('due.extension') or '0'
+ result = super(BillReceipt, self).create(vals)
+ return result
+
+ def validate_button(self):
+ if not self.bill_line:
+ raise UserError('Bill receipt line masih kosong')
+
+ self.validated = True
+
+ def cancel_button(self):
+ if not self.bill_line:
+ raise UserError('Bill receipt line masih kosong')
+
+ if self.validated != True:
+ raise UserError('Document ini belum di validate')
+
+ self.validated = False
+
+class BillReceiptLine(models.Model):
+ _name = 'bill.receipt.line'
+ _description = 'Bill Receipt Line'
+ _order = 'bill_id, id'
+
+ bill_id = fields.Many2one('bill.receipt', string='Bill Receipt')
+ po_id = fields.Many2one('purchase.order', string='PO')
+ sale_order_id = fields.Many2one('sale.order', string='Sale Order')
+ user_id = fields.Many2one('res.users', string='Purchase Rep')
+ payment_term_id = fields.Many2one('account.payment.term', string='Payment Terms')
+ amount_total = fields.Float(string='Total')
+ reference = fields.Char(string='Reference')
+
+ @api.onchange('po_id')
+ def onchange_user_id(self):
+ self.user_id = self.po_id.user_id
+
+ @api.onchange('po_id')
+ def onchange_sale_order_id(self):
+ self.sale_order_id = self.po_id.sale_order_id
+
+ @api.onchange('po_id')
+ def onchange_payment_term_id(self):
+ self.payment_term_id = self.po_id.payment_term_id
+
+ @api.onchange('po_id')
+ def onchange_amount_total(self):
+ self.amount_total = self.po_id.amount_total
+
+
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 5dec8da8..1695639d 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -20,6 +20,14 @@ class ResPartner(models.Model):
sppkp = fields.Char(string="SPPKP")
counter = fields.Integer(string="Counter", default=0)
+ def get_child_ids(self):
+ partner = self.env['res.partner'].search([('id', '=', self.id)], limit=1)
+ partner_child_ids = [x['id'] for x in partner.child_ids] + [partner.id]
+ if partner.parent_id:
+ partner_child_ids += [x['id'] for x in partner.parent_id.child_ids]
+ partner_child_ids += [partner.parent_id.id]
+ return partner_child_ids
+
def unlink(self):
if self._name == 'res.partner':
raise UserError('Maaf anda tidak bisa delete contact')
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index e54b9ae2..3d0dfc17 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -8,6 +8,7 @@ import string
import requests
import math
import json
+from datetime import timedelta, date
_logger = logging.getLogger(__name__)
@@ -390,26 +391,28 @@ class SaleOrder(models.Model):
if self.due_id and self.due_id.is_approve == False:
raise UserError('Document Over Due Yang Anda Buat Belum Di Approve')
- if not self.env.user.is_leader and not self.env.user.is_sales_manager:
- query = [
- ('partner_id', '=', parent_id),
- ('state', '=', 'posted'),
- ('move_type', '=', 'out_invoice'),
- ('amount_residual_signed', '>', 0)
- ]
- invoices = self.env['account.move'].search(query, order='invoice_date')
- due_extension = self.env['due.extension'].create([{
- 'partner_id': parent_id,
- 'day_extension': '3',
- 'order_id': self.id,
- }])
- due_extension.generate_due_line()
- self.due_id = due_extension.id
- if len(self.due_id.due_line) > 0:
- return True
- else:
- due_extension.unlink()
- return False
+ query = [
+ ('partner_id', '=', parent_id),
+ ('state', '=', 'posted'),
+ ('move_type', '=', 'out_invoice'),
+ ('amount_residual_signed', '>', 0)
+ ]
+ invoices = self.env['account.move'].search(query, order='invoice_date')
+
+ if invoices:
+ if not self.env.user.is_leader and not self.env.user.is_sales_manager:
+ due_extension = self.env['due.extension'].create([{
+ 'partner_id': parent_id,
+ 'day_extension': '3',
+ 'order_id': self.id,
+ }])
+ due_extension.generate_due_line()
+ self.due_id = due_extension.id
+ if len(self.due_id.due_line) > 0:
+ return True
+ else:
+ due_extension.unlink()
+ return False
def _notification_margin_leader(self):
if self.total_percent_margin <= 15 and not self.env.user.is_leader:
diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv
index 2b269417..379c4c8e 100755
--- a/indoteknik_custom/security/ir.model.access.csv
+++ b/indoteknik_custom/security/ir.model.access.csv
@@ -57,3 +57,5 @@ access_requisition_purchase_match,access.requisition.purchase.match,model_requis
access_token_storage,access.token_storage,model_token_storage,,1,1,1,1
access_product_sla,access.product_sla,model_product_sla,,1,1,1,1
access_voucher,access.voucher,model_voucher,,1,1,1,1
+access_bill_receipt,access.bill.receipt,model_bill_receipt,,1,1,1,1
+access_bill_receipt_line,access.bill.receipt.line,model_bill_receipt_line,,1,1,1,1
diff --git a/indoteknik_custom/views/account_move.xml b/indoteknik_custom/views/account_move.xml
index 9faf3149..7f7fb228 100644
--- a/indoteknik_custom/views/account_move.xml
+++ b/indoteknik_custom/views/account_move.xml
@@ -15,6 +15,7 @@
<field name="shipper_faktur_id"/>
<field name="resi_tukar_faktur"/>
<field name="date_terima_tukar_faktur"/>
+ <field name="due_extension"/>
</field>
</field>
</record>
@@ -30,13 +31,14 @@
</field>
<field name="invoice_date_due" position="after">
<field name="invoice_day_to_due" attrs="{'invisible': [['payment_state', 'in', ('paid', 'in_payment', 'reversed')]]}"/>
+ <field name="due_extension" optional="hide"/>
</field>
<field name="payment_state" position="after">
- <field name="invoice_payment_term_id"/>
- <field name="date_kirim_tukar_faktur"/>
- <field name="shipper_faktur_id" optional="1"/>
- <field name="resi_tukar_faktur" optional="1"/>
- <field name="date_terima_tukar_faktur"/>
+ <field name="invoice_payment_term_id" optional="hide"/>
+ <field name="date_kirim_tukar_faktur" optional="hide"/>
+ <field name="shipper_faktur_id" optional="hide"/>
+ <field name="resi_tukar_faktur" optional="hide"/>
+ <field name="date_terima_tukar_faktur" optional="hide"/>
</field>
</field>
</record>
diff --git a/indoteknik_custom/views/account_move_views.xml b/indoteknik_custom/views/account_move_views.xml
index 983fbd5a..fee94b42 100644
--- a/indoteknik_custom/views/account_move_views.xml
+++ b/indoteknik_custom/views/account_move_views.xml
@@ -4,7 +4,7 @@
<field name="name">due.extension.tree</field>
<field name="model">due.extension</field>
<field name="arch" type="xml">
- <tree create="false">
+ <tree default_order="create_date desc" create="0">
<field name="number"/>
<field name="partner_id"/>
<field name="day_extension"/>
diff --git a/indoteknik_custom/views/bill_receipt.xml b/indoteknik_custom/views/bill_receipt.xml
new file mode 100644
index 00000000..6e27ee12
--- /dev/null
+++ b/indoteknik_custom/views/bill_receipt.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+ <record id="bill_receipt_tree" model="ir.ui.view">
+ <field name="name">bill.receipt.tree</field>
+ <field name="model">bill.receipt</field>
+ <field name="arch" type="xml">
+ <tree>
+ <field name="number"/>
+ <field name="vendor_id"/>
+ <field name="document_date"/>
+ <field name="description"/>
+ <field name="validated"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="bill_receipt_form" model="ir.ui.view">
+ <field name="name">bill.receipt.form</field>
+ <field name="model">bill.receipt</field>
+ <field name="arch" type="xml">
+ <form>
+ <header>
+ <button name="validate_button"
+ string="Validate"
+ type="object"
+ />
+ <button name="cancel_button"
+ string="Cancel"
+ type="object"
+ />
+ </header>
+ <sheet>
+ <group>
+ <group>
+ <field name="vendor_id" attrs="{'readonly': [('validated', '=', True)]}"/>
+ <field name="document_date" attrs="{'readonly': [('validated', '=', True)]}"/>
+ <field name="description" attrs="{'readonly': [('validated', '=', True)]}"/>
+ </group>
+ <group>
+ <field name="validated" readonly="1"/>
+ </group>
+ </group>
+ <notebook>
+ <page string="Bill Line" name="bill_line">
+ <field name="bill_line" attrs="{'readonly': [('validated', '=', True)]}">
+ <tree editable="bottom">
+ <field name="po_id"/>
+ <field name="sale_order_id"/>
+ <field name="user_id"/>
+ <field name="payment_term_id"/>
+ <field name="amount_total"/>
+ <field name="reference"/>
+ </tree>
+ </field>
+ </page>
+ </notebook>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="bill_receipt_action" model="ir.actions.act_window">
+ <field name="name">Bill Line</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">bill.receipt</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+
+ <menuitem
+ id="menu_bill_receipt"
+ name="Bill Line"
+ parent="sale.product_menu_catalog"
+ sequence="4"
+ action="bill_receipt_action"
+ />
+</odoo>
diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml
index a8348772..6798e5b4 100644
--- a/indoteknik_custom/views/ir_sequence.xml
+++ b/indoteknik_custom/views/ir_sequence.xml
@@ -41,6 +41,16 @@
<field name="number_increment">1</field>
</record>
+ <record id="sequence_bill_receipt" model="ir.sequence">
+ <field name="name">Bill Receipt</field>
+ <field name="code">bill.receipt</field>
+ <field name="active">TRUE</field>
+ <field name="prefix">BR/%(year)s/</field>
+ <field name="padding">5</field>
+ <field name="number_next">1</field>
+ <field name="number_increment">1</field>
+ </record>
+
<record id="sequence_requisition" model="ir.sequence">
<field name="name">Requisition</field>
<field name="code">requisition</field>