summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-06-17 08:09:57 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-06-17 08:09:57 +0700
commitabd7da741c6eec02dbefa195b91dbedd70b3323e (patch)
treee6abb2af2a8b685f0a509cd87a28ebb76b7a5cbe
parenta0e90200638e26ad06d1caaf2d91d0aeea3ba19d (diff)
<miqdad> add tukar guling PO and move from inventory
-rw-r--r--indoteknik_custom/models/tukar_guling.py56
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv1
-rw-r--r--indoteknik_custom/views/tukar_guling_po.xml6
3 files changed, 52 insertions, 11 deletions
diff --git a/indoteknik_custom/models/tukar_guling.py b/indoteknik_custom/models/tukar_guling.py
index 95aa7cd6..aeb2c9e7 100644
--- a/indoteknik_custom/models/tukar_guling.py
+++ b/indoteknik_custom/models/tukar_guling.py
@@ -142,12 +142,25 @@ class TukarGuling(models.Model):
class TukarGulingPO(models.Model):
_name = 'tukar.guling.po'
- _inherit = 'tukar.guling'
_description = 'Tukar Guling PO'
- # tukar_guling_id = fields.Many2one(
- # 'tukar.guling', required=True, ondelete='cascade', string='Tukar Guling Ref'
- # )
+ name = fields.Char('Number', required=True, copy=False, readonly=True, default='New')
+ date = fields.Datetime('Date', default=fields.Datetime.now, required=True)
+ out_num = fields.Many2one('stock.picking', 'Nomor BU/Out',
+ domain=[('picking_type_id.code', '=', 'outgoing')])
+ ba_num = fields.Text('Nomor BA')
+ notes = fields.Text('Notes')
+ state = fields.Selection(string='Status', selection=[
+ ('draft', 'Draft'),
+ ('approval_purchase', ' Approval Purchase'),
+ ('approval_logistic', 'Approval Logistic'),
+ ('approval_finance', 'Approval Finance'),
+ ('done', 'Done'),
+ ('cancel', 'Canceled')
+ ], default='draft', tracking=True, required=True)
+
+ line_ids = fields.One2many('tukar.guling.line.po', 'tukar_guling_po_id', string='Product Lines')
+ tukar_guling_po_id = fields.Many2one('tukar.guling.po', 'Tukar Guling PO')
return_type = fields.Selection([
('tukar_guling', 'Tukar Guling'),
@@ -165,7 +178,7 @@ class TukarGulingPO(models.Model):
def _check_product_lines(self):
"""Constraint: Product lines harus ada jika state bukan draft"""
for record in self:
- if record.state in ('approval_sales', 'approval_logistic', 'approval_finance', 'done') and not record.line_ids:
+ if record.state in ('approval_purchase', 'approval_logistic', 'approval_finance', 'done') and not record.line_ids:
raise ValidationError("Product lines harus diisi sebelum submit atau approve!")
def _validate_product_lines(self):
@@ -223,7 +236,7 @@ class TukarGulingPO(models.Model):
if self.state != 'draft':
raise UserError("Submit hanya bisa dilakukan dari Draft.")
- self.state = 'approval_sales'
+ self.state = 'approval_purchase'
def action_approve(self):
self.ensure_one()
@@ -234,12 +247,21 @@ class TukarGulingPO(models.Model):
if not self.return_type:
raise UserError("Return Type harus diisi!")
- if self.state == 'approval_sales':
+ if self.state == 'approval_purchase':
+ if not self.env.user.has_group('indoteknik_custom.group_role_purchasing'):
+ raise UserError("Hanya Purchasing yang boleh approve tahap ini.")
self.state = 'approval_logistic'
+
elif self.state == 'approval_logistic':
+ if not self.env.user.has_group('indoteknik_custom.group_role_logistic'):
+ raise UserError("Hanya Logistic Manager yang boleh approve tahap ini.")
self.state = 'approval_finance'
+
elif self.state == 'approval_finance':
+ if not self.env.user.has_group('indoteknik_custom.group_role_fat'):
+ raise UserError("Hanya Finance Manager yang boleh approve tahap ini.")
self.state = 'done'
+
else:
raise UserError("Status ini tidak bisa di-approve.")
@@ -281,4 +303,22 @@ class TukarGulingLine(models.Model):
def _onchange_product_id(self):
if self.product_id:
self.name = self.product_id.display_name
- self.product_uom = self.product_id.uom_id \ No newline at end of file
+ self.product_uom = self.product_id.uom_id
+
+class TukarGulingLinePO(models.Model):
+ _name = 'tukar.guling.line.po'
+ _description = 'Tukar Guling Line (PO)'
+ _order = 'sequence, id'
+
+ tukar_guling_po_id = fields.Many2one('tukar.guling.po', string='Tukar Guling PO', required=True, ondelete='cascade')
+ sequence = fields.Integer('Sequence', default=10, copy=False)
+ product_id = fields.Many2one('product.product', string='Product', required=True)
+ product_uom_qty = fields.Float('Quantity', digits='Product Unit of Measure', required=True, default=1.0)
+ product_uom = fields.Many2one('uom.uom', string='Unit of Measure')
+ name = fields.Text('Description')
+
+ @api.onchange('product_id')
+ def _onchange_product_id(self):
+ if self.product_id:
+ self.name = self.product_id.display_name
+ self.product_uom = self.product_id.uom_id
diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv
index f8fb6ac6..45ce23dd 100755
--- a/indoteknik_custom/security/ir.model.access.csv
+++ b/indoteknik_custom/security/ir.model.access.csv
@@ -184,3 +184,4 @@ access_v_sale_notin_matchpo,access.v.sale.notin.matchpo,model_v_sale_notin_match
access_tukar_guling_all_users,tukar.guling.all.users,model_tukar_guling,base.group_user,1,1,1,1
access_tukar_guling_po_all_users,tukar.guling.po.all.users,model_tukar_guling_po,base.group_user,1,1,1,1
access_tukar_guling_line_all_users,tukar.guling.line.all.users,model_tukar_guling_line,base.group_user,1,1,1,1
+access_tukar_guling_line_po_all_users,tukar.guling.line.po.all.users,model_tukar_guling_line_po,base.group_user,1,1,1,1
diff --git a/indoteknik_custom/views/tukar_guling_po.xml b/indoteknik_custom/views/tukar_guling_po.xml
index 840b625b..3ad269ee 100644
--- a/indoteknik_custom/views/tukar_guling_po.xml
+++ b/indoteknik_custom/views/tukar_guling_po.xml
@@ -40,7 +40,7 @@
<field name="ba_num" string="Nomor BA"/>
<field name="return_type" string="Return Type"/>
<field name="state" widget="badge"
- decoration-info="state in ('draft', 'approval_sales', 'approval_logistic','approval_finance')"
+ decoration-info="state in ('draft', 'approval_purchase', 'approval_logistic','approval_finance')"
decoration-success="state == 'done'"
decoration-muted="state == 'cancel'"
/>
@@ -60,7 +60,7 @@
attrs="{'invisible': [('state', '!=', 'draft')]}"/>
<button name="action_approve" string="Approve" type="object"
class="btn-primary"
- attrs="{'invisible': [('state', 'not in', ['approval_sales', 'approval_logistic', 'approval_finance'])]}"/>
+ attrs="{'invisible': [('state', 'not in', ['approval_purchase', 'approval_logistic', 'approval_finance'])]}"/>
<button name="action_cancel" string="Cancel" type="object"
class="btn-secondary"
attrs="{'invisible': [('state', '=', 'draft')]}"
@@ -70,7 +70,7 @@
attrs="{'invisible': [('state', '!=', 'cancel')]}"
confirm="Are you sure you want to reset this record to draft?"/>
<field name="state" widget="statusbar" readonly="1"
- statusbar_visible="draft,approval_sales,approval_logistic,approval_finance,done"/>
+ statusbar_visible="draft,approval_purchase,approval_logistic,approval_finance,done"/>
</header>
<sheet>
<div class="oe_title">