HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/web/hyperflight/apps/inxpress/prev/2025-11-04/__pycache__/app.cpython-311.pyc
�

��iZ���ddlmZmZddlmZmZmZmZmZm	Z	m
Z
mZddlm
Z
mZddlmZddlmZddlmZddlmZmZdd	lmZdd
lZdd
lZddlmZee��Zhd�Zed
���e_e� d��d���Z!ej"d���Z#ej$dd��e_%ej&�'ddd���ej$dd��Z(ej$dd��Z)dEd�Z*d�Z+e� ddd g�!��d"���Z,e� d#��d$���Z-ej$d%d&��d'kr'de_.dej&d(<ej/ej0�)��ed*��Z1e� d+��d,���Z2ee��e� d��d-���Z3e� d.��d/���Z4e� d0��d1���Z5dd2lm
Z
mZddlmZd3�Z6e� d4��d5���Z7e� d6��d7e8fd8���Z9e� d9��d:���Z:e�;d;��d<���Z<e�;d=d>�?��d@���Z=edAkre�>dBdCd�D��d
Sd
S)F�)�urlparse�urljoin)�Flask�session�redirect�url_for�request�abort�render_template�send_from_directory)�Decimal�InvalidOperation�)�get_db)�register_filters��country_name)�datetime�	timedelta��wrapsN)�Path>�/login�/health�/logout�)�hours�/c�:�ttd����S)N�shipments_parsed)rr���0D:\web\hyperflight.live\apps\inxpress\app\app.py�rootr$s���G�.�/�/�0�0�0r"c���tj}|�d��rdS|tvrdSt	jd��rdStjtd<ttd����S)Nz/static/�user�next�login)	r	�path�
startswith�PUBLIC_PATHSr�get�	full_pathrr)�ps r#�require_login_everywherer/sk����A��|�|�J�������L������{�6�������'�G�F�O��G�G�$�$�%�%�%r"�FLASK_SECRETz
replace-meT�Lax)�SESSION_COOKIE_SECURE�SESSION_COOKIE_HTTPONLY�SESSION_COOKIE_SAMESITE�APP_USER�admin�APP_PASS�	hyperbankr c�>�tj�d��ptjdd��}|st|��St
ttj|����}|j	r6|j	t
tj��j	krt|��Stj
pd�d��}|j�
|dz��s|j|krt|��S|jr|���n|S)Nr'z/apps/inxpressr)r	�argsr,r�poprrr�host_url�netloc�script_root�rstripr)r*�scheme�geturl)�
default_ep�nxt�test�prefixs    r#�
_safe_nextrF3s���
�,�
�
�6�
"�
"�
?�g�k�&�$�&?�&?�C��#��z�"�"�"��G�G�,�c�2�2�3�3�D��{�#�t�{�h�w�/?�&@�&@�&G�G�G��z�"�"�"��!�5�%5�
=�
=�c�
B�
B�F��9������-�-�#�$�)�v�2E�2E��z�"�"�"� �K�0�4�;�;�=�=�=�S�0r"c�<��t����fd���}|S)Nc���tjd��tkr�|i|��Stjtd<tt
d����S)Nr&r'r()rr,�USERr	r-rr)r:�kwargs�fns  �r#�wrapzlogin_required.<locals>.wrapGsO����;�v���$�&�&��2�t�&�v�&�&�&�!�+�������(�(�)�)�)r"r)rKrLs` r#�login_requiredrMFs3���
�2�Y�Y�*�*�*�*��Y�*��Kr"r�GET�POST)�methodsc���tjdkr�tj�d��tkr^tj�d��t
kr6ttd<dt_tt����Stdd���Stj�d	��}|r
|td	<td��S)
NrO�ur.r&Tz
login.htmlzInvalid credentials)�errorr')r	�method�formr,rI�PASSr�	permanentrrFrr:)rCs r#r(r(Ps����~�����<���C� � �$�&�&�7�<�+;�+;�C�+@�+@�$�+F�+F�"�G�F�O� $�G���J�L�L�)�)�)��|�3H�I�I�I�I�
�,�
�
�6�
"�
"�C�
�������<�(�(�(r"rc�`�tj��ttd����S)Nr()r�clearrrr!r"r#�logoutrZ_s#���M�O�O�O��G�G�$�$�%�%�%r"�	APP_DEBUG�0�1�PROPAGATE_EXCEPTIONS)�levelzD:\data\inxpress_pdfsz/pdf/<path:fname>c�$�t|��j}|����d��st	d��t
|z}|���st	d��tt
|dd|d���S)zs
    Stream a PDF from D:\data\inxpress_pdfs by file name.
    Prevent directory traversal and 404 if missing.
    z.pdf�zapplication/pdfFr)�mimetype�
as_attachment�
download_name�max_age)r�name�lower�endswithr
�PDF_ROOT�existsr)�fname�	name_only�fpaths   r#�pdf_downloadrnps����U��� �I��?�?���%�%�f�-�-��
�c�
�
�
��y� �E��<�<�>�>��
�c�
�
�
���)�"�������r"c��dS)Nzinxpress app aliver!r!r"r#�homerp�s���r"rc�
�ddiS)N�status�okr!r!r"r#�healthrt�s
���d��r"z	/inxpressc�t�tj�d��}tj�d��}d}t�����5}|�|||||f��|���}ddd��n#1swxYwYtd|||���S)z�
    Mirrors your ASP page but rendered via Jinja.
    - Numeric rules: blank if zero, 2dp for totals
    - Styling: use your existing CSS (copy into app/static/css/site.css)
    �from�toae
        SELECT  InvoiceNo,
                Base, Fuel, Other, Net, VAT, Total,
                Charged, Cost, Calculated,
                InvoiceDate
        FROM    inxpress_invoices
        WHERE   (%s IS NULL OR InvoiceDate >= %s)
        AND     (%s IS NULL OR InvoiceDate <  %s)
        ORDER BY InvoiceDate DESC, InvoiceNo DESC
        LIMIT 500
    Nz
