- /fedex: batch create, document upload/replace/delete, save shipment, imported list
- /api/orders, /api/invoices, /api/pb-file, /api/pb/refresh-token, /api/stock-codes
- /api/payments/bundle: generate + download-all remittance bundles
- shared app/components/DocCell.tsx and app/lib/{invoice-docs,pb-fetch,pb-token}.ts
- recon: invoice reconciliation reports and PowerShell fix-plan scripts
- .gitignore: exclude one-off scripts/_* debugging artefacts, recon/pdfs+txts, data backups
69 lines
No EOL
2.4 KiB
Python
69 lines
No EOL
2.4 KiB
Python
"""End-to-end test of the Fedex workflow via Next.js API."""
|
|
import urllib.request
|
|
import urllib.parse
|
|
import json
|
|
import sys
|
|
|
|
BASE = 'http://localhost:6002'
|
|
|
|
# Use first 2 unpaid invoices
|
|
inv_ids = ['bz2wi3hg2tmhfp9', 'blcxmt7pwlmvxk7']
|
|
|
|
# 1) Save shipments (upsert waybill + fedex_ref)
|
|
for i, iid in enumerate(inv_ids):
|
|
payload = json.dumps({
|
|
'invoice_id': iid,
|
|
'waybill_no': f'7712345678{i:02d}',
|
|
'fedex_ref_no': f'FX-REF-TEST{i:02d}',
|
|
}).encode()
|
|
req = urllib.request.Request(
|
|
f'{BASE}/api/fedex/save-shipment',
|
|
data=payload,
|
|
headers={'Content-Type': 'application/json'},
|
|
)
|
|
try:
|
|
resp = urllib.request.urlopen(req).read().decode()
|
|
print(f'[save {i}] -> {resp}')
|
|
except urllib.error.HTTPError as e:
|
|
print(f'[save {i}] FAILED -> {e.code} {e.read().decode()}')
|
|
sys.exit(1)
|
|
|
|
# 2) Create batch with one doc attached
|
|
boundary = '----fedextest123'
|
|
parts = []
|
|
def add(name, val):
|
|
parts.append(f'--{boundary}\r\nContent-Disposition: form-data; name="{name}"\r\n\r\n{val}\r\n'.encode())
|
|
def add_file(name, filename, mime, content):
|
|
parts.append(f'--{boundary}\r\nContent-Disposition: form-data; name="{name}"; filename="{filename}"\r\nContent-Type: {mime}\r\n\r\n'.encode())
|
|
parts.append(content + b'\r\n')
|
|
|
|
add('import_date', '2026-09-15')
|
|
add('vat_paid', '1234.56')
|
|
add('duties_paid', '789.10')
|
|
add('notes', 'Test batch from end-to-end verification')
|
|
add('invoice_ids', json.dumps(inv_ids))
|
|
add('waybill_by_invoice', json.dumps({inv_ids[0]: '771234567800', inv_ids[1]: '771234567801'}))
|
|
add('fedex_ref_by_invoice', json.dumps({inv_ids[0]: 'FX-REF-TEST00', inv_ids[1]: 'FX-REF-TEST01'}))
|
|
add_file('doc_waybill', 'waybill.pdf', 'application/pdf', b'%PDF-1.4\n%fake test pdf for waybill\n%%EOF')
|
|
|
|
body = b''.join(parts) + f'--{boundary}--\r\n'.encode()
|
|
|
|
req = urllib.request.Request(
|
|
f'{BASE}/api/fedex/create-batch',
|
|
data=body,
|
|
headers={'Content-Type': f'multipart/form-data; boundary={boundary}'},
|
|
)
|
|
try:
|
|
resp = urllib.request.urlopen(req).read().decode()
|
|
print(f'[create-batch] -> {resp}')
|
|
except urllib.error.HTTPError as e:
|
|
print(f'[create-batch] FAILED -> {e.code} {e.read().decode()}')
|
|
sys.exit(1)
|
|
|
|
result = json.loads(resp)
|
|
batch_id = result['batchId']
|
|
print(f'\nNew batch ID: {batch_id}')
|
|
|
|
# Save batch ID for next step
|
|
with open('scripts/.last_batch_id', 'w') as f:
|
|
f.write(batch_id) |