You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							588 lines
						
					
					
						
							28 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							588 lines
						
					
					
						
							28 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################ | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Ammu Raj (odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ################################################################################ | |
| from werkzeug import urls | |
| from odoo import api, fields, models, _ | |
| from odoo.exceptions import ValidationError | |
| 
 | |
| 
 | |
| class FreightOrder(models.Model): | |
|     """Model for creating freight orders""" | |
|     _name = 'freight.order' | |
|     _description = 'Freight Order' | |
| 
 | |
|     name = fields.Char(string='Name', default='New', readonly=True, | |
|                        help='Name of the order') | |
|     shipper_id = fields.Many2one('res.partner', string='Shipper', required=True, | |
|                                  help="Shipper's Details") | |
|     consignee_id = fields.Many2one('res.partner', 'Consignee', | |
|                                    help="Select the consignee for the order") | |
|     type = fields.Selection([('import', 'Import'), ('export', 'Export')], | |
|                             string='Import/Export', required=True, | |
|                             help="Type of freight operation") | |
|     transport_type = fields.Selection([('land', 'Land'), ('air', 'Air'), | |
|                                        ('water', 'Water')], string='Transport', | |
|                                       help='Type of transportation', | |
|                                       required=True) | |
|     land_type = fields.Selection([('ltl', 'LTL'), ('ftl', 'FTL')], | |
|                                  string='Land Shipping', | |
|                                  help="Types of shipment movement involved in" | |
|                                       "Land") | |
|     water_type = fields.Selection([('fcl', 'FCL'), ('lcl', 'LCL')], | |
|                                   string='Water Shipping', | |
|                                   help="Types of shipment movement involved in" | |
|                                        "Water") | |
|     order_date = fields.Date(string='Date', default=fields.Date.today(), | |
|                              help="Date of order") | |
|     loading_port_id = fields.Many2one('freight.port', string="Loading Port", | |
|                                       required=True, | |
|                                       help="Loading port of the freight order") | |
|     discharging_port_id = fields.Many2one('freight.port', | |
|                                           string="Discharging Port", | |
|                                           required=True, | |
|                                           help="Discharging port of freight" | |
|                                                "order") | |
|     state = fields.Selection([('draft', 'Draft'), ('submit', 'Submitted'), | |
|                               ('confirm', 'Confirmed'), | |
|                               ('invoice', 'Invoiced'), ('done', 'Done'), | |
|                               ('cancel', 'Cancel')], | |
|                              default='draft', string="State", | |
|                              help='Different states of freight order') | |
|     clearance = fields.Boolean(string='Clearance', help='Checking the' | |
|                                                         'clearance') | |
|     clearance_count = fields.Integer(compute='_compute_count', | |
|                                      string='Clearance Count', | |
|                                      help='The number of clearance') | |
|     invoice_count = fields.Integer(compute='_compute_count', | |
|                                    string='Invoice Count', | |
|                                    help='The number invoice created') | |
|     total_order_price = fields.Float(string='Total', | |
|                                      compute='_compute_total_order_price', | |
|                                      help='The total order price') | |
|     total_volume = fields.Float(string='Total Volume', | |
|                                 compute='_compute_total_order_price', | |
|                                 help='The total used volume') | |
|     total_weight = fields.Float(string='Total Weight', | |
|                                 compute='_compute_total_order_price', | |
|                                 help='The total weight used') | |
|     order_ids = fields.One2many('freight.order.line', 'order_id', | |
|                                 string='Freight Order Line', | |
|                                 help='The freight order lines of the order') | |
|     route_ids = fields.One2many('freight.order.routes.line', 'freight_id', | |
|                                 string='Route', help='The route of order') | |
|     total_route_sale = fields.Float(string='Total Sale', | |
|                                     compute="_compute_total_route_cost", | |
|                                     help='The total cost of sale') | |
|     service_ids = fields.One2many('freight.order.service', 'freight_id', | |
|                                   string="Service", help='Service of the order') | |
|     total_service_sale = fields.Float(string='Service Total Sale', | |
|                                       compute="_compute_total_service_cost", | |
|                                       help='The total service cost of order') | |
|     agent_id = fields.Many2one('res.partner', string='Agent', | |
|                                required=True, help="Details of agent") | |
|     expected_date = fields.Date(string='Expected Date', help='The expected date' | |
|                                                              'of the order') | |
|     track_ids = fields.One2many('freight.track', 'freight_id', | |
|                                 string='Tracking', help='For tracking the' | |
|                                                         'freight orders') | |
|     company_id = fields.Many2one('res.company', string='Company', | |
|                                  copy=False, readonly=True, | |
|                                  help="Current company", | |
|                                  default=lambda | |
|                                      self: self.env.company.id) | |
| 
 | |
