
    +jJ                     T    d dl Z d dlmZmZmZ d dlmZ  G d dej                  ZdS )    N)apifieldsmodels)	UserErrorc                   j    e Zd ZdZ ej        ddd          Z ej        ddddd	d          Z ej        d
ddddd          Z	 ej
        dddd          Z ej        dddd          Z ej        dddddd          Z ej        ddd          Z ej        ddd          Z ej        ddd           Z ej        d!dd"          Z ej        d#dd$          Z ej        d%dd&          Z ej        d'dd(          Z ej        d)dd*          Z ej        d+d,dd-          Z ej        g d.d/d0ddd12          Z ej        d3d4dd5d67          Z ej
        d8dd9:          Z ej        d;d<=          Z ej        d>          d?             Z  ej
        d@ddA:          Z! ej
        dBddC:          Z" ej#        dDddE          Z$ ej        dFdG          Z% ej        dH:          Z& ej        dI:          Z' ej        dJ:          Z( ej        dKdG          Z) ej        dL:          Z* ej        dMdNO          Z+ ej        dPdNO          Z, ej        dQdRO          Z- ej        dSdNO          Z. ej        dTdNO          Z/ ej        dU:          Z0 ej        dV:          Z1 ej        dW:          Z2 ej3        dX:          Z4 ej#        dYdZ[          Z5 ej#        d\d][          Z6 ej#        d^d_[          Z7 ej#        d`da[          Z8 ej#        dbdc[          Z9 ej#        ddd[          Z: ej        de          df             Z; ej        dg          dh             Z< ej        di          dj             Z= ej        dk          dl             Z> ej        dm          dn             Z? ej        dodp          dq             Z@dr ZAds ZBdt ZCdu ZDdv ZEdw ZFdx ZGdy ZHdz ZId{ ZJd| ZKd} ZLd~ ZMd ZNd ZOd ZPd ZQd ZRd ZSejT         fd            ZUd ZV fdZW xZXS )RepairOrderzrepair.order
sale.orderzPresupuesto PrincipalF)stringrequiredrepair_order_sale_order_relrepair_order_idsale_order_idPresupuestospurchase.orderrepair_order_purchase_order_relpurchase_order_idzPedidos de Comprastock.picking	Albaranesaccount.move_compute_invoice_idsFacturas)computer
   r   relsum.machineu   MáquinarestrictTu@   Máquina del cliente. Permite trazabilidad histórica entre OTs.)r
   ondeleteindextrackinghelpzrelsum_machine_id.marcau   Marca (de la máquina))relatedreadonlyr
   zrelsum_machine_id.tipou   Tipo (de la máquina)zrelsum_machine_id.numero_serieu   Nº serie (de la máquina)zrelsum_machine_id.kvau   kVA (de la máquina)zrelsum_machine_id.voltiosu   Voltios (de la máquina)zrelsum_machine_id.rpmu   RPM (de la máquina)zrelsum_machine_id.amperiosu   Amperios (de la máquina)zrelsum_machine_id.hzu   Hz (de la máquina)zres.partnerzrelsum_machine_id.planta_idu   Planta (de la máquina)))receivedRecibida)
