|
|
@@ -167,37 +167,28 @@ class SaleOrderTemplate(models.Model):
|
|
|
"""
|
|
|
Calcula las fechas para las cuales se deben generar pedidos.
|
|
|
Si monthly_invoice_project está activo, genera fechas mensuales.
|
|
|
- Si no, solo genera una orden con fecha actual.
|
|
|
+ Si no, solo genera una orden con la fecha de inicio del contrato.
|
|
|
"""
|
|
|
self.ensure_one()
|
|
|
if not self.date_start or not self.date_end or self.date_start > self.date_end:
|
|
|
return []
|
|
|
|
|
|
if not self.monthly_invoice_project:
|
|
|
- # Solo crear una orden con fecha actual
|
|
|
- return [fields.Date.today()]
|
|
|
+ # Solo crear una orden con la fecha de inicio del contrato
|
|
|
+ return [self.date_start]
|
|
|
|
|
|
# Lógica original para órdenes mensuales
|
|
|
order_dates = []
|
|
|
current_date = fields.Date.today()
|
|
|
-
|
|
|
- # Determinar la fecha de inicio real para la generación
|
|
|
- # Debe ser el primer día del mes de self.date_start o el primer día del mes actual,
|
|
|
- # lo que sea posterior.
|
|
|
actual_start_date = self.date_start.replace(day=1)
|
|
|
-
|
|
|
- # Asegurarse de que la fecha de inicio real no sea posterior a date_end
|
|
|
if actual_start_date > self.date_end:
|
|
|
return []
|
|
|
-
|
|
|
ptr_date = actual_start_date
|
|
|
while ptr_date <= self.date_end:
|
|
|
order_dates.append(ptr_date)
|
|
|
ptr_date += relativedelta(months=1)
|
|
|
- # Asegurarse de que ptr_date siga siendo el primer día del mes
|
|
|
- if ptr_date.day != 1: # Esto puede pasar si el mes original tenía más días
|
|
|
+ if ptr_date.day != 1:
|
|
|
ptr_date = ptr_date.replace(day=1)
|
|
|
-
|
|
|
return order_dates
|
|
|
|
|
|
def _configure_project_for_contract(self, template_line):
|
|
|
@@ -274,20 +265,45 @@ class SaleOrderTemplate(models.Model):
|
|
|
"""
|
|
|
Obtiene el mapeo de proyectos según el modo de operación.
|
|
|
Si monthly_invoice_project está activo, crea proyectos mensuales.
|
|
|
- Si no, usa los proyectos originales de la plantilla.
|
|
|
+ Si no, crea una copia del proyecto original para el pedido (con el mismo nombre y fechas del contrato).
|
|
|
"""
|
|
|
if self.monthly_invoice_project:
|
|
|
return self._get_or_create_monthly_projects(order_datetime, sale_order)
|
|
|
else:
|
|
|
- # Usar los proyectos originales de la plantilla
|
|
|
+ # Crear una copia del proyecto original para el pedido (con el mismo nombre y fechas del contrato)
|
|
|
project_map = {}
|
|
|
- for line in self.sale_order_template_line_ids:
|
|
|
- if line.project_id:
|
|
|
- project_map[line.project_id.id] = line.project_id
|
|
|
- # --- Asignar partner de la cuenta analítica solo una vez por proyecto original ---
|
|
|
- for project in set(project_map.values()):
|
|
|
- if project.account_id and project.account_id.partner_id != self.contract_partner_id:
|
|
|
- project.account_id.write({'partner_id': self.contract_partner_id.id})
|
|
|
+ unique_projects = {line.project_id for line in self.sale_order_template_line_ids if line.project_id}
|
|
|
+ for project in unique_projects:
|
|
|
+ # Buscar si ya existe una copia para este pedido, nombre y fechas
|
|
|
+ domain = [
|
|
|
+ ('name', '=', project.name),
|
|
|
+ ('date_start', '=', self.date_start),
|
|
|
+ ('date', '=', self.date_end),
|
|
|
+ ]
|
|
|
+ if sale_order:
|
|
|
+ domain.append(('reinvoiced_sale_order_id', '=', sale_order.id))
|
|
|
+ project_copy = self.env['project.project'].search(domain, limit=1)
|
|
|
+ vals = {
|
|
|
+ 'name': project.name,
|
|
|
+ 'date_start': self.date_start,
|
|
|
+ 'date': self.date_end,
|
|
|
+ 'sale_line_id': False
|
|
|
+ }
|
|
|
+ # Asignar allow_billable y partner_id si corresponde
|
|
|
+ first_line = next((l for l in self.sale_order_template_line_ids if l.project_id and l.project_id.id == project.id and l.contract_partner_id), None)
|
|
|
+ if first_line:
|
|
|
+ vals['allow_billable'] = True
|
|
|
+ vals['partner_id'] = self.contract_partner_id.id
|
|
|
+ if sale_order:
|
|
|
+ vals['reinvoiced_sale_order_id'] = sale_order.id
|
|
|
+ vals['sale_line_id'] = False
|
|
|
+ if not project_copy:
|
|
|
+ project_copy = project.copy(vals)
|
|
|
+ project_copy.write({'sale_line_id': False})
|
|
|
+ else:
|
|
|
+ project_copy.write(vals)
|
|
|
+ project_copy.write({'sale_line_id': False})
|
|
|
+ project_map[project.id] = project_copy
|
|
|
return project_map
|
|
|
|
|
|
def _process_order_and_projects(self, order, project_map):
|