o
    }sÃil?  ã                   @   s
  d dl Z d dlZd dlmZ dZdd„ Zdd„ Zded	efd
d„Z				dJdeded	ededededede	fdd„Z
d	edefdd„ZdKd	efdd„Zd	efdd„Zded	efdd„Zdeded	efdd„Zde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fd&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d0ed	efd1d2„Zd3ed	efd4d5„Zd	efd6d7„Zd3ed8ed	efd9d:„Zd0ed	efd;d<„Zd	ede	fd=d>„ZdKd?ed	efd@dA„Zd?edBed	efdCdD„Zd	ede fdEdF„Z!dGe d	efdHdI„Z"dS )Lé    N)Údatetimea3  
CREATE TABLE IF NOT EXISTS orders (
    number TEXT PRIMARY KEY,
    date TEXT,
    status TEXT,
    buyerName TEXT,
    buyerName1 TEXT,
    buyerStreet TEXT,
    buyerPostalCode TEXT,
    buyerCity TEXT,
    buyerCountry TEXT,
    buyerEMail TEXT,
    buyerPhone TEXT,
    buyerTaxNumber TEXT,
    deliveryName TEXT,
    deliveryStreet TEXT,
    deliveryPostalCode TEXT,
    deliveryCity TEXT,
    deliveryCountry TEXT,
    items TEXT,
    deliveryMethod TEXT,
    methodOfPayment TEXT,
    totalAmountInDomCurr REAL,
    documentCurrency TEXT,
    remarks TEXT,
    shopify_id TEXT,
    shopify_order_name TEXT,
    shopify_customer_name TEXT,
    shopify_financial_status TEXT,
    shopify_fulfillment_status TEXT,
    language TEXT,
    updated_at TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS products (
    productCode TEXT PRIMARY KEY,
    name TEXT,
    englishName TEXT,
    germanName TEXT,
    barcode TEXT,
    defaultWarehouseLocation TEXT
);

CREATE TABLE IF NOT EXISTS skipped_orders (
    order_number TEXT PRIMARY KEY
);

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    email TEXT UNIQUE NOT NULL,
    password_hash TEXT NOT NULL,
    created_at TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS settings (
    key TEXT PRIMARY KEY,
    value TEXT
);
c              	   C   sb   t  | ¡}| t¡ dD ]\}}z| d|› d|› ¡ W q ty&   Y qw | ¡  | ¡  d S )N)
)ÚlanguageÚTEXT)ÚdeliveryNamer   )ÚdeliveryStreetr   )ÚdeliveryPostalCoder   )ÚdeliveryCityr   )ÚdeliveryCountryr   )Úshopify_order_namer   )Úshopify_customer_namer   )Úshopify_financial_statusr   )Úshopify_fulfillment_statusr   zALTER TABLE orders ADD COLUMN ú )Úsqlite3ÚconnectÚexecutescriptÚSCHEMAÚexecuteÚ	ExceptionÚcommitÚclose)Údb_pathÚconÚcolÚ
definition© r   ú)/var/www/warehouse.soldered.com/app/db.pyÚinit_dbC   s   

