summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-06-25 08:14:01 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-06-25 08:14:01 +0700
commit08791b79f900b71a6fb22fb361b0ad06af8c6c1f (patch)
tree765c71620986c40f5f62157b76f9392b9f4d0edd
parentf8765bb7a9b6095c3b79d71f65ce8ae4a041da6d (diff)
parent7e42b0fdd1735df03e249f1362e58c169236465d (diff)
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into tukar_guling
-rw-r--r--indoteknik_custom/models/account_move.py15
-rw-r--r--indoteknik_custom/models/commision.py51
-rw-r--r--indoteknik_custom/models/coretax_fatur.py83
-rw-r--r--indoteknik_custom/models/res_partner.py22
-rwxr-xr-xindoteknik_custom/models/sale_order.py7
-rw-r--r--indoteknik_custom/views/account_move.xml1
-rw-r--r--indoteknik_custom/views/customer_commision.xml8
-rw-r--r--indoteknik_custom/views/ir_sequence.xml32
-rw-r--r--indoteknik_custom/views/res_partner.xml5
9 files changed, 172 insertions, 52 deletions
diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py
index 66020a69..af24f93e 100644
--- a/indoteknik_custom/models/account_move.py
+++ b/indoteknik_custom/models/account_move.py
@@ -70,6 +70,7 @@ class AccountMove(models.Model):
reklas_misc_id = fields.Many2one('account.move', string='Journal Entries Reklas')
# Di model account.move
bill_id = fields.Many2one('account.move', string='Vendor Bill', domain=[('move_type', '=', 'in_invoice')], help='Bill asal dari proses reklas ini')
+ down_payment = fields.Boolean('Down Payments?')
# def name_get(self):
@@ -436,18 +437,18 @@ class AccountMove(models.Model):
return invoices
def export_faktur_to_xml(self):
-
valid_invoices = self
- # Panggil model coretax.faktur untuk menghasilkan XML
coretax_faktur = self.env['coretax.faktur'].create({})
- response = coretax_faktur.export_to_download(invoices=valid_invoices)
- current_time = datetime.utcnow()
- # Tandai faktur sebagai sudah diekspor
+ response = coretax_faktur.export_to_download(
+ invoices=valid_invoices,
+ down_payments=[inv.down_payment for inv in valid_invoices],
+ )
+
valid_invoices.write({
'is_efaktur_exported': True,
- 'date_efaktur_exported': current_time, # Set tanggal ekspor
+ 'date_efaktur_exported': datetime.utcnow(),
})
- return response
+ return response \ No newline at end of file
diff --git a/indoteknik_custom/models/commision.py b/indoteknik_custom/models/commision.py
index 03d32d2d..199aa106 100644
--- a/indoteknik_custom/models/commision.py
+++ b/indoteknik_custom/models/commision.py
@@ -148,6 +148,7 @@ class CustomerCommision(models.Model):
_order = 'id desc'
_inherit = ['mail.thread']
_rec_name = 'number'
+ _description = 'Customer Benefits'
number = fields.Char(string='Document No', index=True, copy=False, readonly=True)
date_from = fields.Date(string='Date From', required=True)
@@ -175,10 +176,19 @@ class CustomerCommision(models.Model):
('approved', 'Approved'),
('reject', 'Rejected'),
], string='Status')
- commision_percent = fields.Float(string='Commision %', tracking=3)
- commision_amt = fields.Float(string='Commision Amount', tracking=3)
- cashback = fields.Float(string='Cashback', compute="compute_cashback")
- total_commision = fields.Float(string='Total Commision', compute="compute_cashback")
+
+ # commision_percent = fields.Float(string='Commision %', tracking=3)
+ commision_percent = fields.Float(string='Cashback %', tracking=3)
+
+ # commision_amt = fields.Float(string='Commision Amount', tracking=3)
+ commision_amt = fields.Float(string='Cashback', tracking=3)
+
+ # cashback = fields.Float(string='Cashback', compute="compute_cashback")
+ cashback = fields.Float(string='PPh Cashback', compute="compute_cashback")
+
+ # total_commision = fields.Float(string='Total Commision', compute="compute_cashback")
+ total_commision = fields.Float(string='Cashback yang dibayarkan', compute="compute_cashback")
+
total_cashback = fields.Float(string='Total Cashback')
commision_amt_text = fields.Char(string='Commision Amount Text', compute='compute_delivery_amt_text')
total_dpp = fields.Float(string='Total DPP', compute='_compute_total_dpp')
@@ -348,14 +358,31 @@ class CustomerCommision(models.Model):
@api.model
def create(self, vals):
- vals['number'] = self.env['ir.sequence'].next_by_code('customer.commision') or '0'
- # if vals['commision_amt'] > 0:
- # commision_amt = vals['commision_amt']
- # total_dpp = vals['total_dpp']
- # commision_percent = commision_amt / total_dpp * 100
- # vals['commision_percent'] = commision_percent
- result = super(CustomerCommision, self).create(vals)
- return result
+ commision_type = vals.get('commision_type')
+
+ if commision_type == 'cashback':
+ sequence_code = 'customer.commision.cashback'
+ elif commision_type == 'fee':
+ sequence_code = 'customer.commision.fee'
+ elif commision_type == 'rebate':
+ sequence_code = 'customer.commision.rebate'
+ else:
+ raise UserError('Tipe komisi tidak dikenal!')
+
+ vals['number'] = self.env['ir.sequence'].next_by_code(sequence_code) or '0'
+
+ return super(CustomerCommision, self).create(vals)
+
+ # @api.model
+ # def create(self, vals):
+ # vals['number'] = self.env['ir.sequence'].next_by_code('customer.commision') or '0'
+ # # if vals['commision_amt'] > 0:
+ # # commision_amt = vals['commision_amt']
+ # # total_dpp = vals['total_dpp']
+ # # commision_percent = commision_amt / total_dpp * 100
+ # # vals['commision_percent'] = commision_percent
+ # result = super(CustomerCommision, self).create(vals)
+ # return result
def action_confirm_customer_commision(self):
jakarta_tz = pytz.timezone('Asia/Jakarta')
diff --git a/indoteknik_custom/models/coretax_fatur.py b/indoteknik_custom/models/coretax_fatur.py
index 92ff1a72..54eb0f8e 100644
--- a/indoteknik_custom/models/coretax_fatur.py
+++ b/indoteknik_custom/models/coretax_fatur.py
@@ -32,7 +32,7 @@ class CoretaxFaktur(models.Model):
return cleaned_number
- def generate_xml(self, invoices=None):
+ def generate_xml(self, invoices=None, down_payments=False):
# Buat root XML
root = ET.Element('TaxInvoiceBulk', {
'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
@@ -72,42 +72,76 @@ class CoretaxFaktur(models.Model):
ET.SubElement(tax_invoice, 'BuyerEmail').text = invoice.partner_id.email or ''
ET.SubElement(tax_invoice, 'BuyerIDTKU').text = buyerIDTKU
- # Filter product
- product_lines = invoice.invoice_line_ids.filtered(
- lambda l: not l.display_type and hasattr(l, 'account_id') and
- l.account_id and l.product_id and
- l.account_id.id != self.DISCOUNT_ACCOUNT_ID and
- l.quantity != -1
- )
+ # Handle product lines based on down_payments flag
+ if down_payments and invoice.invoice_origin:
+ # Get from sale.order.line for down payment
+ sale_order = invoice.sale_id
+ if sale_order:
+ product_lines = sale_order.order_line.filtered(
+ lambda l: l.product_id and not l.is_downpayment and not l.display_type and not l.product_id.id == 229625
+ )
+ # Convert sale order lines to invoice-like format
+ converted_lines = []
+ for line in product_lines:
+ converted_lines.append({
+ 'name': line.name,
+ 'product_id': line.product_id,
+ 'price_subtotal': line.price_subtotal,
+ 'quantity': line.product_uom_qty,
+ 'price_unit': line.price_unit,
+ 'account_id': line.order_id.analytic_account_id or False,
+ })
+ product_lines = converted_lines
+ else:
+ product_lines = []
+ else:
+ # Normal case - get from invoice lines
+ product_lines = invoice.invoice_line_ids.filtered(
+ lambda l: not l.display_type and hasattr(l, 'account_id') and
+ l.account_id and l.product_id and
+ l.account_id.id != self.DISCOUNT_ACCOUNT_ID and
+ l.quantity != -1
+ )
- # Filter discount
+ # Filter discount (always from invoice)
discount_lines = invoice.invoice_line_ids.filtered(
lambda l: not l.display_type and (
- (hasattr(l, 'account_id') and l.account_id and
- l.account_id.id == self.DISCOUNT_ACCOUNT_ID) or
- (l.quantity == -1)
+ (hasattr(l, 'account_id') and l.account_id and
+ l.account_id.id == self.DISCOUNT_ACCOUNT_ID) or
+ (l.quantity == -1)
)
)
- # Calculate total product amount (before discount)
- total_product_amount = sum(line.price_subtotal for line in product_lines)
+ # Calculate totals
+ total_product_amount = sum(line.get('price_subtotal', 0) if isinstance(line, dict)
+ else line.price_subtotal for line in product_lines)
if total_product_amount == 0:
total_product_amount = 1 # Avoid division by zero
- # Calculate total discount amount
total_discount_amount = abs(sum(line.price_subtotal for line in discount_lines))
# Tambahkan elemen ListOfGoodService
list_of_good_service = ET.SubElement(tax_invoice, 'ListOfGoodService')
for line in product_lines:
+ # Handle both dict (converted sale lines) and normal invoice lines
+ if isinstance(line, dict):
+ line_price_subtotal = line['price_subtotal']
+ line_quantity = line['quantity']
+ line_name = line['name']
+ line_price_unit = line['price_unit']
+ else:
+ line_price_subtotal = line.price_subtotal
+ line_quantity = line.quantity
+ line_name = line.name
+ line_price_unit = line.price_unit
+
# Calculate prorated discount
- line_proportion = line.price_subtotal / total_product_amount
+ line_proportion = line_price_subtotal / total_product_amount
line_discount = total_discount_amount * line_proportion
- # unit_price = line.price_unit
- subtotal = line.price_subtotal
- quantity = line.quantity
+ subtotal = line_price_subtotal
+ quantity = line_quantity
total_discount = round(line_discount, 2)
# Calculate other tax values
@@ -118,13 +152,12 @@ class CoretaxFaktur(models.Model):
good_service = ET.SubElement(list_of_good_service, 'GoodService')
ET.SubElement(good_service, 'Opt').text = 'A'
ET.SubElement(good_service, 'Code').text = '000000'
- ET.SubElement(good_service, 'Name').text = line.name
+ ET.SubElement(good_service, 'Name').text = line_name
ET.SubElement(good_service, 'Unit').text = 'UM.0018'
- ET.SubElement(good_service, 'Price').text = str(round(subtotal / quantity, 2)) if subtotal else '0'
+ ET.SubElement(good_service, 'Price').text = str(round(line_price_unit, 2)) if line_price_unit else '0'
ET.SubElement(good_service, 'Qty').text = str(quantity)
ET.SubElement(good_service, 'TotalDiscount').text = str(total_discount)
- ET.SubElement(good_service, 'TaxBase').text = str(
- round(subtotal)) if subtotal else '0'
+ ET.SubElement(good_service, 'TaxBase').text = str(round(subtotal)) if subtotal else '0'
ET.SubElement(good_service, 'OtherTaxBase').text = str(otherTaxBase)
ET.SubElement(good_service, 'VATRate').text = '12'
ET.SubElement(good_service, 'VAT').text = str(vat_amount)
@@ -136,9 +169,9 @@ class CoretaxFaktur(models.Model):
xml_pretty = minidom.parseString(xml_str).toprettyxml(indent=" ")
return xml_pretty
- def export_to_download(self, invoices):
+ def export_to_download(self, invoices, down_payments):
# Generate XML content
- xml_content = self.generate_xml(invoices)
+ xml_content = self.generate_xml(invoices, down_payments)
# Encode content to Base64
xml_encoded = base64.b64encode(xml_content.encode('utf-8'))
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 9986b9c0..d439c7a8 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -164,6 +164,22 @@ class ResPartner(models.Model):
"Set its value to 0.00 to disable "
"this feature", tracking=3)
telegram_id = fields.Char(string="Telegram")
+ avg_aging= fields.Float(string='Average Aging')
+ payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3)
+ payment_history_url = fields.Text(string='Payment History URL')
+
+ # @api.depends('parent_id.payment_difficulty')
+ # def _compute_payment_difficulty(self):
+ # for partner in self:
+ # if partner.parent_id:
+ # partner.payment_difficulty = partner.parent_id.payment_difficulty
+
+ # def _inverse_payment_difficulty(self):
+ # for partner in self:
+ # if not partner.parent_id:
+ # partner.child_ids.write({
+ # 'payment_difficulty': partner.payment_difficulty
+ # })
@api.model
def _default_payment_term(self):
@@ -192,6 +208,10 @@ class ResPartner(models.Model):
for rec in self:
if 'latitude' in vals or 'longtitude' in vals:
rec._update_address_from_coords()
+
+ # Sinkronisasi payment_difficulty ke semua anak jika partner ini adalah parent
+ if not rec.parent_id and 'payment_difficulty' in vals:
+ rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']})
#
# # if 'property_payment_term_id' in vals:
# # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26:
@@ -210,6 +230,8 @@ class ResPartner(models.Model):
for rec in records:
if vals.get('latitude') and vals.get('longtitude'):
rec._update_address_from_coords()
+ if rec.parent_id and not vals.get('payment_difficulty'):
+ rec.payment_difficulty = rec.parent_id.payment_difficulty
return records
@api.constrains('name')
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index c8d4a712..85228901 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -382,13 +382,13 @@ class SaleOrder(models.Model):
# Simpan ke field sebagai UTC-naive datetime (standar Odoo)
order.et_products = eta_datetime.astimezone(pytz.utc).replace(tzinfo=None)
- @api.depends('picking_ids.state', 'picking_ids.date_reserved')
+ @api.depends('picking_ids.state', 'picking_ids.date_done')
def _compute_eta_date_reserved(self):
for order in self:
pickings = order.picking_ids.filtered(
- lambda p: p.state == 'assigned' and p.date_reserved and 'BU/PICK/' in (p.name or '')
+ lambda p: p.state in ('assigned', 'done') and p.date_reserved and 'BU/PICK/' in (p.name or '')
)
- order.eta_date_reserved = min(pickings.mapped('date_reserved')) if pickings else False
+ order.eta_date_reserved = min(pickings.mapped('date_done')) if pickings else False
@api.onchange('shipping_cost_covered')
def _onchange_shipping_cost_covered(self):
@@ -1592,6 +1592,7 @@ class SaleOrder(models.Model):
'campaign_id': self.campaign_id.id,
'medium_id': self.medium_id.id,
'source_id': self.source_id.id,
+ 'down_payment': 229625 in [line.product_id.id for line in self.order_line],
'user_id': self.user_id.id,
'sale_id': self.id,
'invoice_user_id': self.user_id.id,
diff --git a/indoteknik_custom/views/account_move.xml b/indoteknik_custom/views/account_move.xml
index 0fc62293..e8061862 100644
--- a/indoteknik_custom/views/account_move.xml
+++ b/indoteknik_custom/views/account_move.xml
@@ -60,6 +60,7 @@
<field name="due_extension"/>
<field name="counter"/>
<field name="nomor_kwitansi"/>
+ <field name="down_payment"/>
</field>
<field name="to_check" position="after">
<field name="already_paid"/>
diff --git a/indoteknik_custom/views/customer_commision.xml b/indoteknik_custom/views/customer_commision.xml
index 4be0840f..d5fb1d70 100644
--- a/indoteknik_custom/views/customer_commision.xml
+++ b/indoteknik_custom/views/customer_commision.xml
@@ -70,7 +70,7 @@
statusbar_visible="draft,pengajuan1,pengajuan2,pengajuan3,pengajuan4,approved"
statusbar_colors='{"reject":"red"}'/>
</header>
- <sheet string="Customer Commision">
+ <sheet string="Customer Benefits">
<div class="oe_button_box" name="button_box"/>
<group>
<group>
@@ -173,7 +173,7 @@
</record>
<record id="customer_commision_action" model="ir.actions.act_window">
- <field name="name">Customer Commision</field>
+ <field name="name">Customer Benefits</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">customer.commision</field>
<field name="search_view_id" ref="view_customer_commision_filter"/>
@@ -181,14 +181,14 @@
</record>
<menuitem id="menu_customer_commision_acct"
- name="Customer Commision"
+ name="Customer Benefits"
action="customer_commision_action"
parent="account.menu_finance_entries"
sequence="113"
/>
<menuitem id="menu_customer_commision_sales"
- name="Customer Commision"
+ name="Customer Benefits"
action="customer_commision_action"
parent="sale.product_menu_catalog"
sequence="101"
diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml
index bfee0fd4..4bb114eb 100644
--- a/indoteknik_custom/views/ir_sequence.xml
+++ b/indoteknik_custom/views/ir_sequence.xml
@@ -131,7 +131,7 @@
<field name="number_increment">1</field>
</record>
- <record id="sequence_commision_customer" model="ir.sequence">
+ <!-- <record id="sequence_commision_customer" model="ir.sequence">
<field name="name">Customer Commision</field>
<field name="code">customer.commision</field>
<field name="active">TRUE</field>
@@ -139,6 +139,36 @@
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
+ </record> -->
+
+ <record id="sequence_commision_cashback" model="ir.sequence">
+ <field name="name">Customer Commision Cashback</field>
+ <field name="code">customer.commision.cashback</field>
+ <field name="prefix">CB/%(year)s/</field>
+ <field name="padding">5</field>
+ <field name="number_next">1</field>
+ <field name="number_increment">1</field>
+ <field name="active">True</field>
+ </record>
+
+ <record id="sequence_commision_fee" model="ir.sequence">
+ <field name="name">Customer Commision Fee</field>
+ <field name="code">customer.commision.fee</field>
+ <field name="prefix">FE/%(year)s/</field>
+ <field name="padding">5</field>
+ <field name="number_next">1</field>
+ <field name="number_increment">1</field>
+ <field name="active">True</field>
+ </record>
+
+ <record id="sequence_commision_rebate" model="ir.sequence">
+ <field name="name">Customer Commision Rebate</field>
+ <field name="code">customer.commision.rebate</field>
+ <field name="prefix">RB/%(year)s/</field>
+ <field name="padding">5</field>
+ <field name="number_next">1</field>
+ <field name="number_increment">1</field>
+ <field name="active">True</field>
</record>
<record id="sequence_automatic_purchase" model="ir.sequence">
diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml
index 30b5ca36..6115587b 100644
--- a/indoteknik_custom/views/res_partner.xml
+++ b/indoteknik_custom/views/res_partner.xml
@@ -181,6 +181,11 @@
<field name="dokumen_pengiriman_input"/>
<field name="dokumen_invoice"/>
</group>
+ <group string="Aging Info">
+ <field name="avg_aging" readonly="1"/>
+ <field name="payment_difficulty" attrs="{'readonly': [('parent_id', '!=', False)]}" />
+ <field name="payment_history_url" readonly="1" />
+ </group>
</group>
<!-- Supplier Lines Section -->