diff options
| -rw-r--r-- | indoteknik_custom/models/tukar_guling.py | 56 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 1 | ||||
| -rw-r--r-- | indoteknik_custom/views/tukar_guling_po.xml | 6 |
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"> |
