Como crear un remito a partir de una factura

17 de julio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

A veces se necesita crear un remito a partir de una factura (hay gente que remite solo si y solo si factura, es así la Argentina). La idea es de la factura de ventas confirmada, crear un remito con los materiales facturados. Este módulo lo pueden descargar desde nuestro repositorio en github.

El módulo crea un botón "Crear remito" en la factura, dicho botón al clickearse crea el remito. Solo necesita estar configurado el tipo de movimiento de entrega a clientes, y la ubicación de clientes. Sino da error. En un futuro, se va a hacer que apenas se valide la factura, se genere el remito.


Al crearse el remito, se completa el campo "Remito" en borrador


Y debajo se puede observar el remito en borrador que se creó.


El módulo está pensado para instalaciones sencillas. Le quedan un par de cambios a hacer para que sea mejor. El primero es la generación automática del remito apenas se valida la factura (solo se debe extender el método post). La segunda es validar el remito apens es creado (pero crea otro problema, asegurarse que exista el stock para el mismo). Después otra mejora es remitir los productos que no sean servicios y que brinde soporte a la entrega de números de serie.

Notas técnicas

Primero se agrega un botón en la factura para la creación del remito. En este caso agregamos el botón antes del campo state, una técnica muy común al agregar botones a transacciones (la otra técnica es hacerlo mediante xpath dentro del header)

<field name="state" position="before">
<button name="create_picking" string="Crear Remito" type="object" />
</field>

Al clickearse el botón el método create_picking. En este método, primero buscamos un tipo de movimiento (stock.picking.type) y creamos una transferencia (stock.picking) de dicho tipo. 

picking_type_id = self.env['stock.picking.type'].search([('company_id','=',self.company_id.id),('code','=','outgoing')],limit=1)
if not picking_type_id:
raise ValidationError('No tiene configurada la entrega')
location_dest_id = self.env['stock.location'].search([('usage','=','customer')],limit=1)
if not location_dest_id:
raise ValidationError('No esta configurada la ubicacion del cliente')
vals_picking = {
'picking_type_id': picking_type_id.id,
'scheduled_date': datetime.now(),
'origin': self.name,
'partner_id': self.partner_id.id,
'location_id': picking_type_id.default_location_src_id.id,
'location_dest_id': location_dest_id.id,
}
picking_id = self.env['stock.picking'].create(vals_picking)

Luego iteramos sobre las líneas de la factura y creando movimiento de stock (stock.move) en modo borrador para cada línea. 

for line in self.invoice_line_ids:
vals_move = {
'picking_id': picking_id.id,
'product_id': line.product_id.id,
'name': line.name,
'product_uom_qty': line.quantity,
'product_uom': line.product_uom_id.id,
'location_id': picking_type_id.default_location_src_id.id,
'company_id': self.company_id.id,
'location_dest_id': location_dest_id.id,
}
move_id = self.env['stock.move'].create(vals_move)





Gustavo Orrillo 17 de julio de 2023
Compartir
Archivar
Identificarse dejar un comentario