|     @api.depends('order_ids.total_price', 'order_ids.volume', | |
|                  'order_ids.weight') | |
|     def _compute_total_order_price(self): | |
|         """Computing the price of the order""" | |
|         for rec in self: | |
|             rec.total_order_price = sum(rec.order_ids.mapped('total_price')) | |
|             rec.total_volume = sum(rec.order_ids.mapped('volume')) | |
|             rec.total_weight = sum(rec.order_ids.mapped('weight')) | |
| 
 | |
|     @api.depends('route_ids.sale') | |
|     def _compute_total_route_cost(self): | |
|         """Computing the total cost of route operation""" | |
|         for rec in self: | |
|             rec.total_route_sale = sum(rec.route_ids.mapped('sale')) | |
| 
 | |
|     @api.depends('service_ids.total_sale') | |
|     def _compute_total_service_cost(self): | |
|         """Computing the total cost of services""" | |
|         for rec in self: | |
|             rec.total_service_sale = sum(rec.service_ids.mapped('total_sale')) | |
| 
 | |
|     @api.model_create_multi | |
|     def create(self, vals_list): | |
|         """Create Sequence for multiple records""" | |
|         for vals in vals_list: | |
|             vals['name'] = self.env['ir.sequence'].next_by_code( | |
|                 'freight.order.sequence') | |
|         return super(FreightOrder, self).create(vals_list) | |
| 
 | |
|     def action_create_custom_clearance(self): | |
|         """Create custom clearance""" | |
|         clearance = self.env['custom.clearance'].create({ | |
|             'name': 'CC - ' + self.name, | |
|             'freight_id': self.id, | |
|             'date': self.order_date, | |
|             'loading_port_id': self.loading_port_id.id, | |
|             'discharging_port_id': self.discharging_port_id.id, | |
|             'agent_id': self.agent_id.id, | |
|         }) | |
|         result = { | |
|             'name': 'action.name', | |
|             'type': 'ir.actions.act_window', | |
|             'views': [[False, 'form']], | |
|             'target': 'current', | |
|             'res_id': clearance.id, | |
|             'res_model': 'custom.clearance', | |
|         } | |
|         self.clearance = True | |
|         return result | |
| 
 | |
|     def get_custom_clearance(self): | |
|         """Get custom clearance""" | |
|         self.ensure_one() | |
|         return { | |
|             'type': 'ir.actions.act_window', | |
|             'name': 'Custom Clearance', | |
|             'view_mode': 'tree,form', | |
|             'res_model': 'custom.clearance', | |
|             'domain': [('freight_id', '=', self.id)], | |
|             'context': "{'create': False}" | |
|         } | |
| 
 | |
|     def action_track_order(self): | |
|         """Track the order""" | |
|         self.ensure_one() | |
|         return { | |
|             'type': 'ir.actions.act_window', | |
|             'name': 'Received/Delivered', | |
|             'view_mode': 'form', | |
|             'target': 'new', | |
|             'res_model': 'freight.order.track', | |
|             'context': { | |
|                 'default_freight_id': self.id | |
|             } | |
|         } | |
| 
 | |
|     def action_create_invoice(self): | |
|         """Create invoice""" | |
|         lines = [] | |
|         if self.order_ids: | |
|             for order in self.order_ids: | |
|                 value = (0, 0, { | |
|                     'name': order.product_id.name, | |
|                     'price_unit': order.price, | |
|                     'quantity': order.volume + order.weight, | |
|                 }) | |
|                 lines.append(value) | |
|         if self.route_ids: | |
|             for route in self.route_ids: | |
|                 value = (0, 0, { | |
|                     'name': route.routes_id.name, | |
|                     'price_unit': route.sale, | |
|                 }) | |
|                 lines.append(value) | |
|         if self.service_ids: | |
|             for service in self.service_ids: | |
|                 value = (0, 0, { | |
|                     'name': service.service_id.name, | |
|                     'price_unit': service.sale, | |
|                     'quantity': service.qty | |
|                 }) | |
|                 lines.append(value) | |
|         invoice_line = { | |
|             'move_type': 'out_invoice', | |
|             'partner_id': self.shipper_id.id, | |
|             'invoice_user_id': self.env.user.id, | |
|             'invoice_origin': self.name, | |
|             'ref': self.name, | |
|             'invoice_line_ids': lines, | |
|         } | |
|         inv = self.env['account.move'].create(invoice_line) | |
|         result = { | |
|             'name': 'action.name', | |
|             'type': 'ir.actions.act_window', | |
|             'views': [[False, 'form']], | |
|             'target': 'current', | |
|             'res_id': inv.id, | |
|             'res_model': 'account.move', | |
|         } | |
|         self.state = 'invoice' | |
|         return result | |
| 
 | |