inxpress.html)�rows�	date_from�date_to)r	r:r,r�cursor�execute�fetchallr)ryrz�sql�currxs     r#�inxpressr��s����� � ��(�(�I��� � ��&�&�G�
�C�
�����	�	��c����C�)�Y���A�B�B�B��|�|�~�~���������������������?���T[�\�\�\�\s�!/B�B �#B )rr	c���|���5}|�d|f��d�|���D��cddd��S#1swxYwYdS)z-Return list of column names in display order.z�
          SELECT COLUMN_NAME
          FROM information_schema.COLUMNS
          WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s
          ORDER BY ORDINAL_POSITION
        c��g|]
}|d��S)�COLUMN_NAMEr!��.0�rs  r#�
<listcomp>z&_get_table_columns.<locals>.<listcomp>�s��9�9�9�Q��-� �9�9�9r"N)r{r|r})�conn�tablers   r#�_get_table_columnsr��s���	
�����:�#�����
�X�	�	�	�:�9�#�,�,�.�.�9�9�9�:�:�:�:�:�:�:�:�:�:�:�:����:�:�:�:�:�:s�5A�A�Az
/shipmentsc	��d}t��}tj�d��pd���}tj�d��pd���}tj�d��pd���}tj�d��pd������}tj�d��pd���}tj�d��pd���}tj�d	��d
k}dtdzdtdzfd
�}	|	|��}
|	|��}tj�d��pd���}tj�d��pd���}
tj�d��}|r|dkrd}d}n3	tdt|����}n#t$rd}d}YnwxYwtdttj�dd
������}|�dn|dz
|z}tj�d��d
k}gg}}d}i}|���5}|�|��|�
��D] }t|d��||d<�!	ddd��n#1swxYwYt|�����}|r$d|�d�}|�d��||gdzz
}|r*|�d ��|�|��|r*|�d!��|�|��|r|�d"��|||gz
}|
r*|�d#��|�|
��|rtt#j|d$�����t)d�%��z���}|�d&��|�|��|ru|s|�d'��n]d(�d)gt/|��z��}|�d*|�d+|�d,|�d-���|�|d.z��|r|�d/��d0}|rd1d2�|��znd}d3|�d4|��}d5|�d6|�d7|�d4|
����d8�	} |�| }!|}"n| d9z}!|||gz}"|���5}|�d:|�d;���d<�|�
��D��}#|�d=|�d>���d?�|�
��D��}$|�d@|�dA���dB�|�
��D��}%|�||��|���dC}&|�|!|"��|�
��}'ddd��n#1swxYwYt5dD�|%D��dE��F��}(dG�})dH�dID��}*t7dJ��|*dK<dL�}+dMD](},|*�|,t7dN����|*|,<�)|'D�]]}-|)|-�dO����|)|-�dP����z|)|-�dQ����z|)|-�dR����z|)|-�dS����z|)|-�dT����z}.|.|-dK<|*dUxx|)|-�dU����z
cc<|*dVxx|)|-�dV����z
cc<|*dWxx|)|-�dW����z
cc<|*dXxx|)|-�dX����z
cc<|*dYxx|)|-�dY����z
cc<|*dKxx|.z
cc<|*dZxx|+|-�dZ����z
cc<|*d[xx|+|-�d[����z
cc<|*d\xx|+|-�d\����z
cc<|*dWxx|+|-�dW����z
cc<��_|*d[|*dWz
|*d]<|*d\|*dWz
|*d^<|*dWr|*d]d_z|*dWznd|*d`<|*dWr|*d^d_z|*dWznd|*da<|�dnt|&|zdz
|zd��}/|�|&n|}0tj�d��d
k}t9	doidc|'�dd|�d|�d	|�d|�d|�de|#�d|�df|$�d|�dg|(�dh|
�di|�d|�d|0�dj|&�dk|/�dl|*�d|�dm|
�dn|��S)pN�inxpress_shipments_parsed�q��invoice�carrier�countryrvrw�noorderr]�s�returnc��|sdSdD]M}	tj||��������cS#t$rY�JwxYwdS)z?Return YYYY-MM-DD from UK (DD/MM/YYYY) or ISO input; else None.N��%Y-%m-%dz%d/%m/%Yz%d-%m-%Yz%d.%m.%Y�r�strptime�date�	isoformat�
ValueError�r��fmts  r#�to_iso_datez%shipments_parsed.<locals>.to_iso_date�sy���	��4�C�	�	�C�
��(��C�0�0�5�5�7�7�A�A�C�C�C�C�C���
�
�
���
�����ts�8A�
A�A�sort�shipment_id�dir�desc�pagesize�allr���200�pager�duponlya(
      SELECT ref, COUNT(*) AS cnt FROM (
          SELECT TRIM(LOWER(Reference))  AS ref FROM inxpress_shipments_parsed
           WHERE Reference  IS NOT NULL AND Reference  <> ''
        UNION ALL
          SELECT TRIM(LOWER(Reference2)) AS ref FROM inxpress_shipments_parsed
           WHERE Reference2 IS NOT NULL AND Reference2 <> ''
        UNION ALL
          SELECT TRIM(LOWER(Reference3)) AS ref FROM inxpress_shipments_parsed
           WHERE Reference3 IS NOT NULL AND Reference3 <> ''
      ) t
      GROUP BY ref
      HAVING cnt > 1
    �cnt�ref�%z�(invoice_number LIKE %s OR AirbillNumber LIKE %s OR Reference LIKE %s OR Reference2 LIKE %s OR Reference3 LIKE %s OR ReceiverName LIKE %s)�zinvoice_number = %szCarrier = %sz((DestCountry = %s OR OriginCountry = %s)zShipDate >= %sr���daysz
ShipDate < %sz1=0z, z%sz0(
                  TRIM(LOWER(Reference))  IN (z0)
               OR TRIM(LOWER(Reference2)) IN (z0)
               OR TRIM(LOWER(Reference3)) IN (z)
            )�zo.OrderNo IS NULLz^
    FROM inxpress_shipments_parsed sp
    LEFT JOIN orders o ON o.OrderNo = sp.Reference
    �WHERE � AND zSELECT COUNT(*) AS n � a>
        SELECT
          sp.shipment_id, sp.invoice_number, sp.Carrier, sp.AirbillNumber, sp.ShipDate,
          sp.OriginCountry, sp.DestCountry, sp.Reference, sp.Reference2, sp.Reference3,
          sp.ReceiverName, sp.Pieces, sp.WeightKg, sp.Length, sp.Width, sp.Height, sp.Zone,
          sp.ServiceType, sp.BaseCharge, sp.FuelSurcharge, sp.Handling, sp.Insurance,
          sp.AreaSurcharge, sp.ProcessingFee, sp.ResidentialFee, sp.OtherCharges,
          sp.NetAmount, sp.VATAmount, sp.TotalParsed, sp.Total,

          o.Delivery               AS Charge,
          o.DeliveryAgentCost      AS Cost,
          o.DeliveryCalculatedCost AS Calculated,

          -- Value deltas vs NetAmount
          CASE
            WHEN o.DeliveryAgentCost IS NULL OR sp.NetAmount IS NULL THEN NULL
            ELSE sp.NetAmount - o.DeliveryAgentCost
          END AS DiffCost,

          CASE
            WHEN o.DeliveryCalculatedCost IS NULL OR sp.NetAmount IS NULL THEN NULL
            ELSE sp.NetAmount - o.DeliveryCalculatedCost
          END AS DiffCalc,

          -- Percent deltas vs NetAmount
          CASE
            WHEN o.DeliveryAgentCost IS NULL OR sp.NetAmount IS NULL OR o.DeliveryAgentCost = 0 THEN NULL
            ELSE 100.0 * (sp.NetAmount - o.DeliveryAgentCost) / o.DeliveryAgentCost
          END AS DiffCostPct,

          CASE
            WHEN o.DeliveryCalculatedCost IS NULL OR sp.NetAmount IS NULL OR o.DeliveryCalculatedCost = 0 THEN NULL
            ELSE 100.0 * (sp.NetAmount - o.DeliveryCalculatedCost) / o.DeliveryCalculatedCost
          END AS DiffCalcPct


          z
          z
          ORDER BY z, sp.shipment_id ASC

    � LIMIT %s OFFSET %sz$SELECT DISTINCT invoice_number FROM z6 WHERE invoice_number<>'' ORDER BY invoice_number DESCc��g|]
}|d��S)�invoice_numberr!r�s  r#r�z$shipments_parsed.<locals>.<listcomp>s��@�@�@�A�A�&�'�@�@�@r"zSELECT DISTINCT Carrier FROM z# WHERE Carrier<>'' ORDER BY Carrierc��g|]
}|d��S)�Carrierr!r�s  r#r�z$shipments_parsed.<locals>.<listcomp>�s��9�9�9�Q�A�i�L�9�9�9r"z\
          SELECT DISTINCT UPPER(COALESCE(DestCountry, OriginCountry)) AS cc
          FROM zD
          WHERE COALESCE(DestCountry, OriginCountry) <> ''
        c��g|]
}|d��S)�ccr!r�s  r#r�z$shipments_parsed.<locals>.<listcomp>�s��2�2�2�a�!�D�'�2�2�2r"�nc�6�g|]}|t|��p|d���S))r�rfr)r��cs  r#r�z$shipments_parsed.<locals>.<listcomp>�s+��A�A�A�Q��<��?�?�/�a�	0�	0�A�A�Ar"c��|dS)Nrfr!��xs r#�<lambda>z"shipments_parsed.<locals>.<lambda>�s
��a��i�r")�keyc�\�|�tt|����ntd��S�N�0.00�r
�strr�s r#�dzshipments_parsed.<locals>.d��!���
�W�S��V�V�_�_�_�7�6�?�?�Jr"c�.�i|]}|td����S�r��r
�r��ks  r#�
<dictcomp>z$shipments_parsed.<locals>.<dictcomp>�s ��g�g�g�1�A�w�v���g�g�gr")�
BaseCharge�
FuelSurcharge�	NetAmount�	VATAmount�Totalr��Otherc�`�|dvrtt|����ntd��S)N)Nr�r\r�r�s r#r�z"shipments_parsed.<locals>.<lambda>�s&��Q�j�%8�%8�'�#�a�&�&�/�/�/�g�c�l�l�r")�Charge�Cost�
Calculatedr�r\�Handling�	Insurance�
AreaSurcharge�
ProcessingFee�ResidentialFee�OtherChargesr�r�r�r�r�r�r�r��
DiffCostTotal�
DiffCalcTotal�d�DiffCostPct�DiffCalcPct�shipments_parsed.htmlrx�
duplicates�invoices�carriers�	countries�
date_from_iso�date_to_iso�total�	last_page�sums�	direction�pagesize_raw)r�)rr	r:r,�strip�upperr�rg�max�intr�r{r|r}�list�keys�appendrr�r�rr��join�len�extend�fetchone�sortedr
r)1r�r�r�r�r�r��
date_from_raw�date_to_rawr�r�r�r�r�r�r�r�r��offsetr��where�params�dup_sql�dup_mapr�row�dup_keys�like�next_day�ph�
from_parts�	where_sql�	count_sql�base_sql�data_sql�data_paramsr�r��ccodes�
total_rowsrxr�r�r��Dr�r��otherr��pagesize_effectives1                                                 r#r r �s���'�E��8�8�D���!�!�#�&�&�,�"�3�3�5�5�A���!�!�)�,�,�2��9�9�;�;�G���!�!�)�,�,�2��9�9�;�;�G���!�!�)�,�,�2��9�9�;�;�A�A�C�C�G��\�%�%�f�-�-�3��:�:�<�<�M��\�%�%�d�+�+�3��:�:�<�<�K��|���	�*�*�c�1�G�	�s�T�z�	�c�D�j�	�	�	�	� �K�
�.�.�M��K��,�,�K���!�!�&�)�)�:�]�A�A�C�C�D���!�!�%�(�(�3�V�:�:�<�<�I��<�#�#�J�/�/�L��!�<�5�0�0������	!��1�c�,�/�/�0�0�H�H���	!�	!�	!��H� �L�L�L�	!�����q�#�g�l�&�&�v�s�3�3�4�4�5�5�D��"�Q�Q����X�(=�F�
�|���	�*�*�c�1�G���6�E�
�G��G�	
�����2�#����G�����<�<�>�>�	2�	2�C�"%�c�%�j�/�/�G�C��J���	2�2�2�2�2�2�2�2�2�2�2�2����2�2�2�2��G�L�L�N�N�#�#�H�	���1�x�x�x��
���$�	
�	
�	
��d�V�A�X��6��D�
���*�+�+�+�V�]�]�7�-C�-C�-C��=�
���^�$�$�$�f�m�m�G�&<�&<�&<��_�
���?�@�@�@�&�W�V]�L^�B^�&��E�
���%�&�&�&��
�
�m�(D�(D�(D��?��%�k�:�>�>�C�C�E�E�	�WX�HY�HY�HY�Y�d�d�f�f��
���_�%�%�%�v�}�}�X�'>�'>�'>��
(��		(��L�L���������D�6�C��M�M�1�2�2�B��L�L��/1���/1���02����
�
�
�

�M�M�(�Q�,�'�'�'��(��l�l�&�'�'�'��J�
5:�A��G�L�L��/�/�/�/�r�I�@�
�@�@�Y�@�@�I�(�H�I(�(�J�K(�(�L�M(�(�L%�?�?�,�,�M(�(�(�H�V���h��k�k��3�3����&�1�1��
������#����x�5�x�x�x�y�y�y�@�@������@�@�@�����^�E�^�^�^�_�_�_�9�9�#�,�,�.�.�9�9�9����������	
�	
�	
�
3�2�3�<�<�>�>�2�2�2�����I�v�&�&�&��\�\�^�^�C�(�
����H�k�*�*�*��|�|�~�~��%������������������(�A�A�&�A�A�A������I�K�J�J�g�g�(f�g�g�g�D��F�O�O�D��M�J�J�A�
:�,�,���(�(�1�g�c�l�l�+�+��Q���
�4�4����!�%�%�
�#�#�$�$�q�q����{�);�);�'<�'<�<�q�q�����AW�AW�?X�?X�X���!�%�%��(�(�)�)�*�,-�A�a�e�e�4D�.E�.E�,F�,F�G�IJ��1�5�5�Q_�K`�K`�Ia�Ia�b����'�
��\����a�a����l� 3� 3�4�4�4�����_������1�5�5��#9�#9�!:�!:�:�����[����Q�Q�q�u�u�[�1�1�2�2�2�����[����a�a����k� 2� 2�3�3�3�����W�
�
�
�a�a����g���/�/�/�
�
�
��W�
�
�
�e�#�
�
�
��X����a�a����h���0�0�0�����V����a�a����f�
�
�.�.�.�����\����a�a����l� 3� 3�4�4�4�����[����a�a����k� 2� 2�3�3�3�����!��L�4��+<�<�D��� ��.��k�1B�B�D���PT�T_�O`�j�4��0�3�6��k�9J�J�J�fj�D���OS�T_�O`�j�4��0�3�6��k�9J�J�J�fj�D����%���3�
�X�0E��0I�h�/V�XY�+Z�+Z�I�'/�'7���X���|���	�*�*�c�1�G�
��
�
�
�
�T�
��7�
���	
�
��
��!�

��W�

�(0�x�

���
�#+�(�
���
�$-�9�
�$�m�
� �K�
��T�
�/�.�
�7A�j�
�MV�I�
��T�
���
�)2�	�
�AM��
�
s8�9I�I(�'I(�1AM	�	M
�M
�/DZ;�;Z?�Z?z/shipment/<int:shipment_id>r�c��d}t��}|���5}|�||f��|���}ddd��n#1swxYwY|st	d��td|���S)Nz�
        SELECT shipment_id, ShipmentDetails, SenderAddress, ReceiverAddress,
               PiecesWeightDimensionsZone, Charges, Total, source_pdf, invoice_number
        FROM inxpress_shipments
        WHERE shipment_id = %s
        LIMIT 1
    razpartials/shipment_detail.html)r�)rr{r|r�r
r)r�r~r�rrs     r#�shipment_detailr�s����C��8�8�D�	
������#����C�+��(�(�(��l�l�n�n����������������������
�c�
�
�
��:�c�B�B�B�Bs�,A�A!�$A!z	/invoicesc�>
�d}tj�d��pd���}tj�d��pd���}tj�d��pd���}d�}||��}||��}tj�d��pd���}tj�d	��pd
���}hd�}	||	vrd}|dvrd
}tj�d
��pd������}
|
dvrdn*tt
t|
��d��d��}|�dn<tttj�dd��pd��d��}|�dn|dz
|z}
gg}}|r.|�d��|�d|�d���|r*|�d��|�|��|rttj
|d�����td���z�
��}|�d��|�|��|rdd�|��znd}d|�d|��}d|�d |�d!|�d"|����d#�	|�dnd$z}t!��}|���5}|�||��|���d%}|�|�||��n|�||||
gz��|���}ddd��n#1swxYwYd&�}d'�d(D��}|D�]}|d)xx||�d)����z
cc<|d*xx||�d*����z
cc<|d+xx||�d+����z
cc<|d,xx||�d,����z
cc<|d-xx||�d-����z
cc<|d.xx||�d.����z
cc<��
|�dnt||zdz
|zd��}|�|n|}t+d/|||||||||||
|�0�
�
S)1N�inxpress_invoicesr�r�rvrwc��|sdSdD]L}tj||��������cS#t$rY�IwxYwdS)Nr�r�r�s  r#�to_isozinvoices.<locals>.to_iso�sh������C�	$�	$�C� �)�!�S�1�1�6�6�8�8�B�B�D�D�D�D�D���#�#�#�t�t�#�����ts�8A�
A�Ar��invoice_dater�r�>�
amount_due�
invoice_idr�airbills_countr��customer_number�vat_shipments_vat�vat_shipments_total�vat_shipments_amount�non_vat_shipments_total�non_vat_shipments_amount>�ascr�r�r�>�-1r\r�i@B�
rr�rzinvoice_number LIKE %sr�zinvoice_date >= %sr�r�zinvoice_date < %sr�r�zSELECT COUNT(*) AS n FROM r�a*
        SELECT invoice_id, invoice_number, invoice_date, customer_number,
               airbills_count, amount_due,
               vat_shipments_amount, vat_shipments_vat, vat_shipments_total,
               non_vat_shipments_amount, non_vat_shipments_total,
               pdf_file
        FROM z	
        z
        ORDER BY `z` z, invoice_id DESC
    r�r�c�\�|�tt|����ntd��Sr�r�r�s r#r�zinvoices.<locals>.d-r�r"c�.�i|]}|td����Sr�r�r�s  r#r�zinvoices.<locals>.<dictcomp>.s,�����1�A�w�v�����r")rr!rr r#r"rr!rr r#r"z