diagnosticu   En diagnóstico)quotedPresupuestada)in_progressu   En reparación)readyzLista para entrega)	delivered	Entregada)invoiced	FacturadaFaser!   zEFase del procedimiento RELSUM. Avanza con los botones del encabezado.)	selectionr
   defaultr   copyr   account.analytic.accountu   Cuenta analíticaz"analytic.group_analytic_accountingui   Se crea automáticamente al crear la OT. Sólo visible para usuarios del grupo "Contabilidad analítica".)r
   r/   groupsr   zaccount.analytic.linezPartes de trabajo)r
   zHoras totales_compute_timesheet_hours)r
   r   ztimesheet_ids.unit_amountc                 h    | D ].}t          |j                            d                    |_        /d S )Nunit_amount)sumtimesheet_idsmappedtimesheet_hoursselfrecs     8/opt/odoo/custom_addons/ot_relsum/models/repair_order.pyr2   z$RepairOrder._compute_timesheet_hours   sC     	O 	OC"%c&7&>&>}&M&M"N"NC	O 	O    relsum.technical.report   Informes técnicosrelsum.petty.cash.refCajas RHu   Nº OT (legacy))r
   r   r/   u   Nº Presupuesto)r
   r   u   Nº Pedido ClienteMarcazTipo / Modelou	   Nº SeriePlantazVoltios (V))
      )r
   digitszPotencia (kVA)RPM)rD   r   zAmperios (A)zFrecuencia (Hz)u   Nº Albarán (texto legacy)u   Nota Albaránz#Pedido a Proveedores (texto legacy)Comentarios_compute_sale_order_countu   Nº de presupuestos)r   r
   _compute_purchase_order_countu   Nº de compras_compute_picking_countu   Nº de albaranes_compute_technical_report_countu   Nº de informes_compute_petty_cash_ref_countu   Nº de cajasu   Nº de facturassale_order_idsc                 B    | D ]}t          |j                  |_        d S N)lenrN   sale_order_countr9   s     r<   rI   z%RepairOrder._compute_sale_order_count   s1     	; 	;C#&s'9#:#:C  	; 	;r=   purchase_order_idsc                 B    | D ]}t          |j                  |_        d S rP   )rQ   rS   purchase_order_countr9   s     r<   rJ   z)RepairOrder._compute_purchase_order_count   5     	C 	CC'*3+A'B'BC$$	C 	Cr=   picking_idsc                 B    | D ]}t          |j                  |_        d S rP   )rQ   rW   picking_countr9   s     r<   rK   z"RepairOrder._compute_picking_count   s0     	5 	5C #CO 4 4C	5 	5r=   technical_report_idsc                 B    | D ]}t          |j                  |_        d S rP   )rQ   rZ   technical_report_countr9   s     r<   rL   z+RepairOrder._compute_technical_report_count   s5     	G 	GC),S-E)F)FC&&	G 	Gr=   petty_cash_ref_idsc                 B    | D ]}t          |j                  |_        d S rP   )rQ   r]   petty_cash_ref_countr9   s     r<   rM   z)RepairOrder._compute_petty_cash_ref_count   rV   r=   zsale_order_ids.invoice_idszsale_order_id.invoice_idsc                     | D ]c}|j                             d          }|j        r||j        j        z  }|                    d           }||_        t          |          |_        dd S )Ninvoice_idsc                     | j         dv S )N)out_invoice
out_refund)	move_type)ms    r<   <lambda>z2RepairOrder._compute_invoice_ids.<locals>.<lambda>   s    Q[<Y-Y r=   )rN   r7   r   ra   filteredrQ   invoice_count)r:   r;   movess      r<   r   z RepairOrder._compute_invoice_ids   sy     	+ 	+C&--m<<E  7*66NN#Y#YZZE#CO #E

C	+ 	+r=   c                 |    |                                   dddddd| j        j        fg| j        j        | j        ddS )	Nir.actions.act_windowr   	list,formr	   idin)default_partner_iddefault_repair_order_idtypename	view_mode	res_modeldomaincontext)
ensure_onerN   ids
partner_idrn   r:   s    r<   action_view_sale_ordersz#RepairOrder.action_view_sale_orders   sW    +"$%dD$7$;<=&*o&8+/7 

 

 
	
r=   c                 V    |                                   dddddd| j        j        fgdS )Nrl   zPedidos a Proveedorrm   r   rn   ro   rs   rt   ru   rv   rw   )ry   rS   rz   r|   s    r<   action_view_purchase_ordersz'RepairOrder.action_view_purchase_orders   s@    +)$)dD$;$?@A
 
 	
r=   c                 V    |                                   dddddd| j        j        fgdS )Nrl   r   rm   r   rn   ro   r   )ry   rW   rz   r|   s    r<   action_view_pickingsz RepairOrder.action_view_pickings   s@    +$(dD$4$89:
 
 	
r=   c                 f    |                                   dddddd| j        j        fgd| j        idS )	Nrl   r?   rm   r>   rn   ro   rq   rr   )ry   rZ   rz   rn   r|   s    r<   action_view_technical_reportsz)RepairOrder.action_view_technical_reports  sJ    +($2dD$=$ABC147;
 
 	
r=   c                 f    |                                   dddddd| j        j        fgd| j        idS )	Nrl   rA   rm   r@   rn   ro   rq   rr   )ry   r]   rz   rn   r|   s    r<   action_view_petty_cashz"RepairOrder.action_view_petty_cash  sJ    +$0dD$;$?@A147;
 
 	
r=   c                 V    |                                   dddddd| j        j        fgdS )Nrl   r   rm   r   rn   ro   r   )ry   ra   rz   r|   s    r<   action_view_invoicesz RepairOrder.action_view_invoices  s@    +$'dD$4$89:
 
 	
r=   c                    |                                   | j        r |                     d| j        j                  S | j        d                             | j        j        | j        pd| j        pd| j	        pd| j
        pd| j        pd| j        pd| j        pd| j        pdd	          }|j        | _        |                     d|j                  S )u   Crea una máquina pre-rellenada con los datos legacy de la OT
        y la asocia al campo relsum_machine_id. Si ya existe, abre la
        existente.r   Fr   )	r{   marcatiponumero_serievoltioskvarpmamperioshz)ry   relsum_machine_id_open_recordrn   envcreater{   x_marcax_tipo_maquinax_numero_serie	x_voltiosx_kvax_rpm
x_amperiosx_hz)r:   machines     r<   action_create_machinez!RepairOrder.action_create_machine'  s     	! 	R$$%5t7M7PQQQ(+,33/,\*U'05 /85~*:?:?,1).q
5
 
