# -*- coding: utf-8 -*- ############################################################################### # # Cybrosys Technologies Pvt. Ltd. # # Copyright (C) 2024-TODAY Cybrosys Technologies() # 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 . # ############################################################################### from odoo import fields, models, _ from odoo import exceptions class StockPicking(models.Model): """inheriting stock.picking to add additional fields""" _inherit = 'stock.picking' delivery_boy_id = fields.Many2one('hr.employee', string='Delivery Boy', help="The Person who deliver the goods") is_cancel_visibility = fields.Boolean(string='Cancel Button Visibility', default=False, help="Cancel button visibility field") is_assign_visibility = fields.Boolean(string='Assign Button Visibility', default=False, help="Assign button visibility field") is_broadcast_order = fields.Boolean(string='Broadcast Order', help="Checking is it broadcast order or" "not") order_source = fields.Char(string='Source', default='sales', help="The order source") delivery_assign_date = fields.Date(string='Assign Date', help="Delivery assigned date") delivery_state = fields.Selection( [('draft', 'Draft'), ('assigned', 'Assigned'), ('accept', 'Accept The Delivery'), ('picked', 'Picked'), ('reject', 'Reject The Delivery'), ('cancel', 'Canceled')], help="Different states of delivery", string='State', readonly=True, default='draft') payment_status = fields.Selection([('paid', 'Paid'), ('unpaid', 'Unpaid'), ], string='Payment Status', default='unpaid', help="The status of payment") distance = fields.Float(string='Distance', help="The distance for deliver" "the goods") reschedule_reason = fields.Text(string='Reschedule Reason', help="The reason behind reschedule.") is_complete = fields.Boolean(default=False, string='Is Complete', help="For updating Delivery complete status") def reset_to_draft(self): """Reset to draft""" self.delivery_state = 'draft' self.delivery_boy_id = False self.is_broadcast_order = False self.order_source = False self.delivery_assign_date = False self.distance = False self.payment_status = False self.is_complete = False def assign_delivery(self): """Assign delivery to the delivery person from order""" self.is_assign_visibility = True if len(self.delivery_boy_id): self.delivery_state = 'assigned' else: raise exceptions.ValidationError(_( "Please select a Delivery Person." )) def reschedule_delivery_person(self): """Reassigning the delivery person""" return { 'res_model': 'delivery.person.reschedule', 'type': 'ir.actions.act_window', 'view_mode': 'form', 'target': 'new', 'context': {'default_model_id': self.id} } def cancel_delivery(self): """Home delivery is cancelled and informing the customer by a mail""" self.delivery_state = 'cancel' self.is_cancel_visibility = True self.env.ref( 'home_delivery_system.email_template_cancel_delivery_order').send_mail( self.id, force_send=True) def picking_delivery(self): """Changes the state while delivery is picked the person""" self.delivery_state = 'picked' self.env.ref( 'home_delivery_system.email_template_cancel_delivery_picking').send_mail( self.id, force_send=True) def delivery_available(self): """Writing the state of delivery orders while the delivery accept""" assigned_delivery_orders = self.env['stock.picking'].search( [('delivery_boy_id', '!=', False), ('delivery_boy_id.user_id', '=', self.env.user.id)]) if len(assigned_delivery_orders) > 1: for rec in assigned_delivery_orders: rec.write({ 'delivery_state': 'accept' }) else: assigned_delivery_orders.write({ 'delivery_state': 'accept' }) return True