|     def action_cancel(self): | |
|         """Cancel the record""" | |
|         if self.state == 'draft' and self.state == 'submit': | |
|             self.state = 'cancel' | |
|         else: | |
|             raise ValidationError("You can't cancel this order") | |
| 
 | |
|     def get_invoice(self): | |
|         """View the invoice""" | |
|         self.ensure_one() | |
|         return { | |
|             'type': 'ir.actions.act_window', | |
|             'name': 'Invoice', | |
|             'view_mode': 'tree,form', | |
|             'res_model': 'account.move', | |
|             'domain': [('ref', '=', self.name)], | |
|             'context': "{'create': False}" | |
|         } | |
| 
 | |
|     @api.depends('name') | |
|     def _compute_count(self): | |
|         """Compute custom clearance and account move's count""" | |
|         for rec in self: | |
|             if rec.env['custom.clearance'].search( | |
|                     [('freight_id', '=', rec.id)]): | |
|                 rec.clearance_count = rec.env['custom.clearance'].search_count( | |
|                     [('freight_id', '=', rec.id)]) | |
|             else: | |
|                 rec.clearance_count = 0 | |
|             if rec.env['account.move'].search([('ref', '=', rec.name)]): | |
|                 rec.invoice_count = rec.env['account.move'].search_count( | |
|                     [('ref', '=', rec.name)]) | |
|             else: | |
|                 rec.invoice_count = 0 | |
| 
 | |
|     def action_submit(self): | |
|         """Submitting order""" | |
|         for rec in self: | |
|             rec.state = 'submit' | |
|             base_url = self.env['ir.config_parameter'].sudo().get_param( | |
|                 'web.base.url') | |
|             Urls = urls.url_join(base_url, | |
|                                  'web#id=%(id)s&model=freight.order&view_type=form' % { | |
|                                      'id': self.id}) | |
|             mail_content = _('Hi %s,<br>' | |
|                              'The Freight Order %s is Submitted' | |
|                              '<div style = "text-align: center; ' | |
|                              'margin-top: 16px;"><a href = "%s"' | |
|                              'style = "padding: 5px 10px; font-size: 12px; ' | |
|                              'line-height: 18px; color: #FFFFFF; ' | |
|                              'border-color:#875A7B;text-decoration: none; ' | |
|                              'display: inline-block; margin-bottom: 0px; ' | |
|                              'font-weight: 400;text-align: center; ' | |
|                              'vertical-align: middle; cursor: pointer; ' | |
|                              'white-space: nowrap; background-image: none; ' | |
|                              'background-color: #875A7B; ' | |
|                              'border: 1px solid #875A7B; border-radius:3px;">' | |
|                              'View %s</a></div>' | |
|                              ) % (rec.agent_id.name, rec.name, Urls, rec.name) | |
|             email_to = self.env['res.partner'].search([ | |
|                 ('id', 'in', (self.shipper_id.id, self.consignee_id.id, | |
|                               self.agent_id.id))]) | |
|             for mail in email_to: | |
|                 main_content = { | |
|                     'subject': _('Freight Order %s is Submitted') % self.name, | |
|                     'author_id': self.env.user.partner_id.id, | |
|                     'body_html': mail_content, | |
|                     'email_to': mail.email | |
|                 } | |
|                 mail_id = self.env['mail.mail'].create(main_content) | |
|                 mail_id.mail_message_id.body = mail_content | |
|                 mail_id.send() | |
| 
 | |