5
 
 
 ")  !17:>>>r=   c                 (   |                                   | j        d                             | j        j        | j        d          }d|j        fg| _        | j        s|j        | _        | j        dv rd| _        |                     d|j                  S )z<Crea un sale.order pre-rellenado con cliente + OT y lo abre.r	   )r{   r      )r!   r#   r$   )	ry   r   r   r{   rn   rN   r   relsum_workflow_stager   )r:   sales     r<   action_create_salezRepairOrder.action_create_sale=  s    x%,,/,#w.
 .
   !"47|n! 	)!%D%)CCC)1D&  tw777r=   c           	      T    |                                   dddddddd| j        gfgid	S )
z=Abre el formulario de purchase.order con la OT pre-vinculada.rl   zNuevo pedido a proveedorr   formcurrentdefault_repair_order_ids   r   rs   rt   rv   ru   targetrx   )ry   rn   r|   s    r<   action_create_purchasez"RepairOrder.action_create_purchaseL  sH    +.)*aTWI->,?	
 	
 		
r=   c           
      (   |                                   | j        d                             ddd| j        j        j        fgd          p"| j        d                             dgd          }ddd	d
d| j        j        |r|j        nd| j        dddS )z8Abre formulario de stock.picking outgoing pre-rellenado.zstock.picking.type)code=outgoingzwarehouse_id.company_idr      limitrl   u   Nuevo albaránr   r   r   Frepair)rp   default_picking_type_idrq   default_tipo_albaranr   )ry   r   searchcompanyrn   r{   )r:   pt_outs     r<   action_create_pickingz!RepairOrder.action_create_pickingZ  s    ./66%&TX-=-@A8
  7   c x 45<<>W=X`a<bb 	
 ,$(&*o&88>+I699E+/7(0	 
 
 	
r=   c                    |                                   | j        }|s%| j                            d           }|dd         }|st	          d          |j        dk    r t	          d|j        d|j        d          |                                }|st	          d	          | j        d
v rd| _        | 	                    d|d         j
                  S )zAGenera factura desde el presupuesto confirmado vinculado a la OT.c                     | j         dk    S )Nr   )state)ss    r<   rg   z3RepairOrder.action_create_invoice.<locals>.<lambda>t  s    qw&?P r=   Nr   z'Esta OT no tiene presupuesto vinculado.r   zEl presupuesto u    no está confirmado (estado=u   ). Confírmalo primero.u7   No se generaron facturas (¿ya estaba todo facturado?).)r'   r(   r*   r   r   )ry   r   rN   rh   r   r   rt   _create_invoicesr   r   rn   )r:   r   	confirmedinvoicess       r<   action_create_invoicez!RepairOrder.action_create_invoiceo  s    ! 	!+445P5PQQIRaR=D 	GEFFF:)*.)))TZZZA   ((** 	WUVVV%)???)3D&  !@@@r=   c                     d|d|ddS )Nrl   r   r   )rs   rv   ru   res_idr    )r:   modelr   s      r<   r   zRepairOrder._open_record  s     +
 
 	
r=   c                 4    |                      ddi           d S )Nr   r!   writer|   s    r<   action_stage_receivedz!RepairOrder.action_stage_received       

+Z899999r=   c                 4    |                      ddi           d S )Nr   r#   r   r|   s    r<   action_stage_diagnosticz#RepairOrder.action_stage_diagnostic  s     

+\:;;;;;r=   c                 4    |                      ddi           d S )Nr   r$   r   r|   s    r<   action_stage_quotedzRepairOrder.action_stage_quoted  s     

+X677777r=   c                 4    |                      ddi           d S )Nr   r&   r   r|   s    r<   action_stage_in_progressz$RepairOrder.action_stage_in_progress  s     

+];<<<<<r=   c                 4    |                      ddi           d S )Nr   r'   r   r|   s    r<   action_stage_readyzRepairOrder.action_stage_ready  s     

+W566666r=   c                 4    |                      ddi           d S )Nr   r(   r   r|   s    r<   action_stage_deliveredz"RepairOrder.action_stage_delivered  s     

+[9:::::r=   c                 4    |                      ddi           d S )Nr   r*   r   r|   s    r<   action_stage_invoicedz!RepairOrder.action_stage_invoiced  r   r=   c                    |D ]W}|                     d          r|                     d          dk    r'| j        d                             d          }|r||d<   Xt                                          |          }| j        d                                                             g d          }|r| j        d                                         }|D ]}|                                j        s{|j        pd	d
|j	        j        pd|j
        d}|j	        r|j	        j
        |d<   |                    |          }	|                                                    d|	j
        i           |S )Nrt   /ir.sequencerepair.order.otzaccount.analytic.planr   r   r0   z(OT sin nombre)z - zsin cliente)rt   plan_idr{   analytic_account_id)getr   next_by_codesuperr   sudor   r   rt   r{   rn   r   )r:   	vals_listvalsseqrecordsplanAAraa_valsaa	__class__s             r<   r   zRepairOrder.create  s    	' 	'D88F## 'txx'7'73'>'>h}-::;LMM '#&DL''..++ x/05577>>r>KK 	C45::<<B C Cvvxx3 C F7&777L->>! $(7 G | @01-7++BFFHHNN$925#ABBBr=   c                     |                                   | j        rPt          j        d| j                                                  }|r"t          |                    d                    S dS )u   Nº correlativo si el name sigue el patrón de la secuencia (OT-NNNNN).
        Devuelve int o False (las OTs legacy 'WH/RO/...' no cuentan).z^OT-0*(\d+)$r   F)ry   rt   rematchstripintgroup)r:   rf   s     r<   _ot_sequence_numberzRepairOrder._ot_sequence_number  s^     	9 	'$)//*;*;<<A '1771::&ur=   c                 f   d d | D             D             }t                                                      }|rw| j        d                                                             dgd          }|r@|                    dg           |j        }|}|dz
  }||v r|}|dz  }||v ||k     r||_        |S )Nc                     h | ]}||S r   r   ).0ns     r<   	<setcomp>z%RepairOrder.unlink.<locals>.<setcomp>  s-     
 
 
a

 
 
r=   c              3   >   K   | ]}|                                 V  d S rP   )r   )r   r;   s     r<   	<genexpr>z%RepairOrder.unlink.<locals>.<genexpr>  s.      BBc//11BBBBBBr=   r   )r   r   r   r   r   number_next_actual)r   unlinkr   r   r   invalidate_recordsetr   )r:   deleted_numsresr   next_actualrollback_tocurr   s          r<   r   zRepairOrder.unlink  s    
 
BBTBBB
 
 
 ggnn 	9(=)..007712! 8  C  9 ((*>)?@@@!4
 *!Ao\))"%K1HC \)) ,,-8C*
r=   )Y__name__
__module____qualname___inheritr   Many2oner   	Many2manyrN   rS   One2manyrW   ra   r   Charmachine_marcamachine_tipomachine_numero_serieFloatmachine_kvamachine_voltiosmachine_rpmmachine_amperios
machine_hzmachine_planta_id	Selectionr   r   r6   r8   r   dependsr2   rZ   r]   Integerx_numero_otx_presupuestox_numero_pedidor   r   r   x_plantar   r   r   r   r   	x_albaranx_albaran_notax_pedido_proveedorTextx_comentariosrR   rU   rY   r\   r_   ri   rI   rJ   rK   rL   rM   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   model_create_multir   r   r   __classcell__)r   s   @r<   r   r      s       H $FO&  M &V%%  N *))"   "&/	  K #&"&	  K (O    FK(ADYqrrrM6;'?$WnoooL&6;/OZ^  hD  E  E  E&,'>VlmmmK"fl+FQU^xyyyO&,'>VlmmmK#v|,HSW`{|||&<tTijjjJ'?\gk  uN  O  O  O -F,
 
 
 T  * *&/""3P   $FO"  M
 #fl*  O
 S[,--O O .-O +6?!#   )   !&.(9ERRRKFK'8EEEM!fk)=>>>Ofk)))G V[888N V[4@@@Nv{(+++HM'BBBIFL 0AAAEFLg666E^GDDDJ6<0AAAD#@AAAI V[888N$,QRRRFK}555M &v~.IRghhh)6>2QZjkkk"FN+CL^___M+V^4U^oppp)6>2QZhiii"FN+AJ[\\\MS[!""; ; #"; S[%&&C C '&C S[5 5  5 S['((G G )(G S[%&&C C '&C S[-/JKK+ + LK+
 
 

 
 

 
 
	
 	
 	
	
 	
 	

 
 
? ? ?,8 8 8
 
 

 
 
*A A A,
 
 
: : :< < <8 8 8= = =7 7 7; ; ;: : : 	    F          r=   r   )	r   odoor   r   r   odoo.exceptionsr   Modelr   r   r=   r<   <module>r%     s~    				 $ $ $ $ $ $ $ $ $ $ % % % % % %l l l l l&, l l l l lr=   