from odoo import models, fields, api class PurchaseRequest(models.Model): _name = 'kosbar.purchase.request' _description = 'Purchase Request dari Gudang' _order = 'id desc' name = fields.Char( string='Nomor Request', required=True, copy=False, readonly=True, default='New', ) user_id = fields.Many2one( 'res.users', string='Diminta Oleh', default=lambda self: self.env.user, required=True, ) date_required = fields.Date(string='Tanggal Dibutuhkan', default=fields.Date.today()) state = fields.Selection([ ('draft', 'Draft'), ('submitted', 'Submitted'), ('approved', 'Approved / In Progress'), ('done', 'Done'), ('rejected', 'Rejected'), ], string='Status', default='draft', tracking=True) line_ids = fields.One2many( 'kosbar.purchase.request.line', 'request_id', string='Daftar Barang', ) notes = fields.Text(string='Catatan / Keperluan') @api.model_create_multi def create(self, vals_list): for vals in vals_list: if vals.get('name', 'New') == 'New': seq = self.env['ir.sequence'].next_by_code('kosbar.purchase.request') vals['name'] = seq if seq else 'PR/2026/00001' return super().create(vals_list) def action_submit(self): self.write({'state': 'submitted'}) def action_approve(self): self.write({'state': 'approved'}) def action_done(self): self.write({'state': 'done'}) def action_reject(self): self.write({'state': 'rejected'}) def action_draft(self): self.write({'state': 'draft'}) class PurchaseRequestLine(models.Model): _name = 'kosbar.purchase.request.line' _description = 'Detail Item Purchase Request' request_id = fields.Many2one('kosbar.purchase.request', string='Request Reference', ondelete='cascade') # Bisa pilih barang existing ATAU buat barang baru langsung is_new_product = fields.Boolean(string='Barang Baru?', default=False) product_id = fields.Many2one('product.product', string='Produk (Existing)') # Jika barang baru new_product_name = fields.Char(string='Nama Barang Baru') categ_id = fields.Many2one('product.category', string='Kategori Barang') product_qty = fields.Float(string='Jumlah', default=1.0, required=True) product_uom = fields.Many2one('uom.uom', string='Satuan', default=lambda self: self.env.ref('uom.product_uom_unit', raise_if_not_found=False)) price_unit = fields.Float(string='Estimasi Harga Satuan') notes = fields.Char(string='Keterangan')