|     def action_confirm(self): | |
|         """Confirm order""" | |
|         for rec in self: | |
|             custom_clearance = self.env['custom.clearance'].search([ | |
|                 ('freight_id', '=', self.id)]) | |
|             if custom_clearance: | |
|                 for clearance in custom_clearance: | |
|                     if clearance.state == 'confirm': | |
|                         rec.state = 'confirm' | |
|                         base_url = self.env['ir.config_parameter'].sudo().get_param( | |
|                             'web.base.url') | |
|                         Urls = urls.url_join(base_url, | |
|                                              'web#id=%(id)s&model=freight.order&view_type=form' % { | |
|                                                  'id': self.id}) | |
|                         mail_content = _('Hi %s,<br> ' | |
|                                          'The Freight Order %s is Confirmed ' | |
|                                          '<div style = "text-align: center; ' | |
|                                          'margin-top: 16px;"><a href = "%s"' | |
|                                          'style = "padding: 5px 10px; ' | |
|                                          'font-size: 12px; line-height: 18px; ' | |
|                                          'color: #FFFFFF; border-color:#875A7B; ' | |
|                                          'text-decoration: none; ' | |
|                                          'display: inline-block; ' | |
|                                          'margin-bottom: 0px; font-weight: 400;' | |
|                                          'text-align: center; ' | |
|                                          'vertical-align: middle; ' | |
|                                          'cursor: pointer; white-space: nowrap; ' | |
|                                          'background-image: none; ' | |
|                                          'background-color: #875A7B; ' | |
|                                          'border: 1px solid #875A7B; ' | |
|                                          'border-radius:3px;">' | |
|                                          'View %s</a></div>' | |
|                                          ) % (rec.agent_id.name, rec.name, | |
|                                               Urls, rec.name) | |
|                         email_to = self.env['res.partner'].search([ | |
|                             ('id', 'in', (self.shipper_id.id, | |
|                                           self.consignee_id.id, self.agent_id.id))]) | |
|                         for mail in email_to: | |
|                             main_content = { | |
|                                 'subject': _( | |
|                                     'Freight Order %s is Confirmed') % self.name, | |
|                                 'author_id': self.env.user.partner_id.id, | |
|                                 'body_html': mail_content, | |
|                                 'email_to': mail.email | |
|                             } | |
|                             mail_id = self.env['mail.mail'].create(main_content) | |
|                             mail_id.mail_message_id.body = mail_content | |
|                             mail_id.send() | |
|                     elif clearance.state == 'draft': | |
|                         raise ValidationError("the custom clearance ' %s ' is " | |
|                                               "not confirmed" % clearance.name) | |
|             else: | |
|                 raise ValidationError( | |
|                     "Create a custom clearance for %s" % rec.name) | |
|             for line in rec.order_ids: | |
|                 line.container_id.state = 'reserve' | |
| 
 | |
|     def action_done(self): | |
|         """Mark order as done""" | |
|         for rec in self: | |
|             base_url = self.env['ir.config_parameter'].sudo().get_param( | |
|                 'web.base.url') | |
|             Urls = urls.url_join(base_url, | |
|                                  'web#id=%(id)s&model=freight.order&view_type=form' % { | |
|                                      'id': self.id}) | |
|             mail_content = _('Hi %s,<br>' | |
|                              'The Freight Order %s is Completed' | |
|                              '<div style = "text-align: center; ' | |
|                              'margin-top: 16px;"><a href = "%s"' | |
|                              'style = "padding: 5px 10px; font-size: 12px; ' | |
|                              'line-height: 18px; color: #FFFFFF; ' | |
|                              'border-color:#875A7B;text-decoration: none; ' | |
|                              'display: inline-block; ' | |
|                              'margin-bottom: 0px; font-weight: 400;' | |
|                              'text-align: center; vertical-align: middle; ' | |
|                              'cursor: pointer; white-space: nowrap; ' | |
|                              'background-image: none; ' | |
|                              'background-color: #875A7B; ' | |
|                              'border: 1px solid #875A7B; border-radius:3px;">' | |
|                              'View %s</a></div>' | |
|                              ) % (rec.agent_id.name, rec.name, Urls, rec.name) | |
|             email_to = self.env['res.partner'].search([ | |
|                 ('id', 'in', (self.shipper_id.id, self.consignee_id.id, | |
|                               self.agent_id.id))]) | |
|             for mail in email_to: | |
|                 main_content = { | |
|                     'subject': _('Freight Order %s is completed') % self.name, | |
|                     'author_id': self.env.user.partner_id.id, | |
|                     'body_html': mail_content, | |
|                     'email_to': mail.email | |
|                 } | |
|                 mail_id = self.env['mail.mail'].create(main_content) | |
|                 mail_id.mail_message_id.body = mail_content | |
|                 mail_id.send() | |
|             self.state = 'done' | |
|             for line in rec.order_ids: | |
|                 line.container_id.state = 'available' | |
| 
 | |
