diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2025-09-12 15:29:28 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2025-09-12 15:29:28 +0700 |
| commit | 71882195d32ac190ea2225ab61fec7a796e30c70 (patch) | |
| tree | 80619c4e9e513da0463a165e7dcbc35c8ebab6df | |
| parent | 123e2bc2b83ffee06e28c804cb49c4a6b4c9b313 (diff) | |
remove required npwp sppkp nib and fix purchase report
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 105 | ||||
| -rw-r--r-- | indoteknik_custom/models/sale_order_line.py | 6 | ||||
| -rw-r--r-- | indoteknik_custom/report/purchase_report.xml | 103 | ||||
| -rw-r--r-- | indoteknik_custom/views/res_partner.xml | 10 | ||||
| -rwxr-xr-x | indoteknik_custom/views/sale_order.xml | 6 |
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"/> |
