summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-07-22 16:42:10 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-07-22 16:42:10 +0700
commit1de8ad79dd0f0832dd14de9c1d004884f153bec4 (patch)
treecfba46f7d80b67243b4cee52101356944e1dd382
parent69f0fbf98183ea00bb069df3ecd40e91df7081c3 (diff)
<miqdad> Chatter and sequence
-rw-r--r--indoteknik_custom/models/tukar_guling.py40
-rw-r--r--indoteknik_custom/views/ir_sequence.xml6
-rw-r--r--indoteknik_custom/views/tukar_guling.xml17
3 files changed, 48 insertions, 15 deletions
diff --git a/indoteknik_custom/models/tukar_guling.py b/indoteknik_custom/models/tukar_guling.py
index e546ad9c..f27446d0 100644
--- a/indoteknik_custom/models/tukar_guling.py
+++ b/indoteknik_custom/models/tukar_guling.py
@@ -1,15 +1,25 @@
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
import logging
+from datetime import datetime
_logger = logging.getLogger(__name__)
+#TODO
+# 1. tracking status dokumen BU [X]
+# 2. ganti nama dokumen
+# 3. Tracking ketika create dokumen [X]
+# 4. Tracking ketika ganti field operations, date approval (sales, finance, logistic) [X]
+# 5. Ganti proses approval ke Sales, Finance, Logistic [X]
+# 6. Make sure bu pick dan out tidak bisa diedit ketika ort dan srt blm done
+# 7. change approval
class TukarGuling(models.Model):
_name = 'tukar.guling'
_description = 'Tukar Guling'
_order = 'date desc, id desc'
_rec_name = 'name'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
origin = fields.Char(string='Origin SO')
if_so = fields.Boolean('Is SO', default=True)
@@ -38,24 +48,28 @@ class TukarGuling(models.Model):
('state', '=', 'done'),
('linked_manual_bu_out', '!=', 'done'),
],
- help='Nomor BU/OUT atau BU/PICK'
+ help='Nomor BU/OUT atau BU/PICK', tracking=3,
+ required=True
)
ba_num = fields.Text('Nomor BA')
notes = fields.Text('Notes')
return_type = fields.Selection(String='Return Type', selection=[
('tukar_guling', 'Tukar Guling'), # -> barang yang sama
- ('revisi_so', 'Revisi SO')], required=True)
+ ('revisi_so', 'Revisi SO')], required=True, tracking=3)
state = fields.Selection(string='Status', selection=[
('draft', 'Draft'),
('approval_sales', ' Approval Sales'),
- ('approval_logistic', 'Approval Logistic'),
('approval_finance', 'Approval Finance'),
+ ('approval_logistic', 'Approval Logistic'),
('done', 'Done'),
('cancel', 'Canceled')
], default='draft', tracking=True, required=True)
line_ids = fields.One2many('tukar.guling.line', 'tukar_guling_id', string='Product Lines')
mapping_koli_ids = fields.One2many('tukar.guling.mapping.koli', 'tukar_guling_id', string='Mapping Koli')
+ date_done = fields.Datetime('Approved Date Finance', tracking=3, readonly=True)
+ date_sales = fields.Datetime('Approved Date Sales', tracking=3, readonly=True)
+ date_logistic = fields.Datetime('Approved Date Logistic', tracking=3, readonly=True)
def _check_mapping_koli(self):
for record in self:
@@ -295,7 +309,9 @@ class TukarGuling(models.Model):
if picking.origin:
vals['origin'] = picking.origin
- return super(TukarGuling, self).create(vals)
+ res = super(TukarGuling, self).create(vals)
+ res.message_post(body=_("CCM Created By %s" ) % self.env.user.name)
+ return res
def copy(self, default=None):
if default is None:
@@ -457,23 +473,29 @@ class TukarGuling(models.Model):
if not self.return_type:
raise UserError("Return Type harus diisi!")
+ now = datetime.now()
+
# Cek hak akses berdasarkan state
for rec in self:
if rec.state == 'approval_sales':
if not rec.env.user.has_group('indoteknik_custom.group_role_sales'):
raise UserError("Hanya Sales Manager yang boleh approve tahap ini.")
rec.state = 'approval_logistic'
-
- elif rec.state == 'approval_logistic':
- if not rec.env.user.has_group('indoteknik_custom.group_role_logistic'):
- raise UserError("Hanya Logistic Manager yang boleh approve tahap ini.")
- rec.state = 'approval_finance'
+ rec.date_sales = now
elif rec.state == 'approval_finance':
if not rec.env.user.has_group('indoteknik_custom.group_role_fat'):
raise UserError("Hanya Finance Manager yang boleh approve tahap ini.")
rec.state = 'done'
+ rec.date_done = now
rec._create_pickings()
+
+ elif rec.state == 'approval_logistic':
+ if not rec.env.user.has_group('indoteknik_custom.group_role_logistic'):
+ raise UserError("Hanya Logistic Manager yang boleh approve tahap ini.")
+ rec.state = 'approval_finance'
+ rec.date_logistic = now
+
else:
raise UserError("Status ini tidak bisa di-approve.")
diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml
index 3f0ba0b6..03cfbc1a 100644
--- a/indoteknik_custom/views/ir_sequence.xml
+++ b/indoteknik_custom/views/ir_sequence.xml
@@ -203,7 +203,8 @@
<record id="seq_tukar_guling" model="ir.sequence">
<field name="name">Pengajuan Return SO</field>
<field name="code">tukar.guling</field>
- <field name="prefix">CCM/</field>
+ <field name="active">TRUE</field>
+ <field name="prefix">CCM/%(year)s/</field>
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
@@ -211,7 +212,8 @@
<record id="seq_tukar_guling_po" model="ir.sequence">
<field name="name">Pengajuan Return PO</field>
<field name="code">tukar.guling.po</field>
- <field name="prefix">VCM/</field>
+ <field name="active">TRUE</field>
+ <field name="prefix">VCM/%(year)s/</field>
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
diff --git a/indoteknik_custom/views/tukar_guling.xml b/indoteknik_custom/views/tukar_guling.xml
index 44b5134e..6b3492ae 100644
--- a/indoteknik_custom/views/tukar_guling.xml
+++ b/indoteknik_custom/views/tukar_guling.xml
@@ -24,14 +24,16 @@
<tree create="1" delete="1" default_order="create_date desc">
<field name="name"/>
<field name="date"/>
+ <field name="origin" string="SO Number"/>
<field name="operations" string="Operations"/>
- <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-success="state == 'done'"
decoration-muted="state == 'cancel'"
/>
+ <field name="ba_num" string="Nomor BA"/>
+ <field name="date_done" string="Approved Date"/>
</tree>
</field>
</record>
@@ -47,7 +49,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_sales', 'approval_finance', 'approval_logistic'])]}"/>
<button name="action_cancel" string="Cancel" type="object"
class="btn-secondary"
attrs="{'invisible': [('state', '=', 'cancel')]}"/>
@@ -75,14 +77,17 @@
<group>
<group>
<field name="date" string="Date" readonly="1"/>
- <field name="return_type"/>
+ <field name="return_type" attrs="{'readonly': [('state', 'not in', 'draft')]}"/>
<field name="operations"
- attrs="{'required': [('return_type', 'in', ['revisi_so', 'tukar_guling'])]}"/>
+ attrs="{'readonly': [('state', 'not in', 'draft')]}"/>
<field name="origin" readonly="1"/>
</group>
<group>
<field name="ba_num" string="Nomor BA"/>
<field name="notes"/>
+ <field name="date_sales" readonly="1"/>
+ <field name="date_logistic" readonly="1"/>
+ <field name="date_done" readonly="1"/>
</group>
</group>
<notebook>
@@ -111,6 +116,10 @@
</page>
</notebook>
</sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids" widget="mail_followers"/>
+ <field name="message_ids" widget="mail_thread"/>
+ </div>
</form>
</field>
</record>