ÿr   c                 C   s   t  | ¡}t j|_|S ©N)r   r   ÚRowÚrow_factory)r   r   r   r   r   Úget_db[   s   
r!   Úordersr   c                 C   s‚  t |ƒ}z·| D ]©}| d¡}t|ttfƒrt |¡}| d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¡| d¡| d¡| d¡| d¡| d¡| d¡t 	¡  
¡ dœ	¥¡ q| ¡  W | ¡  d S | ¡  w )NÚitemsa?	  INSERT INTO orders (
                    number, date, status,
                    buyerName, buyerName1,
                    buyerStreet, buyerPostalCode, buyerCity, buyerCountry,
                    buyerEMail, buyerPhone, buyerTaxNumber,
                    deliveryName, deliveryStreet, deliveryPostalCode, deliveryCity, deliveryCountry,
                    items, deliveryMethod, methodOfPayment,
                    totalAmountInDomCurr, documentCurrency,
                    remarks, shopify_id, language, updated_at
                ) VALUES (
                    :number, :date, :status,
                    :buyerName, :buyerName1,
                    :buyerStreet, :buyerPostalCode, :buyerCity, :buyerCountry,
                    :buyerEMail, :buyerPhone, :buyerTaxNumber,
                    :deliveryName, :deliveryStreet, :deliveryPostalCode, :deliveryCity, :deliveryCountry,
                    :items, :deliveryMethod, :methodOfPayment,
                    :totalAmountInDomCurr, :documentCurrency,
                    :remarks, :shopify_id, :language, :updated_at
                )
                ON CONFLICT(number) DO UPDATE SET
                    date=excluded.date, status=excluded.status,
                    buyerName=excluded.buyerName, buyerName1=excluded.buyerName1,
                    buyerStreet=excluded.buyerStreet, buyerPostalCode=excluded.buyerPostalCode,
                    buyerCity=excluded.buyerCity, buyerCountry=excluded.buyerCountry,
                    buyerEMail=excluded.buyerEMail, buyerPhone=excluded.buyerPhone,
                    buyerTaxNumber=excluded.buyerTaxNumber,
                    deliveryName=excluded.deliveryName, deliveryStreet=excluded.deliveryStreet,
                    deliveryPostalCode=excluded.deliveryPostalCode, deliveryCity=excluded.deliveryCity,
                    deliveryCountry=excluded.deliveryCountry,
                    items=excluded.items, deliveryMethod=excluded.deliveryMethod,
                    methodOfPayment=excluded.methodOfPayment,
                    totalAmountInDomCurr=excluded.totalAmountInDomCurr,
                    documentCurrency=excluded.documentCurrency,
                    remarks=excluded.remarks,
                    shopify_id=COALESCE(excluded.shopify_id, orders.shopify_id),
                    language=excluded.language, updated_at=excluded.updated_atÚnumberÚdateÚstatusÚ	buyerNameÚ
buyerName1ÚbuyerStreetÚbuyerPostalCodeÚ	buyerCityÚbuyerCountryÚ
buyerEMailÚ
buyerPhoneÚbuyerTaxNumberr   Ú r   r   r   r	   ÚdeliveryMethodÚmethodOfPaymentÚtotalAmountInDomCurrÚdocumentCurrencyÚremarksÚ
shopify_idr   )	r#   r1   r2   r3   r4   r5   r6   r   Ú
updated_at)r!   ÚgetÚ
isinstanceÚdictÚlistÚjsonÚdumpsr   r   ÚutcnowÚ	isoformatr   r   )r"   r   r   Úorderr#   r   r   r   Úupsert_ordersc   sp   

$
ÿ
þ
ý
ü
û
ú
ù
ø
	÷

ö
õ
ôóòñðï
æÛ
BrA   r$   r6   r
   r   r   r   Úreturnc           	   	   C   sH   t |ƒ}z| d|||||| f¡}| ¡  |jdkW | ¡  S | ¡  w )u~   Update shopify_id (and optional Shopify metadata) for an order by its e-raÄuni number.
    Returns True if the order existed.a•  UPDATE orders
               SET shopify_id = ?,
                   shopify_order_name = COALESCE(?, shopify_order_name),
                   shopify_customer_name = COALESCE(?, shopify_customer_name),
                   shopify_financial_status = COALESCE(?, shopify_financial_status),
                   shopify_fulfillment_status = COALESCE(?, shopify_fulfillment_status)
               WHERE number = ?r   )r!   r   r   Úrowcountr   )	r$   r6   r   r
   r   r   r   r   Úcurr   r   r   Úset_order_shopify_id±   s   ÿø
