+
    xuëiÑ  ã                  ó^   € R t ^ RIHt ^ RIt^ RIt^ RIHt R tR t]	R8X  d
   ]! 4        R# R# )a!  
Merge duplicate parts where one record has part_number like PK-<id>
and another record has blank part_number for the same name.

Keeps the blank-part-number row as canonical (usually has correct unit like 'pcs'),
moves images from PK row, copies source_partkeepr_id, then deletes PK row.
)ÚannotationsN)Ú
DictCursorc                 ó>  € \         P                  ! R R7      p V P                  RRR7       V P                  R\        RR7       V P                  RR	R
7       V P                  RRR7       V P                  RRR7       V P                  RRR7       V P	                  4       # )z2Reconcile PK-* duplicate parts in parts_inventory.)Údescriptionz--hostT)Úrequiredz--portiê  )ÚtypeÚdefaultz
--databaseÚparts_inventory)r   z--userz
--passwordz	--dry-runÚ
store_true)Úaction)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_args)Úparsers    Ú@C:\Users\Bill\Software\Server\scripts\reconcile_pk_duplicates.pyr   r      s—   € Ü×$Ò$Ð1eÔf€FØ
×Ñ˜¨4ÐÔ0Ø
×Ñ˜¤s°DÐÔ9Ø
×Ñ˜Ð.?ÐÔ@Ø
×Ñ˜¨4ÐÔ0Ø
×Ñ˜¨tÐÔ4Ø
×Ñ˜¨LÐÔ9Ø×ÑÓÐó    c            
     óî  € \        4       p \        P                  ! V P                  V P                  V P
                  V P                  V P                  \        R R7      p^ p^ p VP                  4       ;_uu_ 4       pVP                  R4       VP                  4       pV EF  pVR,          pVR,          pVP                  RWx34       W4P                  ,          pVR,          R9  d
   VR,          MVR,          p	VR	,          '       d
   VR	,          MVR
,          ;'       g    Rp
VR,          e
   VR,          MVR,          pVeI   VP                  RV34       VP                  RW·V34       VP                  4       pV'       d
   VR,          pVP                  RWšW·34       VP                  RV34       V^,          pEK"  	  RRR4       V P                  '       d   VP                  4        MVP!                  4        \#        RV RV RV P                   24        TP'                  4        R#   + '       g   i     Lt; i  \$         d    TP                  4        h i ; i  TP'                  4        i ; i)F)ÚhostÚportÚuserÚpasswordÚdatabaseÚcursorclassÚ
autocommitaU  
                SELECT
                  blank.id AS keep_id,
                  blank.name,
                  blank.part_number AS keep_part_number,
                  blank.quantity AS keep_quantity,
                  blank.unit AS keep_unit,
                  blank.source_partkeepr_id AS keep_source_id,
                  pk.id AS drop_id,
                  pk.part_number AS drop_part_number,
                  pk.quantity AS drop_quantity,
                  pk.unit AS drop_unit,
                  pk.source_partkeepr_id AS drop_source_id
                FROM parts blank
                JOIN parts pk ON pk.name = blank.name
                WHERE (blank.part_number IS NULL OR blank.part_number = '')
                  AND pk.part_number LIKE 'PK-%'
                  AND blank.id <> pk.id
                ORDER BY blank.id, pk.id
                Úkeep_idÚdrop_idz6UPDATE part_images SET part_id = %s WHERE part_id = %sÚkeep_quantityNÚdrop_quantityÚ	keep_unitÚ	drop_unitÚ Úkeep_source_idÚdrop_source_idz9UPDATE parts SET source_partkeepr_id = NULL WHERE id = %szÎ
                        SELECT id FROM parts
                        WHERE source_partkeepr_id = %s
                          AND id NOT IN (%s, %s)
                        LIMIT 1
                        a  
                    UPDATE parts
                    SET quantity = %s,
                        unit = %s,
                        source_partkeepr_id = %s,
                        updated_at = CURRENT_TIMESTAMP
                    WHERE id = %s
                    zDELETE FROM parts WHERE id = %szReconcile complete: merged=z moved_images=z	 dry_run=)Né    )r   ÚpymysqlÚconnectr   r   r   r   r   r   ÚcursorÚexecuteÚfetchallÚrowcountÚfetchoneÚdry_runÚrollbackÚcommitÚprintÚ	ExceptionÚclose)ÚargsÚconnÚmergedÚmoved_imagesÚcurÚpairsÚpairr   r   Úmerged_quantityÚmerged_unitÚmerged_sourceÚ	collisions                r   Úmainr>      s.  € Ü‹<€DÜ�?Š?Ø�Y‰YØ�Y‰YØ�Y‰YØ—‘Ø—‘ÜØô€Dð €FØ€LðQØ�[‰[�]Œ]˜cØ�K‰Kðôð, —L‘L“NˆEä�Ø˜y�/�Ø˜y�/�ð —‘ÐTÐW^ÐVhÔiØ§¡Õ,�ð <@ÀÕ;PÐXaÔ;a $ Ö"7ÐgkÐl{Õg|�Ø37¸×3DÔ3D˜d ;Ö/È4ÐP[ÕK\×KbÐKbÐ`b�Ø:>Ð?OÕ:PÒ:\ Ð%5Ö 6ÐbfÐgwÕbx�ð !Ò,Ø—K‘KÐ [Ð^eÐ]gÔhØ—K‘Kðð '°Ð9ôð !$§¡£�Iß à(,Ð-=Õ(>˜à—‘ðð %°=ÐJô
ð —‘Ð=À¸zÔJØ˜!•“ñY ÷3 ðN �<�<ˆ<Ø�M‰M�Oà�K‰KŒMÜÐ+¨F¨8°>À,ÀÈyÐY]×YeÑYeÐXfÐgÕhð
 	�
‰
Ž÷a �]ûôX ô Ø�‰ŒØðûð 	�
‰
�úsD   Á#I Á;BH/Ä	H/Ä"B!H/ÇI Ç?I È/H?	È:I ÉIÉI" É"I4Ú__main__)
Ú__doc__Ú
__future__r   r   r&   Úpymysql.cursorsr   r   r>   Ú__name__© r   r   Ú<module>rE      s8   ðñõ #ã ã Ý &òò^ðB ˆzÔÙ†Fñ r   