invoices.html)rxr�r�r�r�r�r�r�r�r�r�r�)r	r:r,r�rgr��minr�r�rr�r�rr�r�r�rr{r|r�r}r)r�r�r�r�rr�r�r�r��
allowed_sortsr�r�r�r�rr�ndr
rr
r�rrrxr�r�r�r�rs                             r#r�r��s	���E�
��	�	�#�	�	�	$�"�+�+�-�-�A��\�%�%�f�-�-�3��:�:�<�<�M��\�%�%�d�+�+�3��:�:�<�<�K�����F�=�)�)�M��F�;�'�'�K���!�!�&�)�)�;�^�B�B�D�D�D���!�!�%�(�(�2�F�9�9�;�;�I����M��=� � ��$���&�&�F�	��L�$�$�Z�0�0�9�E�@�@�B�B�H�H�J�J�L�#�'7�7�7�t�t�S��S��EV�EV�Xa�Ab�Ab�df�=g�=g�H�� �1�1�c�#�g�l�.>�.>�v�q�.I�.I�.N�Q�*O�*O�QR�&S�&S�D��"�Q�Q����X�(=�F���6�E�� �
���-�.�.�.��
�
�h�!�h�h�h�����I�
���)�*�*�*�F�M�M�-�,H�,H�,H��=����Z�8�8�=�=�?�?�)�QR�BS�BS�BS�S�
^�
^�
`�
`��
���(�)�)�)�6�=�=��+<�+<�+<�49�A��G�L�L��/�/�/�/�r�I�@�U�@�@�Y�@�@�I�	��
	�	�
