o
    }si}$                     @   s   d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZ h dZh dZd	ed
efddZded
efddZded
efddZded
eeddf fddZded
eeddf fddZded
eeddf fddZdS )u  Sync orders and products from e-računi (source of truth).

Order sync strategy — two SalesOrderList calls, results merged:
  1. dateFrom = 2 weeks ago  → all recent orders regardless of status
  2. status = Draft          → older drafts that may predate the window
  3. status = PartialDelivery→ older partially-delivered orders

No per-order API calls are made. No writes to e-računi during sync.
VAT/OIB fixes are applied when an individual order is processed (Step 1).
    N)datetime	timedelta)	Generator)eracuni)upsert_ordersupsert_productsset_order_shopify_id>   BAHRMERSXK>   ATCHDELIcountryreturnc                 C   s,   | pd   }|tv rdS |tv rdS dS )N r
   r   EN)stripupper_HR_COUNTRIES_DE_COUNTRIES)r   c r   4/var/www/warehouse.soldered.com/app/services/sync.py_order_language   s   r   rawc                 C   s  |  dp|  dpd|  dp|  dpd|  dp!|  dp!d|  dp,|  d	p,d|  d
p7|  dp7dd}t| rB|S |  dpW|  dpW|  dpW|  dpWi }t|trpzt|}W n tyo   i }Y nw t|trt| r| dp| dpd| dp| dp| dpd| dp| dp| dpd| dpd| dp| dp| dpddS ddddddS )u$  Extract delivery/shipping address from a raw e-računi order dict.

    e-računi may provide it as flat fields (deliveryStreet, …) or as a nested
    Address / ShippingAddress object. Returns a dict with keys:
    name, street, postalCode, city, country  — all may be empty strings.
    deliveryName
shipToNamer   deliveryStreetshipToStreetdeliveryPostalCodeshipToPostalCodedeliveryCity
shipToCitydeliveryCountryshipToCountry)namestreet
postalCodecityr   AddressaddressShippingAddressshippingAddressr)   	buyerNamer*   address1r+   postal_codezipr,   r   countryCodecountry_code)	getanyvalues
isinstancestrjsonloads	Exceptiondict)r   flatnestedr   r   r   _extract_delivery!   s.   	,
   rB   c                 C   sf  |  dp|  dp|  dpg }t|tr)zt|}W n ty(   g }Y nw t| }i d|  dd|  dd|  dd|  dd|  dd	|  d	d
|  d
d|  dd|  dd|  dd|  dd|  dd|d d|d d|d d|d d|d ||  d|  d|  d|  d|  d|  dt|  dd d!S )"u0   Map a raw e-računi order dict to our DB schema.Itemsitems
orderItemsnumberdatestatusr1   
buyerName1buyerStreetbuyerPostalCode	buyerCitybuyerCountry
buyerEMail
buyerPhonebuyerTaxNumberr   r)   r!   r*   r#   r+   r%   r,   r'   r   deliveryMethodmethodOfPaymenttotalAmountInDomCurrdocumentCurrencyremarks
shopify_idr   )rD   rQ   rR   rS   rT   rU   rV   language)r7   r:   r;   r<   r=   r>   rB   r   )r   rD   deliveryr   r   r   
_normalizeE   sh   "









	



rY   db_pathc              
   c   sv   t  tdd d}i }d| dV  z t|}|D ]}|d}|r+|||< qdt| dV  W n tyO } zd	| V  W Y d
}~d
S d
}~ww dV  z-t	d}d}|D ]}|d}|rr||vrr|||< |d7 }q]dt| d| dV  W n ty } zd| V  W Y d
}~nd
}~ww t|}	d|	 dV  dd |
 D }
t|
|  d|	 dV  d
S )u   
    Generator: yields log strings while syncing orders from e-računi.

    Makes 3 SalesOrderList calls and merges results (deduplicated by number).
       )weeksz%Y-%m-%dzFetching orders since u   …rF   u     → z recent orderszERROR (recent orders): Nu"   Fetching PartialDelivery orders…PartialDeliveryr      z partial-delivery orders (z new outside window)z#WARNING (partial-delivery orders): zMerging u    unique orders…c                 S   s   g | ]}t |qS r   )rY   ).0or   r   r   
<listcomp>   s    zsync_orders.<locals>.<listcomp>
   ✓ Saved z orders to local database)r   nowr   strftimeeracuni_svc
get_ordersr7   lenr>   get_orders_by_statusr9   r   )rZ   	date_fromcombinedrecentr`   numepartialaddedtotal
normalizedr   r   r   sync_ordersm   sJ   




rr   c              
   c   sV   ddl m} dV  z|jdd}W n ty+ } zd| V  W Y d}~dS d}~ww dt| d	V  d}|D ]c}t|d
 }|dd}|d}|dpRi }	|	dpYd}
|	dp`d}|
 d|  }|s{|dpri }|ddpzd}|dpd}|dpd}|rt	||| ||pd||dr|d7 }q9d| dt| dV  dS )u   Fetch all recent Shopify orders and write their IDs to matching local orders.

    Matching is done by Shopify order name (e.g. '#S1001') → e-računi number ('S1001').
    Only updates rows that exist in the local DB; does not create new rows.
    r   )shopifyu)   Fetching Shopify orders (last 60 days)…<   )
limit_dayszERROR fetching Shopify orders: NGot z orders from Shopifyidr)   r   #customer
first_name	last_name shipping_addressfinancial_statusfulfillment_statusunfulfilled)shopify_order_nameshopify_customer_nameshopify_financial_statusshopify_fulfillment_statusr^   u   ✓ Linked z of u)    Shopify orders to local e-računi orders)
app.servicesrs   get_all_ordersr>   rg   r;   r7   lstripr   r   )rZ   shopify_svcshopify_ordersrm   matchedorderrV   r)   	er_numberry   firstlastcustomer_nameshippingr~   r   r   r   r   sync_shopify_ids   sF   
r   c              
   c   s    dV  zt  }W n ty# } zd| V  W Y d}~dS d}~ww dt| dV  dd |D }t||  dt| dV  dS )	uD   Generator: yields log strings while syncing products from e-računi.u#   Fetching products from e-računi…zERROR fetching products: Nrv   z	 productsc              
   S   sL   g | ]"}| d r| d | d| d| d| d| ddqS )productCoder)   englishName
germanNamebarCodedefaultWarehouseLocation)r   r)   r   r   barcoder   )r7   )r_   pr   r   r   ra      s    	z!sync_products.<locals>.<listcomp>rb   )re   get_productsr>   rg   r   )rZ   r   rm   productsr   r   r   sync_products   s   	
r   )__doc__r<   r   r   typingr   r   r   re   app.dbr   r   r   r   r   r;   r   r?   rB   rY   rr   r   r   r   r   r   r   <module>   s    
	$(- /