diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-07-22 16:42:10 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-07-22 16:42:10 +0700 |
| commit | 1de8ad79dd0f0832dd14de9c1d004884f153bec4 (patch) | |
| tree | cfba46f7d80b67243b4cee52101356944e1dd382 | |
| parent | 69f0fbf98183ea00bb069df3ecd40e91df7081c3 (diff) | |
<miqdad> Chatter and sequence
| -rw-r--r-- | indoteknik_custom/models/tukar_guling.py | 40 | ||||
| -rw-r--r-- | indoteknik_custom/views/ir_sequence.xml | 6 | ||||
| -rw-r--r-- | indoteknik_custom/views/tukar_guling.xml | 17 |
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> |