| 
 | |
| class FreightOrderLine(models.Model): | |
|     """Freight order lines are defined""" | |
|     _name = 'freight.order.line' | |
|     _description = 'Freight Order Line' | |
| 
 | |
|     order_id = fields.Many2one('freight.order', string="Freight Order", | |
|                                help="Reference from freight order") | |
|     container_id = fields.Many2one('freight.container', string='Container', | |
|                                    domain="[('state', '=', 'available')]", | |
|                                    help='The freight container') | |
|     product_id = fields.Many2one('product.product', string='Goods', | |
|                                  help='The Freight Products') | |
|     billing_type = fields.Selection([('weight', 'Weight'), | |
|                                      ('volume', 'Volume')], string="Billing On", | |
|                                     help='Select the billing type for' | |
|                                          'calculating the total amount') | |
|     pricing_id = fields.Many2one('freight.price', string='Pricing', | |
|                                  help='The pricing of order') | |
|     price = fields.Float(string='Unit Price', help='Unit price of the selected' | |
|                                                    'goods') | |
|     total_price = fields.Float(string='Total Price', help='This will be the' | |
|                                                           'total price') | |
|     volume = fields.Float(string='Volume', help='Volume of the goods') | |
|     weight = fields.Float(string='Weight', help='Weight of the goods') | |
|     company_id = fields.Many2one('res.company', string='Company', | |
|                                  copy=False, readonly=True, | |
|                                  help="Current company", | |
|                                  default=lambda | |
|                                      self: self.env.company.id) | |
| 
 | |
|     @api.constrains('weight') | |
|     def _check_weight(self): | |
|         """Checking the weight of containers""" | |
|         for rec in self: | |
|             if rec.container_id and rec.billing_type: | |
|                 if rec.billing_type == 'weight': | |
|                     if rec.container_id.weight < rec.weight: | |
|                         raise ValidationError( | |
|                             'The weight is must be less ' | |
|                             'than or equal to %s' % (rec.container_id.weight)) | |
| 
 | |
|     @api.constrains('volume') | |
|     def _check_volume(self): | |
|         """Checking the volume of containers""" | |
|         for rec in self: | |
|             if rec.container_id and rec.billing_type: | |
|                 if rec.billing_type == 'volume': | |
|                     if rec.container_id.volume < rec.volume: | |
|                         raise ValidationError( | |
|                             'The volume is must be less ' | |
|                             'than or equal to %s' % (rec.container_id.volume)) | |
| 
 | |
|     @api.onchange('pricing_id', 'billing_type') | |
|     def _onchange_price(self): | |
|         """Calculate the weight and volume of container""" | |
|         for rec in self: | |
|             if rec.billing_type == 'weight': | |
|                 rec.volume = 0.00 | |
|                 rec.price = rec.pricing_id.weight | |
|             elif rec.billing_type == 'volume': | |
|                 rec.weight = 0.00 | |
|                 rec.price = rec.pricing_id.volume | |
| 
 | |
|     @api.onchange('pricing_id', 'billing_type', 'volume', 'weight') | |
|     def _onchange_total_price(self): | |
|         """Calculate sub total price""" | |
|         for rec in self: | |
|             if rec.billing_type and rec.pricing_id: | |
|                 if rec.billing_type == 'weight': | |
|                     rec.total_price = rec.weight * rec.price | |
|                 elif rec.billing_type == 'volume': | |
|                     rec.total_price = rec.volume * rec.price | |
| 
 | |
| 
 | |
| class FreightOrderRoutesLine(models.Model): | |
|     """Defining the routes for the shipping, also we can add the operations for | |
|     the routes.""" | |
|     _name = 'freight.order.routes.line' | |
|     _description = 'Freight Order Routes Lines' | |
| 
 | |