rE   c                 C   ó:   t | ƒ}z| d¡ ¡ }dd„ |D ƒW | ¡  S | ¡  w )zOReturn all orders (with or without a Shopify link), ordered by date descending.an  SELECT number, date, buyerName, status, shopify_id,
                      shopify_order_name, shopify_customer_name,
                      shopify_financial_status, shopify_fulfillment_status,
                      totalAmountInDomCurr, documentCurrency
               FROM orders
               WHERE status != 'Draft'
               ORDER BY date DESC, number DESCc                 S   ó   g | ]}t |ƒ‘qS r   ©r:   ©Ú.0Úrr   r   r   Ú
<listcomp>Ø   ó    z%get_sync_mappings.<locals>.<listcomp>©r!   r   Úfetchallr   ©r   r   Úrowsr   r   r   Úget_sync_mappingsË   s   ÿø	rR   c                 C   sf   |d u rdg}t | ƒ}z"d dd„ |D ƒ¡}| d|› d|¡ ¡ }dd„ |D ƒW | ¡  S | ¡  w )	NÚDraftú,c                 s   s    | ]}d V  qdS )ú?Nr   )rJ   Ú_r   r   r   Ú	<genexpr>â   s   € z!get_all_orders.<locals>.<genexpr>z*SELECT * FROM orders WHERE status NOT IN (z!) ORDER BY date DESC, number DESCc                 S   rG   r   rH   rI   r   r   r   rL   ç   rM   z"get_all_orders.<locals>.<listcomp>)r!   Újoinr   rO   r   )r   Úexclude_statusesr   ÚplaceholdersrQ   r   r   r   Úget_all_ordersÝ   s   
þýr[   c                 C   rF   )NzîSELECT o.* FROM orders o
               WHERE o.status = 'Processing'
                 AND o.number LIKE '%S%'
                 AND o.number NOT IN (SELECT order_number FROM skipped_orders)
               ORDER BY o.date ASC, o.number ASCc                 S   rG   r   rH   rI   r   r   r   rL   ö   rM   z)get_processing_orders.<locals>.<listcomp>rN   rP   r   r   r   Úget_processing_ordersì   s   ÿúr\   c                 C   ó@   t |ƒ}z| d| f¡ ¡ }|rt|ƒnd W | ¡  S | ¡  w )Nz%SELECT * FROM orders WHERE number = ?©r!   r   Úfetchoner:   r   )r$   r   r   Úrowr   r   r   Ú	get_orderû   ó
   ra   c                 C   s:   t |ƒ}z| d|| f¡ | ¡  W | ¡  d S | ¡  w )Nz1UPDATE orders SET shopify_id = ? WHERE number = ?©r!   r   r   r   )r$   r6   r   r   r   r   r   Úupdate_order_shopify_id  s
   
rd   r&   c                 C   sD   t |ƒ}z| d|t ¡  ¡ | f¡ | ¡  W | ¡  d S | ¡  w )Nz=UPDATE orders SET status = ?, updated_at = ? WHERE number = ?)r!   r   r   r>   r?   r   r   )r$   r&   r   r   r   r   r   Úupdate_order_status  s   þ
re   c                 C   ó8   t |ƒ}z| d| f¡ | ¡  W | ¡  d S | ¡  w )Nz>INSERT OR IGNORE INTO skipped_orders (order_number) VALUES (?)rc   ©r$   r   r   r   r   r   Ú
skip_order  ó
   
rh   c                 C   rf   )Nz1DELETE FROM skipped_orders WHERE order_number = ?rc   rg   r   r   r   Úunskip_order"  ri   rj   c                 C   rF   )Nz'SELECT order_number FROM skipped_ordersc                 S   s   g | ]}|d  ‘qS )Úorder_numberr   rI   r   r   r   rL   /  rM   z&get_skipped_orders.<locals>.<listcomp>rN   rP   r   r   r   Úget_skipped_orders+  ó
   rl   Úproductsc                 C   sr   t |ƒ}z/| D ]!}| d| d¡| d¡| d¡| d¡| d¡| d¡dœ¡ q| ¡  W | ¡  d S | ¡  w )	NzòINSERT OR REPLACE INTO products
                   (productCode, name, englishName, germanName, barcode, defaultWarehouseLocation)
                   VALUES (:productCode, :name, :englishName, :germanName, :barcode, :defaultWarehouseLocation)ÚproductCodeÚnameÚenglishNameÚ
