diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2022-09-19 11:07:17 +0700 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2022-09-19 11:07:17 +0700 |
| commit | de08a79ca870602ec45f396a8476cfdc3c38aee6 (patch) | |
| tree | b92fb1affefe2579a87edd195fe34f2d8c1ca50d | |
| parent | 68cb8eaa625b9c96de7aeb9fc45c1db81921661e (diff) | |
| parent | b1c1914eafc652711633f6f11b096a2013cad7e2 (diff) | |
Merge & fix conflicts
| -rwxr-xr-x | indoteknik_custom/__manifest__.py | 1 | ||||
| -rwxr-xr-x | indoteknik_custom/models/__init__.py | 1 | ||||
| -rw-r--r-- | indoteknik_custom/models/delivery_order.py | 100 | ||||
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 1 | ||||
| -rw-r--r-- | indoteknik_custom/models/stock_picking.py | 58 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 4 | ||||
| -rw-r--r-- | indoteknik_custom/views/delivery_order.xml | 50 | ||||
| -rw-r--r-- | indoteknik_custom/views/ir_sequence.xml | 30 | ||||
| -rwxr-xr-x | indoteknik_custom/views/sale_order.xml | 9 | ||||
| -rw-r--r-- | indoteknik_custom/views/stock_picking.xml | 24 |
10 files changed, 259 insertions, 19 deletions
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 7baa89c3..937fb0c9 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -13,6 +13,7 @@ 'security/ir.model.access.csv', 'views/blog_post.xml', 'views/coupon_program.xml', + 'views/delivery_order.xml', 'views/product_public_category.xml', 'views/product_template.xml', 'views/purchase_order.xml', diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 6407387c..e4913205 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -23,3 +23,4 @@ from . import blog_post from . import stock_move from . import stock_picking from . import stock_picking_type +from . import delivery_order diff --git a/indoteknik_custom/models/delivery_order.py b/indoteknik_custom/models/delivery_order.py new file mode 100644 index 00000000..06cdd878 --- /dev/null +++ b/indoteknik_custom/models/delivery_order.py @@ -0,0 +1,100 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError +from pytz import timezone +from datetime import datetime + + +class DeliveryOrder(models.TransientModel): + _name = 'delivery.order' + + name = fields.Char(string='Name', default='Delivery Order') + delivery_order_line_ids = fields.One2many( + comodel_name='delivery.order.line', + inverse_name='delivery_order_id', + string='Delivery Order Line' + ) + + @api.model + def create(self, vals): + current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + if len(vals['delivery_order_line_ids']) < 1: + raise UserError('Delivery Order harus di-isi sebelum melanjutkan') + + for delivery_order_line in vals['delivery_order_line_ids']: + picking = False + if delivery_order_line[2]['name']: + picking = self.env['stock.picking'].search([('picking_code', '=', delivery_order_line[2]['name'])], limit=1) + + if picking: + if not picking.driver_id: + picking.driver_id = self.env.uid + picking.delivery_tracking_no = delivery_order_line[2]['tracking_no'] + + delivery_type = self.env['delivery.order.line'].get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date) + if delivery_type == 'departure': + picking.driver_departure_date = current_time + elif delivery_type == 'arrival': + picking.driver_arrival_date = current_time + return super(DeliveryOrder, self).create(vals) + + def save_delivery(self): + self.ensure_one() + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'Notification', + 'message': 'Delivery Order berhasil disimpan', + 'next': {'type': 'ir.actions.act_window_close'}, + } + } + + +class DeliveryOrderLine(models.TransientModel): + _name = 'delivery.order.line' + + name = fields.Char(string='DO Number') + driver_id = fields.Many2one(comodel_name='res.users', string='Driver') + departure_date = fields.Char(string='Departure Date') + arrival_date = fields.Char(string='Arrival Date') + tracking_no = fields.Char(string='Tracking No') + delivery_order_id = fields.Many2one('delivery.order', string='Delivery Order') + + @api.onchange('name') + def onchange_name(self): + current_time = datetime.now(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') + + if self.name: + if len(self.name) == 13: + self.name = self.name[:-1] + picking = self.env['stock.picking'].search([('picking_code', '=', self.name)], limit=1) + if picking: + if picking.driver_id: + self.driver_id = picking.driver_id + else: + self.driver_id = self.env.uid + + self.tracking_no = picking.delivery_tracking_no + + delivery_type = self.get_delivery_type(picking.driver_departure_date, picking.driver_arrival_date) + if delivery_type != 'departure': + self.departure_date = picking.driver_departure_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') + + if delivery_type == 'departure': + self.departure_date = current_time + elif delivery_type == 'arrival': + self.arrival_date = current_time + else: + self.arrival_date = picking.driver_arrival_date.astimezone(timezone('Asia/Jakarta')).strftime('%Y-%m-%d %H:%M:%S') + else: + raise UserError('Nomor DO tidak ditemukan') + + def get_delivery_type(self, driver_departure_date, driver_arrival_date): + delivery_type = 'departure' + if driver_departure_date: + delivery_type = 'arrival' + if driver_arrival_date: + delivery_type = False + + return delivery_type diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 57a4921e..1db8a445 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -17,6 +17,7 @@ class SaleOrder(models.Model): ('pengajuan2', 'Approval Tyas'), ('approved', 'Approved'), ], string='Approval Status', readonly=True, copy=False, index=True, tracking=3) + carrier_id = fields.Many2one('delivery.carrier', string='Shipping Method') have_visit_service = fields.Boolean(string='Have Visit Service', help='To compute is customer get visit service', compute='_compute_have_visit_service') def _compute_have_visit_service(self): diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py index 3c39e769..a0b7c15e 100644 --- a/indoteknik_custom/models/stock_picking.py +++ b/indoteknik_custom/models/stock_picking.py @@ -6,10 +6,37 @@ class StockPicking(models.Model): _inherit = 'stock.picking' is_internal_use = fields.Boolean('Internal Use', help='flag which is internal use or not') account_id = fields.Many2one('account.account', string='Account') + efaktur_id = fields.Many2one('vit.efaktur', string='Faktur Pajak') + is_efaktur_exported = fields.Boolean(string='Is eFaktur Exported') + date_efaktur_exported = fields.Datetime(string='eFaktur Exported Date') - # efaktur_id = fields.Many2one('vit.efaktur', string='Faktur Pajak') - # is_efaktur_exported = fields.Boolean(string='Is eFaktur Exported') - # date_efaktur_exported = fields.Datetime(string='eFaktur Exported Date') + # Delivery Order + driver_departure_date = fields.Datetime( + string='Driver Departure Date', + readonly=True, + copy=False + ) + driver_arrival_date = fields.Datetime( + string='Driver Arrival Date', + readonly=True, + copy=False + ) + delivery_tracking_no = fields.Char( + string='Delivery Tracking Number', + readonly=True, + copy=False + ) + driver_id = fields.Many2one( + comodel_name='res.users', + string='Driver', + readonly=True, + copy=False + ) + picking_code = fields.Char( + string="Picking Code", + readonly=True, + copy=False + ) @api.onchange('picking_type_id') def _onchange_operation_type(self): @@ -21,3 +48,28 @@ class StockPicking(models.Model): raise UserError(_('Tidak bisa Validate jika tidak dari Document SO / PO')) res = super(StockPicking, self).button_validate() return res + + @api.model + def create(self, vals): + if not self.picking_code: + vals['picking_code'] = self.env['ir.sequence'].next_by_code('stock.picking.code') or '0' + + self._use_faktur(vals) + return super(StockPicking, self).create(vals) + + def write(self, vals): + self._use_faktur(vals) + return super(StockPicking, self).write(vals) + + def _use_faktur(self, vals): + if vals.get('efaktur_id', False): + self.env['vit.efaktur'].search( + [ + ('id', '=', vals['efaktur_id']) + ], + limit=1 + ).is_used = True + + if self.efaktur_id.id != vals['efaktur_id']: + self.efaktur_id.is_used = False + return True diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 08d8b519..78e56b30 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -9,4 +9,6 @@ access_stock_vendor,access.stock.vendor,model_stock_vendor,,1,1,1,1 access_user_activity_log,access.user.activity.log,model_user_activity_log,,1,1,1,1 access_purchase_pricelist,access.purchase.pricelist,model_purchase_pricelist,,1,1,1,1 access_sale_monitoring,access.sale.monitoring,model_sale_monitoring,,1,1,1,1 -access_sale_monitoring_detail,access.sale.monitoring.detail,model_sale_monitoring_detail,,1,1,1,1
\ No newline at end of file +access_sale_monitoring_detail,access.sale.monitoring.detail,model_sale_monitoring_detail,,1,1,1,1 +access_delivery_order,access.delivery.order,model_delivery_order,,1,1,1,1 +access_delivery_order_line,access.delivery.order.line,model_delivery_order_line,,1,1,1,1
\ No newline at end of file diff --git a/indoteknik_custom/views/delivery_order.xml b/indoteknik_custom/views/delivery_order.xml new file mode 100644 index 00000000..da6a571c --- /dev/null +++ b/indoteknik_custom/views/delivery_order.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <record id="view_delivery_order_form" model="ir.ui.view"> + <field name="name">Delivery Order</field> + <field name="model">delivery.order</field> + <field name="arch" type="xml"> + <form> + <sheet> + <field name="name" invisible="1"/> + <field + name="delivery_order_line_ids" + mode="tree" + > + <tree editable="bottom"> + <control> + <create name="add_delivery_order_line_control" string="Add a delivery"/> + </control> + <field name="name" required="1"/> + <field name="driver_id" readonly="1"/> + <field name="departure_date" readonly="1"/> + <field name="arrival_date" readonly="1"/> + <field name="tracking_no"/> + </tree> + </field> + </sheet> + <footer> + <button name="save_delivery" string="Submit" type="object" default_focus="1" class="oe_highlight"/> + <button string="Cancel" class="btn btn-secondary" special="cancel" /> + </footer> + </form> + </field> + </record> + + <record id="action_delivery_order" model="ir.actions.act_window"> + <field name="name">Delivery Order</field> + <field name="res_model">delivery.order</field> + <field name="type">ir.actions.act_window</field> + <field name="view_mode">form</field> + <field name="view_id" ref="view_delivery_order_form"/> + <field name="target">new</field> + </record> + + <menuitem + action="action_delivery_order" + id="delivery_order" + parent="stock.menu_stock_warehouse_mgmt" + name="Delivery Order" + sequence="1" + /> +</odoo>
\ No newline at end of file diff --git a/indoteknik_custom/views/ir_sequence.xml b/indoteknik_custom/views/ir_sequence.xml index 9e057c0d..754457da 100644 --- a/indoteknik_custom/views/ir_sequence.xml +++ b/indoteknik_custom/views/ir_sequence.xml @@ -1,12 +1,24 @@ <?xml version="1.0" encoding="UTF-8" ?> <odoo> - <record id="sequence_internal_use" model="ir.sequence"> - <field name="name">Internal Use</field> - <field name="code">internal.use</field> - <field name="active">TRUE</field> - <field name="prefix">IU/%(year)s/</field> - <field name="padding">5</field> - <field name="number_next">1</field> - <field name="number_increment">1</field> - </record> + <data noupdate="1"> + <record id="sequence_internal_use" model="ir.sequence"> + <field name="name">Internal Use</field> + <field name="code">internal.use</field> + <field name="active">TRUE</field> + <field name="prefix">IU/%(year)s/</field> + <field name="padding">5</field> + <field name="number_next">1</field> + <field name="number_increment">1</field> + </record> + + <record id="sequence_stock_picking_code" model="ir.sequence"> + <field name="name">Stock Picking Code</field> + <field name="code">stock.picking.code</field> + <field name="active">TRUE</field> + <field name="prefix">1%(y)s%(month)s</field> + <field name="padding">5</field> + <field name="number_next">1</field> + <field name="number_increment">1</field> + </record> + </data> </odoo>
\ No newline at end of file diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index 82058837..19182a6b 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -6,12 +6,6 @@ <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> - <button id="action_confirm" position="after"> -<!-- <button name="sale_order_approve"--> -<!-- string="Ask Approval"--> -<!-- type="object"--> -<!-- />--> - </button> <field name="payment_term_id" position="after"> <field name="approval_status" /> </field> @@ -23,6 +17,9 @@ <field name="total_margin" groups="sales_team.group_sale_manager"/> <field name="total_percent_margin" groups="sales_team.group_sale_manager"/> </field> + <field name="effective_date" position="after"> + <field name="carrier_id"/> + </field> </field> </record> </data> diff --git a/indoteknik_custom/views/stock_picking.xml b/indoteknik_custom/views/stock_picking.xml index 9081a58e..6ad2e4cd 100644 --- a/indoteknik_custom/views/stock_picking.xml +++ b/indoteknik_custom/views/stock_picking.xml @@ -23,6 +23,30 @@ }" /> </field> + + <page name="note" position="after"> + <page string="E-Faktur" name="efaktur" attrs="{'invisible': [['is_internal_use', '=', False]]}"> + <group> + <group> + <field name="efaktur_id" domain="[('is_used','=',False)]"/> + <field name="is_efaktur_exported"/> + <field name="date_efaktur_exported"/> + </group> + </group> + </page> + <page string="Delivery" name="delivery_order"> + <group> + <group> + <field name="driver_departure_date"/> + <field name="driver_arrival_date"/> + <field name="delivery_tracking_no"/> + <field name="driver_id"/> + <field name="picking_code"/> + </group> + </group> + </page> + </page> + </field> </record> </data> |