�	�	��	�	�%�?�?�,�,�	�	�	��!�2�2�'<�	>�H��8�8�D�	
������#����I�v�&�&�&�S�\�\�^�^�C�5H�
����K�K��&�)�)�)�)��K�K��&�H�f�+=�"=�>�>�>��|�|�~�~��
������������������K�J�J���)����D��O�O���\����1�1�Q�U�U�<�-@�-@�+A�+A�A�����
#�$�$�$�1�1�Q�U�U�3I�-J�-J�+K�+K�K�$�$�$��
 �!�!�!�1�1�Q�U�U�3F�-G�-G�+H�+H�H�!�!�!��
"�#�#�#�1�1�Q�U�U�3H�-I�-I�+J�+J�J�#�#�#��
'�(�(�(�1�1�Q�U�U�3M�-N�-N�+O�+O�O�(�(�(��
&�'�'�'�1�1�Q�U�U�3L�-M�-M�+N�+N�N�'�'�'�'��%���3�
�X�0E��0I�h�/V�XY�+Z�+Z�I�'/�'7���X����
�Q�#��
�.�j�I�
�Y�\�����s�2A9N7�7N;�>N;z/order/by-ref/<ref>c���t��}|���5}|�d|g��|���}ddd��n#1swxYwYt	d||���S)Na
            SELECT
              o.OrderNo,
              CONCAT_WS(' ', o.FirstName, o.Surname) AS Name,
              o.CompanyName,
              o.AddressLine1, o.AddressLine2, o.Town, o.County, o.Postcode, o.Country,
              o.EmailAddress,
              o.Message, o.Notes,
              o.DateTimeOrdered, o.DateTimePaid, o.DateTimeCompleted,
              o.TotalWeight, o.Subtotal, o.Discount, o.Delivery, o.VATIncluded, o.VATDeducted, o.GrandTotal,
              o.DeliveryWillCollect, o.DeliveryAddressSameAsInvoice,
              o.DeliveryName, o.DeliveryCompanyName, o.DeliveryAddressLine1, o.DeliveryAddressLine2,
              o.DeliveryTown, o.DeliveryCounty, o.DeliveryPostcode, o.DeliveryCountry, o.DeliveryInfo,
              o.DeliveryOption, o.DeliveryService, o.DeliveryCalculatedCost,
              o.EstimatedGrossWeight, o.EstimatedVolumetricWeight,
              o.PackageSize, o.PackageName, o.PaymentMethod, o.PaymentReference,
              o.Status, o.Courier, o.TrackingNo, o.MessageToCustomer,
              o.DeliveryAgentName, o.DeliveryAgentDate, o.DeliveryAgentCost,
              o.PackedBy, o.GrossWeight, o.CN22TariffCode, o.CommercialInvoiceInfo
            FROM orders o
            WHERE o.OrderNo = %s
            LIMIT 1
        zpartials/order_detail.html)�or�)rr{r|r�r)r�r�rrs    r#�order_by_refr.Es����8�8�D�	