|     freight_id = fields.Many2one('freight.order', string='Freight Order', | |
|                                  help='Relation from freight order') | |
|     routes_id = fields.Many2one('freight.routes', required=True, | |
|                                 string='Routes', help='Select route of freight') | |
|     source_loc_id = fields.Many2one('freight.port', string='Source Location', | |
|                                     help='Select the source port') | |
|     destination_loc_id = fields.Many2one('freight.port', | |
|                                          string='Destination Location', | |
|                                          help='Select the destination port') | |
|     transport_type = fields.Selection([('land', 'Land'), ('air', 'Air'), | |
|                                        ('water', 'Water')], string="Transport", | |
|                                       required=True, | |
|                                       help='Select the transporting medium') | |
|     sale = fields.Float(string='Sale', help="Set the price for Land") | |
|     company_id = fields.Many2one('res.company', string='Company', | |
|                                  copy=False, readonly=True, | |
|                                  help="Current company", | |
|                                  default=lambda | |
|                                      self: self.env.company.id) | |
| 
 | |
|     @api.onchange('routes_id', 'transport_type') | |
|     def _onchange_routes_id(self): | |
|         """Calculate the price of route operation""" | |
|         for rec in self: | |
|             if rec.routes_id and rec.transport_type: | |
|                 if rec.transport_type == 'land': | |
|                     rec.sale = rec.routes_id.land_sale | |
|                 elif rec.transport_type == 'air': | |
|                     rec.sale = rec.routes_id.air_sale | |
|                 elif rec.transport_type == 'water': | |
|                     rec.sale = rec.routes_id.water_sale | |
| 
 | |
| 
 | |
| class FreightOrderServiceLine(models.Model): | |
|     """Services in freight orders""" | |
|     _name = 'freight.order.service' | |
|     _description = 'Freight Order Service' | |
| 
 | |
|     freight_id = fields.Many2one('freight.order', string='Freight Order', | |
|                                  help='Relation from freight order') | |
|     service_id = fields.Many2one('freight.service', required=True, | |
|                                  string='Service', help='Select the service') | |
|     partner_id = fields.Many2one('res.partner', string="Vendor", | |
|                                  help='Select the partner for the service') | |
|     qty = fields.Float(string='Quantity', help='How many Quantity required') | |
|     cost = fields.Float(string='Cost', help='The cost price of the service') | |
|     sale = fields.Float(string='Sale', help='Sale price of the service') | |
|     total_sale = fields.Float('Total Sale', help='The total sale price') | |
|     company_id = fields.Many2one('res.company', string='Company', | |
|                                  copy=False, readonly=True, | |
|                                  help="Current company", | |
|                                  default=lambda | |
|                                      self: self.env.company.id) | |
| 
 | |
|     @api.onchange('service_id', 'partner_id') | |
|     def _onchange_partner_id(self): | |
|         """Calculate the price of services""" | |
|         for rec in self: | |
|             if rec.service_id: | |
|                 if rec.partner_id: | |
|                     if rec.service_id.line_ids: | |
|                         for service in rec.service_id.line_ids: | |
|                             if rec.partner_id == service.partner_id: | |
|                                 rec.sale = service.sale | |
|                             else: | |
|                                 rec.sale = rec.service_id.sale_price | |
|                     else: | |
|                         rec.sale = rec.service_id.sale_price | |
|                 else: | |
|                     rec.sale = rec.service_id.sale_price | |
| 
 | |
|     @api.onchange('qty', 'sale') | |
|     def _onchange_qty(self): | |
|         """Calculate the subtotal of route operation""" | |
|         for rec in self: | |
|             rec.total_sale = rec.qty * rec.sale | |
| 
 | |
| 
 | |
| class Tracking(models.Model): | |
|     """Tracking the freight order""" | |
|     _name = 'freight.track' | |
|     _description = 'Freight Track' | |
| 
 | |
|     source_loc_id = fields.Many2one('freight.port', string='Source Location', | |
|                                     help='Select the source location of port') | |
|     destination_loc_id = fields.Many2one('freight.port', | |
|                                          string='Destination Location', | |
|                                          help='Destination location of the port') | |
|     transport_type = fields.Selection([('land', 'Land'), ('air', 'Air'), | |
|                                        ('water', 'Water')], string='Transport', | |
|                                       help='Transporting medium of the order') | |
|     freight_id = fields.Many2one('freight.order', string='Freight Order', | |
|                                  help='Reference from freight order') | |
|     date = fields.Date(string='Date', help='Select the date') | |
|     type = fields.Selection([('received', 'Received'), | |
|                              ('delivered', 'Delivered')], | |
|                             string='Received/Delivered', | |
|                             help='Status of the order') | |
|     company_id = fields.Many2one('res.company', string='Company', | |
|                                  copy=False, readonly=True, | |
|                                  help="Current company", | |
|                                  default=lambda | |
|                                      self: self.env.company.id)
 | |
| 
 |