summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-09-12 15:29:28 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-09-12 15:29:28 +0700
commit71882195d32ac190ea2225ab61fec7a796e30c70 (patch)
tree80619c4e9e513da0463a165e7dcbc35c8ebab6df
parent123e2bc2b83ffee06e28c804cb49c4a6b4c9b313 (diff)
remove required npwp sppkp nib and fix purchase report
-rwxr-xr-xindoteknik_custom/models/sale_order.py105
-rw-r--r--indoteknik_custom/models/sale_order_line.py6
-rw-r--r--indoteknik_custom/report/purchase_report.xml103
-rw-r--r--indoteknik_custom/views/res_partner.xml10
-rwxr-xr-xindoteknik_custom/views/sale_order.xml6
5 files changed, 81 insertions, 149 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 76d4d7e7..c767dd04 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -234,9 +234,9 @@ class SaleOrder(models.Model):
customer_type = fields.Selection([
('pkp', 'PKP'),
('nonpkp', 'Non PKP')
- ], required=True, compute='_compute_partner_field')
- sppkp = fields.Char(string="SPPKP", required=True, tracking=True, compute='_compute_partner_field')
- npwp = fields.Char(string="NPWP", required=True, tracking=True, compute='_compute_partner_field')
+ ], related="partner_id.customer_type", string="Customer Type", readonly=True)
+ sppkp = fields.Char(string="SPPKP", related="partner_id.sppkp")
+ npwp = fields.Char(string="NPWP", related="partner_id.npwp")
purchase_total = fields.Monetary(string='Purchase Total', compute='_compute_purchase_total')
voucher_id = fields.Many2one(comodel_name='voucher', string='Voucher', copy=False)
applied_voucher_id = fields.Many2one(comodel_name='voucher', string='Applied Voucher', copy=False)
@@ -2049,22 +2049,22 @@ class SaleOrder(models.Model):
# return [('id', 'not in', order_ids)]
# return ['&', ('order_line.invoice_lines.move_id.move_type', 'in', ('out_invoice', 'out_refund')), ('order_line.invoice_lines.move_id', operator, value)]
- @api.depends('partner_id')
- def _compute_partner_field(self):
- for order in self:
- partner = order.partner_id.parent_id or order.partner_id
- order.npwp = partner.npwp
- order.sppkp = partner.sppkp
- order.customer_type = partner.customer_type
+ # @api.depends('partner_id')
+ # def _compute_partner_field(self):
+ # for order in self:
+ # partner = order.partner_id.parent_id or order.partner_id
+ # order.npwp = partner.npwp
+ # order.sppkp = partner.sppkp
+ # order.customer_type = partner.customer_type
@api.onchange('partner_id')
def onchange_partner_contact(self):
parent_id = self.partner_id.parent_id
parent_id = parent_id if parent_id else self.partner_id
- self.npwp = parent_id.npwp
- self.sppkp = parent_id.sppkp
- self.customer_type = parent_id.customer_type
+ # self.npwp = parent_id.npwp
+ # self.sppkp = parent_id.sppkp
+ # self.customer_type = parent_id.customer_type
self.email = parent_id.email
self.pareto_status = parent_id.pareto_status
self.user_id = parent_id.user_id
@@ -2141,9 +2141,15 @@ class SaleOrder(models.Model):
if self.state not in ['draft', 'sent']:
raise UserError("Status harus draft atau sent")
- self._validate_npwp()
-
def _validate_npwp(self):
+ if not self.npwp:
+ raise UserError("NPWP partner kosong, silahkan isi terlebih dahulu npwp nya di contact partner")
+
+ if not self.customer_type:
+ raise UserError("Customer Type partner kosong, silahkan isi terlebih dahulu Customer Type nya di contact partner")
+
+ if not self.sppkp:
+ raise UserError("SPPKP partner kosong, silahkan isi terlebih dahulu SPPKP nya di contact partner")
num_digits = sum(c.isdigit() for c in self.npwp)
if num_digits < 10:
@@ -2157,6 +2163,7 @@ class SaleOrder(models.Model):
self._validate_order()
for order in self:
+ order._validate_npwp()
order._validate_uniform_taxes()
order.order_line.validate_line()
@@ -2211,9 +2218,8 @@ class SaleOrder(models.Model):
if self.validate_different_vendor() and not self.vendor_approval:
return self._create_notification_action('Notification', 'Terdapat Vendor yang berbeda dengan MD Vendor')
self.check_due()
-
- self._validate_order()
for order in self:
+ order._validate_npwp()
order._validate_delivery_amt()
order._validate_uniform_taxes()
order.order_line.validate_line()
@@ -2480,6 +2486,7 @@ class SaleOrder(models.Model):
order.check_data_real_delivery_address()
order.sale_order_check_approve()
order._validate_order()
+ order._validate_npwp()
order.order_line.validate_line()
main_parent = order.partner_id.get_main_parent()
@@ -2665,23 +2672,17 @@ class SaleOrder(models.Model):
def _set_sppkp_npwp_contact(self):
partner = self.partner_id.parent_id or self.partner_id
- if not partner.sppkp:
- partner.sppkp = self.sppkp
- if not partner.npwp:
- partner.npwp = self.npwp
+ # if not partner.sppkp:
+ # partner.sppkp = self.sppkp
+ # if not partner.npwp:
+ # partner.npwp = self.npwp
if not partner.email:
partner.email = self.email
- if not partner.customer_type:
- partner.customer_type = self.customer_type
+ # if not partner.customer_type:
+ # partner.customer_type = self.customer_type
if not partner.user_id:
partner.user_id = self.user_id.id
- # if not partner.sppkp or not partner.npwp or not partner.email or partner.customer_type:
- # partner.customer_type = self.customer_type
- # partner.npwp = self.npwp
- # partner.sppkp = self.sppkp
- # partner.email = self.email
-
def _compute_total_margin(self):
for order in self:
total_margin = sum(line.item_margin for line in order.order_line if line.product_id)
@@ -3123,52 +3124,6 @@ class SaleOrder(models.Model):
# order._update_partner_details()
return order
- # def write(self, vals):
- # Call the super method to handle the write operation
- # res = super(SaleOrder, self).write(vals)
- # self._compute_etrts_date()
- # Check if the update is coming from a save operation
- # if any(field in vals for field in ['sppkp', 'npwp', 'email', 'customer_type']):
- # self._update_partner_details()
-
- # return res
-
- def _update_partner_details(self):
- for order in self:
- partner = order.partner_id.parent_id or order.partner_id
- if partner:
- # Update partner details
- partner.sppkp = order.sppkp
- partner.npwp = order.npwp
- partner.email = order.email
- partner.customer_type = order.customer_type
-
- # Save changes to the partner record
- partner.write({
- 'sppkp': partner.sppkp,
- 'npwp': partner.npwp,
- 'email': partner.email,
- 'customer_type': partner.customer_type,
- })
-
- # def write(self, vals):
- # for order in self:
- # if order.state in ['sale', 'cancel']:
- # if 'order_line' in vals:
- # new_lines = vals.get('order_line', [])
- # for command in new_lines:
- # if command[0] == 0: # A new line is being added
- # raise UserError(
- # "SO tidak dapat ditambahkan produk baru karena SO sudah menjadi sale order.")
- #
- # res = super(SaleOrder, self).write(vals)
- # # self._check_total_margin_excl_third_party()
- # if any(fields in vals for fields in ['delivery_amt', 'carrier_id', 'shipping_cost_covered']):
- # self._validate_delivery_amt()
- # if any(field in vals for field in ["order_line", "client_order_ref"]):
- # self._calculate_etrts_date()
- # return res
-
# @api.depends('commitment_date')
def _compute_ready_to_ship_status_detail(self):
def is_empty(val):
diff --git a/indoteknik_custom/models/sale_order_line.py b/indoteknik_custom/models/sale_order_line.py
index 47a24264..1f2ea1fb 100644
--- a/indoteknik_custom/models/sale_order_line.py
+++ b/indoteknik_custom/models/sale_order_line.py
@@ -71,23 +71,17 @@ class SaleOrderLine(models.Model):
if order_qty > 0:
for move in line.move_ids:
- # --- CASE 1: Move belum selesai ---
if move.state not in ('done', 'cancel'):
reserved_qty += move.reserved_availability or 0.0
continue
- # --- CASE 2: Move sudah done ---
if move.location_dest_id.usage == 'customer':
- # Barang dikirim ke customer
delivered_qty += move.quantity_done or 0.0
elif move.location_id.usage == 'customer':
- # Barang balik dari customer (retur)
delivered_qty -= move.quantity_done or 0.0
- # Clamp supaya delivered gak minus
delivered_qty = max(delivered_qty, 0)
- # Hitung persen
line.reserved_percent = min((reserved_qty / order_qty) * 100, 100) if order_qty else 0
line.delivered_percent = min((delivered_qty / order_qty) * 100, 100) if order_qty else 0
line.unreserved_percent = max(100 - line.reserved_percent - line.delivered_percent, 0)
diff --git a/indoteknik_custom/report/purchase_report.xml b/indoteknik_custom/report/purchase_report.xml
index 9d7f4028..040db3dd 100644
--- a/indoteknik_custom/report/purchase_report.xml
+++ b/indoteknik_custom/report/purchase_report.xml
@@ -26,8 +26,8 @@
</template>
<!-- Document Template -->
-<template id="report_purchaseorder_website_document">
- <t t-call="web.external_layout">
+ <template id="report_purchaseorder_website_document">
+ <t t-call="web.html_container">
<t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)" />
<div class="page">
@@ -41,80 +41,68 @@
<h2 class="text-center mb4" style="color:#d32f2f; font-weight:bold;">
PURCHASE ORDER
</h2>
- <h4 class="text-center mb32">
+ <h4 class="text-center mb24">
No. <span t-field="doc.name"/>
</h4>
- <!-- Top Info sejajar -->
- <div class="row mb16" style="font-size:12px;">
- <div class="col-4">
- <strong>Term Of Payment:</strong>
- <span t-field="doc.payment_term_id.name"/>
- </div>
- <div class="col-4">
- <strong>Order Date:</strong>
- <span t-field="doc.date_order" t-options='{"widget": "date"}'/>
- </div>
- <div class="col-4">
- <strong>Responsible:</strong>
- <span t-field="doc.user_id"/>
- </div>
+ <!-- Info Row -->
+ <div class="row mb16">
+ <div class="col-4"><strong>Term Of Payment:</strong> <span t-field="doc.payment_term_id.name"/></div>
+ <div class="col-4"><strong>Order Date:</strong> <span t-field="doc.date_order" t-options='{"widget": "date"}'/></div>
+ <div class="col-4"><strong>Responsible:</strong> <span t-field="doc.user_id"/></div>
</div>
- <!-- Vendor & Shipping Info sejajar -->
- <div class="row mb32" style="font-size:12px;">
- <div class="col-6" style="border:1px solid #ccc; padding:8px;">
+ <!-- Vendor & Delivery Row (Side by Side) -->
+ <div class="row mb24">
+ <div class="col-6" style="border:1px solid #ccc; padding:8px; margin-right:4px;">
<strong>Alamat Pengiriman:</strong><br/>
PT Indoteknik (Bandengan 1 Depan)<br/>
Jl. Bandengan Utara Komp A 8 B<br/>
RT. Penjaringan, Kec. Penjaringan, Jakarta (BELAKANG INDOMARET)<br/>
- JK 14440<br/>
- Indonesia
+ JK 14440 - Indonesia
</div>
- <div class="col-6" style="border:1px solid #ccc; padding:8px;">
+ <div class="col-6" style="border:1px solid #ccc; padding:8px; margin-left:4px;">
<strong>Nama Vendor:</strong><br/>
- <div t-field="doc.partner_id"
- t-options='{"widget": "contact", "fields": ["address", "name", "phone"],
- "no_marker": True, "phone_icons": True}'/>
+ <span t-field="doc.partner_id.name"/><br/>
+ <span t-field="doc.partner_id.street"/><br/>
+ <span t-field="doc.partner_id.city"/> - <span t-field="doc.partner_id.zip"/>
</div>
</div>
- <!-- Order Lines -->
- <table class="table table-sm o_main_table" style="font-size:11px; border:1px solid #000; border-collapse: collapse; width:100%;">
- <thead style="display: table-row-group; background:#f5f5f5;">
- <tr>
- <th style="border:1px solid #000; padding:4px;">Description</th>
- <th class="text-right" style="border:1px solid #000; padding:4px;">Quantity</th>
- <th class="text-right" style="border:1px solid #000; padding:4px;">Unit Price</th>
- <th class="text-right" style="border:1px solid #000; padding:4px;">Taxes</th>
- <th class="text-right" style="border:1px solid #000; padding:4px;">Subtotal</th>
+ <!-- Order Lines Table -->
+ <table class="table table-sm o_main_table" style="border-collapse: collapse; width: 100%; margin-top: 12px;">
+ <thead>
+ <tr style="background:#f2f2f2;">
+ <th style="border:1px solid #ccc;">Description</th>
+ <th style="border:1px solid #ccc;" class="text-right">Quantity</th>
+ <th style="border:1px solid #ccc;" class="text-right">Unit Price</th>
+ <th style="border:1px solid #ccc;" class="text-right">Taxes</th>
+ <th style="border:1px solid #ccc;" class="text-right">Subtotal</th>
</tr>
</thead>
<tbody>
<t t-foreach="doc.order_line" t-as="line">
- <!-- Main row -->
<tr>
- <td style="border:1px solid #000; padding:4px;">
+ <td style="border:1px solid #ccc;">
<span t-field="line.name"/>
</td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
- <span t-field="line.product_qty"/>
- <span t-field="line.product_uom"/>
+ <td style="border:1px solid #ccc;" class="text-right">
+ <span t-field="line.product_qty"/> <span t-field="line.product_uom"/>
</td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
+ <td style="border:1px solid #ccc;" class="text-right">
<span t-field="line.price_unit"/>
</td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
+ <td style="border:1px solid #ccc;" class="text-right">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.taxes_id))"/>
</td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
+ <td style="border:1px solid #ccc;" class="text-right">
<span t-field="line.price_subtotal"/>
</td>
</tr>
- <!-- Website Description row -->
<t t-if="line.product_id.website_description">
<tr>
- <td colspan="5" style="border:1px solid #000; padding:6px; font-size:10px; color:#555;">
+ <!-- Website Description tanpa border, tapi diberi padding agar rapih -->
+ <td colspan="5" style="padding:6px 12px; font-size:10px; background:#fafafa;">
<div t-raw="line.product_id.website_description"/>
</td>
</tr>
@@ -124,27 +112,21 @@
</table>
<!-- Totals -->
- <div class="clearfix">
+ <div class="clearfix mt16">
<div class="row">
<div class="col-4 ml-auto">
- <table class="table table-sm" style="border:1px solid #000; border-collapse: collapse; width:100%;">
+ <table class="table table-sm">
<tr>
- <td style="border:1px solid #000; padding:4px;"><strong>Subtotal</strong></td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
- <span t-field="doc.amount_untaxed"/>
- </td>
+ <td><strong>Subtotal</strong></td>
+ <td class="text-right"><span t-field="doc.amount_untaxed"/></td>
</tr>
<tr>
- <td style="border:1px solid #000; padding:4px;">Taxes</td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
- <span t-field="doc.amount_tax"/>
- </td>
+ <td>Taxes</td>
+ <td class="text-right"><span t-field="doc.amount_tax"/></td>
</tr>
<tr class="o_total">
- <td style="border:1px solid #000; padding:4px;"><strong>Total</strong></td>
- <td class="text-right" style="border:1px solid #000; padding:4px;">
- <span t-field="doc.amount_total"/>
- </td>
+ <td><strong>Total</strong></td>
+ <td class="text-right"><span t-field="doc.amount_total"/></td>
</tr>
</table>
</div>
@@ -152,11 +134,12 @@
</div>
<!-- Notes -->
- <div class="mt32" style="font-size:11px;">
+ <div class="mt32">
<p t-field="doc.notes"/>
</div>
</div>
</t>
</template>
+
</odoo>
diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml
index 7d5be3b7..c32151d8 100644
--- a/indoteknik_custom/views/res_partner.xml
+++ b/indoteknik_custom/views/res_partner.xml
@@ -36,9 +36,9 @@
<field name="pareto_status"/>
<field name="digital_invoice_tax"/>
</field>
- <field name="nama_wajib_pajak" position="attributes">
+ <!-- <field name="nama_wajib_pajak" position="attributes">
<attribute name="required">1</attribute>
- </field>
+ </field> -->
<field name="kota_id" position="attributes">
<attribute name="required">0</attribute>
</field>
@@ -48,14 +48,14 @@
<field name="kelurahan_id" position="attributes">
<attribute name="required">0</attribute>
</field>
- <field name="npwp" position="attributes">
+ <!-- <field name="npwp" position="attributes">
<attribute name="required">1</attribute>
</field>
<field name="alamat_lengkap_text" position="attributes">
<attribute name="required">1</attribute>
- </field>
+ </field> -->
<field name="npwp" position="before">
- <field name="customer_type" required="1"/>
+ <field name="customer_type"/>
</field>
<field name="alamat_lengkap_text" position="after">
<field name="nitku" />
diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml
index 326fd560..44da3e13 100755
--- a/indoteknik_custom/views/sale_order.xml
+++ b/indoteknik_custom/views/sale_order.xml
@@ -148,9 +148,9 @@
<field name="pareto_status"/>
</field>
<field name="analytic_account_id" position="after">
- <field name="customer_type" readonly="1"/>
- <field name="npwp" placeholder='99.999.999.9-999.999' readonly="1"/>
- <field name="sppkp" attrs="{'required': [('customer_type', '=', 'pkp')]}" readonly="1"/>
+ <field name="customer_type"/>
+ <field name="npwp" placeholder='99.999.999.9-999.999'/>
+ <field name="sppkp" attrs="{'required': [('customer_type', '=', 'pkp')]}"/>
<field name="email" required="1"/>
<field name="unreserve_id"/>
<field name="due_id" readonly="1"/>