������#�����,�U�-	�	�	�.�l�l�n�n��1������������������2�7�3�C�H�H�H�H��,A�A�"Az/order/<int:order_no>/details�
order_details)�endpointc���t��}|���5}|�d|g��|���}ddd��n#1swxYwYt	d||���S)NaA
            SELECT
              OrderDetailID,
              ProductCode,
              ProductName,
              OptionsList,
              Qty,
              PriceEach,
              Qty * PriceEach AS LineTotal
            FROM orderdetails
            WHERE OrderNo = %s
            ORDER BY OrderDetailID
        zpartials/order_items.html)�items�order_no)rr{r|r}r)r4r�rrxs    r#r0r0ds����8�8�D�	
������#������Z�	�	�	��|�|�~�~���������������������6�d�X�V�V�V�Vr/�__main__z	127.0.0.1i�)�host�port�debug)r )?�urllib.parserr�flaskrrrrr	r
rr�decimalr
r�dbr�filtersrrrr�	functoolsr�os�logging�pathlibr�__name__�appr+�permanent_session_lifetime�router$�before_requestr/�getenv�
secret_key�config�updaterIrVrFrMr(rZr8�basicConfig�DEBUGrirnrprtr�r�r r�rr�r,r.r0�runr!r"r#�<module>rNs���*�*�*�*�*�*�*�*�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�i�-�-�-�-�-�-�-�-�������%�%�%�%�%�%�!�!�!�!�!�!�(�(�(�(�(�(�(�(����������������������e�H�o�o��0�/�/��!*���!4�!4�!4������3���1�1���1���
&�
&���
&����>�<�8�8����
���� �!������r�y��W�%�%���r�y��[�)�)��1�1�1�1�&������8�e�F�^��,�,�)�)�-�,�)����9���&�&���&�

�2�9�[�#���#�%�%��C�I�)-�C�J�%�&��G��g�m�,�,�,�,�
�4�(�)�)���������� ���4���������3��� � ��� ����9�����������;���]�]���]�2+�*�*�*�*�*�*�*�������	:�	:�	:����<���M�M���M�`���(�)�)�C��C�C�C�*�)�C�"���;���`�`���`�D���	���I�I� ��I�<���	(�?��C�C�W�W�D�C�W�*�z����G�G��4�t�G�4�4�4�4�4��r"