1fa89da
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FNu4zbdNqYpX5jAVcU31GA
Melissa Uploader
Uploads each practice's daily files to the right server, then archives what was sent. There are three buttons and no files to edit by hand.
| Double-click this | When |
|---|---|
| setup.bat | Once, on a new PC. Downloads the uploader's helper program. |
| setup-entity.bat | Whenever a partner is added or a password/folder changes. Asks questions and writes the settings for you. |
| run-all.bat | Every day, after the PT STMT rename script. |
Setting up a partner
Double-click setup-entity.bat and pick "Set up a new entity". It asks:
-
Entity name - the folder name for this group of practices (CAMBS, RMI, ...)
-
Server address - just the name, like
sft.polluxsystems.com -
How the server receives files - pick SFTP, FTPS, or FTP from a list. If you don't know, ask the partner which one they use. Guessing wrong is the single most common reason an upload fails, and the test at the end catches it.
-
Username and password
-
Where the files go on the server - type
{practice}where the practice name belongs and it gets filled in for each one, so a single line covers every practice:/home/clients/CAMBS/{practice}For CAMBS that sends AJMATS's files to
/home/clients/CAMBS/AJMATS, CIIR's to/home/clients/CAMBS/CIIR, and so on. -
Whether PT STMT files show up in the dated folders, and where those go
-
Whether this entity sends patient files from
Patient\Export\ -
The practice names - it creates each practice folder for you
Then it offers to test. Say yes.
The test is the important part
At the end of setup (or any time, via "Test an entity's connection and folders") it logs in and checks that every practice's folder actually exists on the server:
Daily upload
Connecting to sft.polluxsystems.com over SFTP as cambs-user ... OK
/home/clients/CAMBS/AJMATS ... found
/home/clients/CAMBS/CIIR ... found
/home/clients/CAMBS/EMMD ... NOT THERE
OK means the address, protocol, and login are all right. found means files sent there will land. NOT THERE means that practice will fail - either the path is wrong (fix it in setup) or the partner hasn't created the folder yet (ask them).
Running this after setup means you find out about a problem now, in ten seconds, instead of in tomorrow's upload.
Daily run
- Run the PT STMT rename script as usual
- Double-click run-all.bat
- Watch for red lines
Every file that uploads prints ok. A date folder only gets archived when
everything in it went up - if anything fails or gets skipped, the folder
stays put so tomorrow's run picks it up again. Nothing is ever deleted.
You do not have to tell it whether the files are PDFs or TIFs. It sends whatever the imaging system put in the dated folder.
When something goes wrong
The run tells you what to do in plain words. The common ones:
| What you see | What to do |
|---|---|
This server wants SFTP... |
Run setup-entity.bat, change that entity's server, pick the protocol it names |
The username or password was rejected |
Run setup-entity.bat and retype the login |
That server address could not be found |
Typo in the address - fix it in setup |
No answer from the server |
Ask IT whether the firewall allows it |
... not configured (...) - N file(s) ignored, left in place |
That upload has no folder path set yet. Run setup-entity.bat and fill it in, or ignore the message if that entity genuinely doesn't send those files |
NOT archived - N file(s) were ignored |
Some files went up and some didn't, so the folder was left alone on purpose. Fix the setting above and run again |
WinSCP error on startup |
Run setup.bat again |
Full detail for every run is in Logs\YYYYMMDD.log.
Folder layout
run-all.bat <- daily
setup-entity.bat <- add or change a partner
setup.bat <- once per PC
engine.ps1
WinSCP\ <- created by setup.bat
Logs\ <- one log per day
Entities\
CAMBS\
entity.json <- written by setup-entity.bat, don't edit by hand
run.bat <- runs just CAMBS
Export1\
AJMATS\
20260826\ <- today's files, from the imaging system
Archive sent to FTP\ <- where they go once sent
Patient\
Export\
PT STMT_20260826\ <- from the rename script
Archive Sent to FTP\
CIIR\
...
Reference
Everything below is for whoever maintains the tool. setup-entity.bat writes all of it - you should never need this to use the uploader.
entity.json
Written into each entity folder. setup-entity.bat produces:
{
"_note": "Written by setup-entity.bat ...",
"workflow": "insurance+patient",
"ftps": {
"host": "sft.polluxsystems.com",
"protocol": "sftp",
"port": null,
"username": "shared-username",
"password": "shared-password",
"tiff_path": "/home/clients/CAMBS/{practice}",
"pdf_path": null
},
"sftp": {
"host": "sftp.example.com",
"protocol": "sftp",
"port": null,
"username": "shared-username",
"password": "shared-password",
"patient_path": "/{practice}/Patient"
}
}
The section names are historical: ftps is the daily date-folder upload
(over whatever protocol says, SFTP included) and sftp is the patient-file
upload.
Top level
| Setting | Values | What it does |
|---|---|---|
workflow |
"insurance" or "insurance+patient" |
insurance+patient also processes Patient\Export\PT STMT_<date>\ via the sftp section |
insurance_file_type |
"pdf", "tif", or absent |
Optional. Absent (the normal case) sends every file in the date folder except Thumbs.db, desktop.ini, .DS_Store, and .tmp/.lnk/.ini/.db. Set it to pin the upload to one extension |
ftps (daily upload) and sftp (patient files)
| Setting | Values | What it does |
|---|---|---|
host |
server name | Bare hostname. A pasted sftp:// / ftps:// prefix is still honored and stripped |
protocol |
"sftp", "ftps", "ftp" |
How to connect. Wins over any prefix on host and over tls. Null falls back to the host prefix, then tls, then FTP for the daily section / SFTP for the patient section |
port |
number, no quotes | Null = 22 for SFTP, 21 for FTP/FTPS |
tls |
true/false |
Older equivalent of protocol: "ftps". Only read when protocol is null |
username / password |
text | The login |
tiff_path |
path | ftps only. Where the regular daily files go. The older name insurance_path still works |
pdf_path |
path | ftps only. Where PT STMT-named files from the date folder go. Null = ignore them |
patient_path |
path | sftp only. Where the .txt/.tif patient files go |
Values that work anywhere
| Value | Meaning |
|---|---|
{practice} in a path |
Replaced with the practice's folder name |
null |
"Not used - ignore." Affected files are left in place with a notice, never uploaded, never archived, never counted as failures |
any key starting with _ |
Ignored - use it for notes |
On every run the engine adds any keys it knows about that are missing from
entity.json, as null, and saves the file.
practice.json
Optional, inside one practice's folder. Same keys and sections; whatever it
contains replaces (or adds to) entity.json for that practice only. Use it
when one practice has its own login or a remote path that doesn't fit the
{practice} pattern.
{
"ftps": {
"tiff_path": "/SpecialFolder/Claims"
}
}
workflow and insurance_file_type are entity-wide and ignored here.