germanNameÚbarcodeÚdefaultWarehouseLocation)ro   rp   rq   rr   rs   rt   )r!   r   r8   r   r   )rn   r   r   Úpr   r   r   Úupsert_products6  s   úü
rv   Úproduct_codec                 C   r]   )Nz,SELECT * FROM products WHERE productCode = ?r^   )rw   r   r   r`   r   r   r   Úget_productL  rb   rx   c                 C   rF   )Nz/SELECT * FROM products ORDER BY productCode ASCc                 S   rG   r   rH   rI   r   r   r   rL   Y  rM   z$get_all_products.<locals>.<listcomp>rN   rP   r   r   r   Úget_all_productsU  rm   ry   Úuser_idc                 C   r]   )Nz SELECT * FROM users WHERE id = ?r^   )rz   r   r   r`   r   r   r   Úget_user_by_id`  rb   r{   Úemailc                 C   r]   )Nz#SELECT * FROM users WHERE email = ?r^   )r|   r   r   r`   r   r   r   Úget_user_by_emaili  rb   r}   c                 C   rF   )Nz?SELECT id, email, created_at FROM users ORDER BY created_at ASCc                 S   rG   r   rH   rI   r   r   r   rL   v  rM   z!get_all_users.<locals>.<listcomp>rN   rP   r   r   r   Úget_all_usersr  rm   r~   Úpassword_hashc                 C   ó:   t |ƒ}z| d| |f¡ | ¡  W | ¡  d S | ¡  w )Nz@INSERT OR IGNORE INTO users (email, password_hash) VALUES (?, ?)rc   )r|   r   r   r   r   r   r   Úcreate_user{  ó   þ
r   c                 C   rf   )NzDELETE FROM users WHERE id = ?rc   )rz   r   r   r   r   r   Údelete_user‡  ri   rƒ   c                 C   s8   t | ƒ}z| d¡ ¡ }|d dkW | ¡  S | ¡  w )z0Return True if at least one user account exists.zSELECT COUNT(*) as c FROM usersÚcr   ©r!   r   r_   r   )r   r   r`   r   r   r   Úuser_exists  s
   r†   Úkeyc                 C   s@   t |ƒ}z| d| f¡ ¡ }|r|d n|W | ¡  S | ¡  w )Nz(SELECT value FROM settings WHERE key = ?Úvaluer…   )r‡   r   Údefaultr   r`   r   r   r   Úget_settingœ  rb   rŠ   rˆ   c                 C   r€   )Nú:INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)rc   )r‡   rˆ   r   r   r   r   r   Úset_setting¥  r‚   rŒ   c                 C   rF   )z$Return all settings as a plain dict.zSELECT key, value FROM settingsc                 S   s   i | ]	}|d  |d “qS )r‡   rˆ   r   rI   r   r   r   Ú
<dictcomp>¶  s    z$get_all_settings.<locals>.<dictcomp>rN   rP   r   r   r   Úget_all_settings±  s
   rŽ   Údatac                 C   sT   t |ƒ}z |  ¡ D ]\}}|dkr| d||f¡ q	| ¡  W | ¡  dS | ¡  w )u>   Bulk-save a dict of keyâ†’value pairs, skipping empty strings.r0   r‹   N)r!   r#   r   r   r   )r   r   r   r‡   rˆ   r   r   r   Úsave_settings»  s   þ€
r   )NNNNr   )#r   r<   r   r   r   r!   r;   ÚstrrA   ÚboolrE   rR   r[   r\   ra   rd   re   rh   rj   rl   rv   rx   ry   Úintr{   r}   r~   r   rƒ   r†   rŠ   rŒ   r:   rŽ   r   r   r   r   r   Ú<module>   sX    =Oüÿþýü
ü										
