# Product requirements — superbowl_daily (Superbowl Daily)

Evidence date: 2026-10-02.

Source: `git@bitbucket.org:overdrive/superbowl_daily.git`, `main` at `1ba6c4a` (2026-08-04).

There is no separate requirements document in the repository. Requirements below are recovered from the implementation and from comments in `Main.vb`. Each item is labelled.

Provenance labels: **Documented** (explicit comment or script note), **Implemented**, **Inferred**, **Planned** (named as future and not present), **Unknown**.

## Product purpose

**Implemented.** Superbowl Daily is a Windows desktop batch that loads RGBC sales, customer, stock, and related files into the Superbowl SQL Server database and writes a small set of outbound files and an email log.

**Unknown.** The business owner, the schedule that starts the executable, and whether this product or `superbowl_daily_2` is the system of record.

## Users and interactions

**Implemented.** One Windows Forms window, `frmMain`. No authentication UI.

| Control | Caption | Behaviour |
|---|---|---|
| (form load) | title `Superbowl Daily Update v1.31` | Sets `txtDate` to today `yyyyMMdd`. If `My.Settings.blnDebug` is false, calls `Run()`. |
| `txtDate` | date text | Used as the stock date, SALBA is independent, and as the period key for stock, rep calls, and surveys. Not validated in the UI. |
| `btnRun` | ReRun | Calls `Run()`. |
| `btnEmail` | Email | Calls `MailLog()`. |
| `btnFix` | Fix SAP FUCKUP | Handler body is commented out. Click has no effect. |
| `btnPost` | Post SC | Recalculates product-period balances from the earliest period in `stgCognos14` or `stgZMB`. |
| `btnSalba` | Salba | Imports every `SALBA_*` workbook in `Imports\` without the rest of the batch. |
| `btnTest` | Test | Opens file index 4 (`eSalesCharter_Segmentation.csv`) if present. Does not insert rows. |
| `btnRetotal` | Re Total SC | Calls `updatePPBalance` with `txtDate.Text`. |
| `btnSCQ` | SCQ | Calls `ProduceSalesCharterQueries(False)`. |
| `btnMondayly` | Mondayly | Calls `bfbeExports` (monthly when day of month is 1) then `MailBrandon()`. |
| `pgBar`, `pgTotal`, `lblMessage` | progress | Updated during import. |

**Inferred.** An operator uses the buttons when `blnDebug` is true. An unattended run is the load path when `blnDebug` is false. The committed default of `blnDebug` is `True`, so the committed configuration is the manual path.

**Implemented.** A non-DEBUG build closes the form in the `Finally` of `Run()`, including after a fatal error. A DEBUG build leaves the form open.

## FR-001 — Start the daily batch

Requirement: When the form loads and `blnDebug` is false, the system runs the full batch. When `blnDebug` is true, the system waits for **ReRun**.

Trigger: process start, or **ReRun**.

Inputs: application settings, local `Imports\`, UNC shares, SQL Server `Superbowl`.

Expected behaviour: `Run()` as specified in FR-010 through FR-019. Progress bars advance per row. On completion of a non-DEBUG build the window closes.

Error conditions: exceptions inside `Run()` are written by `ErrorLogger` and, when mail has not yet been sent, `MailLog()` is attempted. The form still closes in a non-DEBUG build.

Evidence: `frmMain_Load`, `btnRun_Click`, `Run` `Finally`.

Implementation: Implemented.

Confidence: High.

## FR-002 — Extend fiscal periods

Requirement: If the latest `mstPeriod.strPeriod` is fewer than 24 months ahead of the current year-month, insert the next six periods.

Who: the batch, not a user.

Inputs: `SELECT TOP 1 * FROM mstPeriod ORDER BY strPeriod DESC`. Company row `mstCompany.strCompany = 'RGBC'`, column `strFYStart`.

Expected behaviour: for each new month, compute fiscal year, fiscal month, fiscal quarter, and calendar quarter, then `INSERT INTO mstPeriod`. Month name comes from the period date (`MMMM`).

Validation: a failure on one insert is logged (`Run.PeriodSeed`) and the loop continues. A failure of the outer read is logged (`Run.PeriodCheck`) and the batch continues.

**Inferred.** `dblPeriod` is `latestPeriod.Diff(current yyyyMM)`. `Duodecimal.Diff` returns latest minus current, so a latest period in the past yields a negative number, which is `< 24`, and the seed still runs. The comment in `Main.vb` says `p1. period check` and does not state the 24-month rule. The threshold 24 and the loop count 6 are **Implemented**. An older commented block in `btnTest_Click` used `< 6` and a loop of 4. That block does not run.

Evidence: `Run` period block, `Duodecimal.vb`.

## FR-003 — Record warehouse counts

Requirement: each batch inserts one `dlyDataWarehouse` row with the current tick stamp, `yyyyMMdd`, the count of `dwdCustomer.strCustomerNo`, and the count of `dwdProduct.strProdCode`.

Failure is logged (`Run.DWRecordCount`) and the batch continues.

Implementation: Implemented.

## FR-004 — Collect source files

Requirement: before import, place expected files into `{exe}\Imports\`.

| Index | File | Type | Collection |
|---|---|---|---|
| 0 | `cognos09.txt` | Customer | Copy from `\\Hennessy\Sales\snell\reports\rgbc\`, overwrite |
| 1 | `cognos14.txt` | Sales | same |
| 2 | `zmb59-daily.txt` | stgZMB | same |
| 3 | `cognos12.txt` | Stock | same |
| 4 | `eSalesCharter_Segmentation.csv` | CustomerSegment | Copy from `\\Hennessy\Sales\eSalesCharter\` is present but gated `And False` |
| 5 | `AdCheck LISP Data.xls` | dwfAdCheckLisp | no copy; file must already be in `Imports\` |
| 6 | `Export Sales.xls` | stgExports | no copy |
| 7 | `SALBA_*` | Salba | `loadSalba` sets the process file to the last `SALBA_*` name in `Imports\` |
| 8–12 | eSales Charter calls, surveys, promos | RepCalls, OffconSurvey, OnconSurvey, OffconPromo, OnconPromo | copy gated `And False` |
| 13 | `AdSpend.xls` | AdSpend | `File.Move` from `\\Hennessy\Sales\ftp.bmi\` every day the file is there |

A missing share file is a copy error: import log action `Copy Down Error` or `Error!`, `ErrorLogger`, and `blnError = True`. The batch continues with the next file.

**Documented** in comments: older paths used `\\Benriach\...`. Live paths use `\\Hennessy\...` (v1.33, 2024-11-27).

After a file is processed, a DEBUG build copies it to `{exe}\Imported\{name}.{yyyyMMddHHmmss}`. A non-DEBUG build moves it. A missing file on archive is logged and ignored.

## FR-005 — Import customers (cognos09)

Requirement: insert or update `mstCustomer` from `cognos09.txt`.

Trigger: file exists in `Imports\`.

Match key: column 0 compared with `mstCustomer.strCustomerNo` loaded by `getKeys`. Existing key calls `ProcessUpdate`. New key calls `ProcessInsert`.

Validation (**Implemented**):

- Customer number length must be 7 or fewer characters. Longer values throw `Invalid customer number` and count as a failed row.
- Column 12 must match `mstBranch.strSAPCode`. No match throws `Branch '{code}' not found`.

Insert (**Implemented**, `sqlDB_Superbowl.sql_insert_Customer`): writes Snell fields from columns 1, 2, 4, 8, 9, 10, branch id, `blnActive = 1`, `blnPromotionalAccounts = 0`, liquor licence, `strLastUser = UNAME`, `dtStamp`. Then inserts `dwdCustomer` for that customer, or updates it on a primary-key violation.

Update (**Implemented**, `sqlDB_Daily.sql_update_Customer_daily`): writes the same Snell fields and branch. `blnActive` is taken from column 14 and inverted: file 0 becomes 1, any other value becomes 0. Comment v1.26 (2013-09-03): `mstCustomer.blnActive = !$blnActive`. If column 14 is missing, the update omits `blnActive` (`IndexOutOfRangeException` path).

Liquor licence (**Implemented**, v1.34 / commit `2a4fdbe`):

- If the row has more than 16 columns, use column 16.
- Else if it has more than 15 columns, use column 15.
- Else leave the licence unchanged on update, and store empty on insert.

`scripts/alter_mstCustomer_strLiquorLicense.sql` says the Cognos 9 licence is column 15/16 and that `mstCustomer.strLiquorLicense` and `dwdCustomer.strLiquorLicense` must exist (`VARCHAR(25) NULL`) before deploy. The script is not executed by the application.

## FR-006 — Post-process customers

Requirement: after the customer file, align the warehouse customer table.

**Implemented:**

1. Insert `dwdCustomer` rows for `mstCustomer` numbers that are missing there.
2. Execute `sysQuery.memQuery` for `ID = 8`, then `ID = 31`.

The SQL text is not in this repository. The liquor-licence script says those two queries must also set `dwdCustomer.strLiquorLicense` from `mstCustomer`. Whether production `sysQuery` does that is **Unknown / Requires Confirmation**.

`sql_update_Customer_dw()` in `sqlDB_superbowl.vb` does set `strLiquorLicense`, but `Run()` does not call that method. It calls `sysQuery` 8 and 31.

Snell area and Snell supergroup checks are commented out and do not run.

## FR-007 — Import sales (cognos14)

Requirement: load `cognos14.txt` into `stgCognos14`, then rebuild sales and stock actuals for the periods in the file.

Pre-clean (**Implemented**, `getKeys` type `Sales`): delete `stgCognos14`, `stgSalesDataDownload`, and `stgSalesData`. Sales rows are always inserted (`gTemp` is empty), not updated.

Row validation:

- Column 1 (document number) length at least 1.
- Column 2 must be numeric (`Double.IsNaN` check on the customer number).
- Column 5 (period) length at least 8.
- Column 7 (product) length at least 5.
- Empty document type becomes `R`.
- Measure `BOT` or `ST` appends `S` to the product code. Measure `CS` appends `F`.
- Order number, when non-empty, is coerced with `CDbl` (leading zeros drop).

Insert uses `sql_insert_stgCognos14`, including pink-slip column 18. If that insert throws, the exception is swallowed and the row is still counted as inserted. **Implemented.** A failed older-format insert is therefore not a failed row.

**Documented** column layout (v1.14 comment): doctype, docno, cusno, cusname, rep, period, movement, prodcode, proddesc, packs, packsize, units, ninelce, ordernum, nett, measure, gsv, nett plus surcharge. Pink-slip was added, removed, and restored in the v1.28 comments (2014-10-31, 2015-07-13, 2015-08-27). Current insert passes column 18 as `strPSN`.

## FR-008 — Post-process sales

Requirement: when `stgCognos14` has periods, update stock control and the sales warehouse.

**Implemented:**

1. Negate units, ninelce, nett, gsv, and `dblNettEx` where `doctype` is null, empty, `-`, or `C`.
2. Set `stkProductPeriod.dblActual = 0` for those periods.
3. Sum `units * mstProduct.dblFlat` by 5-character product code, period, and brand. Missing brand (`refBrandID` null or 0) is an error: `Missing or incomplete product information`. Existing product-period rows update `dblActual`. Missing rows insert a product period with that actual.
4. Amounts are rounded to 4 decimal places, away from zero.
5. Aggregate into `stgSalesDataDownload` by document, customer, day, product, document type, and order number. Delete rows where units and net sales are both 0.
6. Build `stgSalesData`, including 9-litre as `units * intPack * intSize / 9000.0`.
7. Promotional free-stock triple entry when `mstCustomer.blnPromotionalAccounts = 1` and `ordernum <> cusno`:
   - Update the bill-to row: units and 9-litre move into free-stock as negatives, value signs flip.
   - Insert a ship-to row (`ordernum`) with the opposite free-stock.
   - Insert a bill-to `FS` document (`LEFT(docno,8) + 'FS'`) that restores units.
8. Delete `dwfSales` for those periods where `refDocumentNo` does not contain `X` or `Y`. Insert the replacement from `stgSalesData` joined to `mstProduct`, `mstCustomer`, and `mstPeriod`.
9. Copy `strPSN` from `stgCognos14` onto `dwfSales` by document number.
10. Set `fsrRequisition.strInvoiceNumber` from `stgCognos14.docno` where pink-slip numbers match.

**Inferred.** Documents whose numbers contain `X` or `Y` are export documents and must survive the period delete. The comment says `Delete, but Not export documents`.

## FR-009 — Import stock movements (zmb59)

Requirement: replace `stgZMB` and post receipts, exports, repack, and damages onto `stkProductPeriod`.

Pre-clean: `DELETE FROM stgZMB`.

Row validation:

- Product code length 5.
- Period (column 9) length 8.
- `BOT` or `ST` appends `S`. `CS` appends `F`. Measure `L` on product `05016` appends `F` and multiplies the quantity column by 9.

Post-process, for periods present in `stgZMB`:

- Zero `dblReceipts`, `dblExports`, `dblDamages`, `dblRepack` for those periods.
- Movement types `101` and `102`, branches `XZB1` and `XZB3`: positive flat quantity updates `dblReceipts`; negative updates `dblExports` as an absolute value.
- Movement types `201` and `202`: `dblRepack`.
- Movement types `701` and `702`: `dblDamages`.
- Product must have `mstProduct.refBrandID`. Values rounded to 4 decimal places, away from zero.

## FR-010 — Import daily stock (cognos12)

Requirement: delete `dwfStock` for `txtDate` (`strDate`) and insert one row per file row.

Validation: product code length 5. Stored product code is that code plus `F`.

Columns written (**Implemented**, v1.21 comment): DBN, NCL, JNB, POL, CPT, GRG, BFN, PE, ELN, JBOND, JBOND/CONS, CBOND, CBOND/CONS, EXP2, DP. Column 18 (`GRAND_TOTAL` in the comment) is not inserted. Column 19 is `dbDP`.

Period stored is the first 6 characters of `txtDate`. Date stored is the first 8.

## FR-011 — Import SALBA

Requirement: read worksheet `MonthQuery2` from the `SALBA_*` workbook. Delete `dwfSalba` for the year and month parsed from the file name (`split` on `_` and `.`, parts index 2 and 3). Insert year, month, country, region, area, category, and `Sum of SaleData`.

Validation: year length 4; month number, area code, and category code non-empty.

`Run()` uses the last `SALBA_*` file only. **Salba** button loops every `SALBA_*` file.

## FR-012 — Import export sales

Requirement: at the start of the file loop, `DELETE FROM stgExports`. Insert rows from `Export Sales.xls` into `stgExports` with batch suffix `999090`, GSV 0, and NSV copied into both NSV and nett-ex.

Validation: `ProdCode` length 6, `Period` length at least 6, `CustomerNo` length 7 or fewer. The customer-number failure message says `Invalid product code`. **Implemented** text, likely a mislabelled message. **Inferred** that the check is on the customer number because it reads `CustomerNo`.

Post-process: delete unprocessed `mstExports` in those periods whose `refBatch` ends in `999090`, then insert from `stgExports` with GSV = `mstProduct.dblPrice * dblUnits` when price is not null, else 0. `blnProcessed` stays 0.

`sql_insert_Sales_Exports` builds `dwfSales` document numbers `Y` plus a 7-digit export id. No caller in `Main.vb` was found. Whether another job posts those rows is **Unknown**.

## FR-013 — Import AdCheck LISP

Requirement: when `AdCheck LISP Data.xls` exists, replace `dwfACLisp` for the audit periods in the file and record unmapped products and stores.

**Implemented:**

- Read sheet `DATA$`.
- Period is the first 8 characters of `Audit Date`, with `/` removed. Length under 6 is invalid.
- `StoreID` and `productid` must be numeric.
- Delete `dwfACLisp` for those periods, then insert price, stock on shelf, and facings. Null price, stock, and facings become 0.
- Set `strBrand` from `mapACProduct` joined to `mstProduct` and `mstBrand` where the brand is non-empty.
- Log and insert `mapACProduct(refProductID)` when the AdCheck product has no mapped `refProdCode`. Insert errors are swallowed.
- Log and insert `mapACStore(refACStoreID)` when the store has no `refCustomerNo`. Insert errors are swallowed.

The general update-or-insert loop is skipped for this type (`Case "dwfAdCheckLisp"`).

## FR-014 — Import AdSpend

Requirement: move `AdSpend.xls` from the BMI FTP folder and insert each row into `dwfAdSpend`.

**Implemented** columns include `ai_imagefile`. The previous insert that wrote `ProductSubCategory` is commented out (changelog v1.31, 2018-11-07). No row-level validation beyond what the insert throws. There is no delete of prior AdSpend rows in `getKeys`.

**Inferred.** Re-running a file that is still in `Imports\` inserts again. Duplicate behaviour depends on the table key, which is not defined in this repository.

## FR-015 — eSales Charter imports

Requirement: the code can load segmentation, rep calls, off- and on-consumption surveys, and off- and on-consumption promos.

**Implemented** but not collected by `Run()` (`And False` on the share copy). If a file is already in `Imports\`, the insert path still runs.

Rules that are in the live insert path:

- Customer segmentation update sets `mstCustomer.refChannelSegmentID` from column 8. Empty segment throws `Invalid Channel SegmentID`. Customer number length must be 7 or fewer. Insert of a new customer from this file does nothing (`Case "CustomerSegment"` in `ProcessInsert` is empty).
- Rep calls: date length 8, rep id and region required. Delete existing `dwfRepCalls` for the `yyyyMM` of `txtDate` before insert.
- Off-consumption survey: customer number, rep id, and product code required (product may be `N/A`; a 5-character code gets `S` appended). A line-by-line parser inserts first. `getKeys` then deletes `dwfOffconSurvey` where `strDate` equals `txtDate`. The OleDb pass inserts again through `ProcessInsert`. Line-by-line rows whose date equals `txtDate` are removed before that second insert. Rows dated otherwise remain, so a file can be loaded twice for dates other than `txtDate`. Primary-key violation SQL 2627 is ignored. Other SQL errors in the line parser are rethrown.
- On-consumption survey: delete by `txtDate`, then insert. Primary-key violation 2627 is ignored.
- Promos: delete existing rows whose start date (off-con) or promo date (on-con) falls in periods found in the file. Customer number and brand required. Rep id check removed (comment v1.25, 2013-05-13). Primary-key violation 2627 is ignored.

**Documented** as removed from the daily run in v1.27 (2013-12-09): "removed Mint import files".

## FR-016 — Recalculate stock-control balances

Requirement: after imports, recompute opening, closing, and months of cover on `stkProductPeriod` from the earliest period in `stgCognos14` or `stgZMB`.

**Implemented** formula in `updatePPBalance`:

- When the row changes product, opening stays the stored opening. Otherwise opening becomes the previous closing.
- If `dblOpeningImports > 0`, opening and the running closing start from `dblOpeningImports`.
- For periods up to and including the current `yyyyMM`, closing = opening − actual + receipts − exports + damages + repack.
- For the current period when actual is 0, and for future periods: closing = opening − QF + orders − exports + damages − BMA + repack.
- Months of cover walks later periods of the same product, consuming `dblQF + dblBMA`, capped at 15.
- Writes `dblOpening`, `dblClosing`, `dblMonths`, `strLastUserUpdate = 'SD c14 Process'`, and `dtStampUpdate`.

**Post SC** uses the same start-period rule and does not run the file imports. **Re Total SC** passes `txtDate.Text` through as the start period with no format check.

Failures are logged (`updatePPBalance` or `btnPost_Click`) and not rethrown.

## FR-017 — Sales Charter query export

Requirement: **SCQ** builds three pipe-delimited CSV files and copies them to `\\Hennessy\Sales\eSalesCharter\NewFiles\`.

Files:

- `RGBC_SalesCharter_CustomerRepAllocation.csv` from `sysQuery` IDs 13, 14, 15, 16, ordered by `intOrder`, combined with `UNION ALL`.
- `RGBC_SalesCharter_MyVolume.csv` from IDs 11 and 12, after deleting `dwfQFSales` for the current fiscal year and running IDs 9 and 10. The literal period range `200807`–`200906` inside those queries is replaced with the min and max `mstPeriod` of the fiscal year that contains the current `yyyyMM`.
- `SalesCharter_Products.csv` from `sysQuery` ID 5.

LVMH-only files are commented out (comment 2010-05-22).

`Run()` does not call this. Comment v1.27: Mint Sales Charter query export deactivated.

Copy failures are logged per file and do not stop the other copies.

## FR-018 — BFBE exports

Requirement: after the import log email, write two tab-delimited, unquoted files under `{exe}\BFBE\`.

- Sales: `sysQuery` name `bfbe-Sales_Month_to_Date`. The literal `20091001` in the query is replaced with `txtDate`. The literal `200910` is replaced with the period. On day 1 of the month, `blnMonthly` is true and the period is the previous month (`Duodecimal.Add`). File name `ZA_{yyyyMM}_INVW.txt` when monthly, otherwise `ZA_{yyyyMMdd}_INVW.txt`.
- Customers: `sysQuery` name `bfbe-Customer_Master`, same date replacement. File name `ZA_{yyyyMMdd}_CUST.txt`.

If either named `sysQuery` row is missing, the export returns after an import-log line `BFBE Export Skipped`. A later failure is logged `BFBE Export Error`.

**Mondayly** uses the same day-1 rule, then calls `MailBrandon`.

`MailBrandon` is not called from `Run()` (comment: `temp disabled`). It emails `My.Settings.bfbeEmails` (semicolon-separated) with subject `Superbowl Daily [dd MMM yyyy]`, body `testing`, and attachments of the non-monthly file names `ZA_{txtDate}_INVW.txt` and `ZA_{txtDate}_CUST.txt`. On day 1 those attachment names do not match the monthly sales file name. **Implemented.** Whether that mismatch is intentional is **Unknown / Requires Confirmation**.

The committed `bfbeEmails` value is empty.

## FR-019 — Email the import log

Requirement: `MailLog` sends an HTML table of `dlyImportLog` rows where `blnEmail = 1`, then sets those flags back to 0.

Recipients: `My.Settings.Emails` split on `;`. Committed default is `pj@overdrive.co.za`.

Subject: `Superbowl Daily Update Log [dd MMM yyyy]`.

From address: `administrator@rgbc.co.za` in a non-DEBUG build, via `My.Settings.SMTPHost` (committed default `tullamore.rgbc.local`). DEBUG builds use Office 365 (see technical documentation). Credentials are not repeated here.

`Run()` sets `blnEmail = 1` on log rows at or after the batch stamp only when `blnError` is true, then always calls `MailLog`. Rows inserted with `blnEmail = 0` are not selected. `WriteLog` defaults `blnEmail` to 0 except where callers pass 1 (some row errors).

**Inferred.** A clean batch sends an email with an empty table, because `MailLog` still loops recipients. That behaviour is what the code does. Whether operators expect a mail only on failure is **Unknown / Requires Confirmation**.

`WriteLog` retries the insert three times with a 13 ms sleep. If all three fail, the line is written to the file log instead.

`btnEmail` sends the current flagged rows without running the batch.

## FR-020 — File error log

Requirement: errors and batch start/end lines append to `{exe}\Logs\error_{yyyyMMdd}.log`.

Format: `yyyy-MM-dd HH:mm:ss | LEVEL | context | message`, plus the exception text when present. The logger swallows its own IO failures. Unhandled UI exceptions are logged as `UnhandledException` and then follow the normal shutdown (`ExitApplication` is not forced false).

`Run` writes `Update Start` and `Update End`, with ` (fatal)` when the outer catch ran.

Implementation: Implemented (`1ba6c4a`).

## Constraints

- SQL is concatenated and sent through `SqlDataAdapter`. `CleanString` doubles single quotes and turns double quotes into single quotes. It is not a parameter API.
- Three connection classes each open their own `SqlConnection` from the same setting. DEBUG compile uses `SQLConnectionDebug`. Otherwise `SQLConnectionRelease`.
- `Option Strict` is off.
- Jet OLEDB 4.0 is required for `.txt`, `.csv`, and `.xls`.
- ClickOnce updates are disabled (`UpdateEnabled` false). Publish URL is `C:\Documents and Settings\Pj\Desktop\rgbc Daily\`.
- No automated test project is in the repository.

## Integrations

| System | Direction | Trigger | Data | Auth as implemented | Failure |
|---|---|---|---|---|---|
| SQL Server `Superbowl` | Read/write | Every query | Staging, masters, warehouse, `sysQuery`, logs | Integrated security on the Hennessy/Benriach release strings. SQL authentication on the debug strings. | Most steps log and continue. A failure before `MailLog` still attempts mail. |
| `\\Hennessy\Sales\snell\reports\rgbc\` | Inbound file | Start of `Run` | cognos09, cognos14, zmb59-daily, cognos12 | Process identity | Copy error logged, file skipped |
| `\\Hennessy\Sales\ftp.bmi\` | Inbound move | Each `Run` | `AdSpend.xls` | Process identity | Logged if the move throws |
| `\\Hennessy\Sales\eSalesCharter\` | Inbound copy | Disabled (`And False`) | Mint CSV names | — | Not executed |
| `\\Hennessy\Sales\eSalesCharter\NewFiles\` | Outbound copy | **SCQ** only | Three CSV files | Process identity | Per-file log |
| SMTP | Outbound | End of `Run`, **Email**, **Mondayly** | HTML log; BFBE attachments | See technical documentation | Logged; debug builds may show a message box |

`sysQuery` content, share permissions, and whether Hennessy is still the production host are **Unknown / Requires Confirmation**.
