Portal
Live Products
How travel product data reaches Microsoft Dynamics 365 Finance & Operations — architecture, controls, and posting path in one place.
Portal bookings become financial events. Dynamics 365 Finance & Operations is the system of record for ledgers, sub-ledgers, journals, and period control. This architecture moves product data safely from Portal → Report Server → Transit, then through validation, CSV intake, staging, and posting inside Dynamics 365 F&O.
Without a controlled path, invoices can miss masters, fail fiscal rules, or post incorrectly. The design below makes handoff visible so Product Tech and ERP teams know where to correct issues before journals are completed.
Click Play Journey to watch live data packets travel across stages. Blue = write/forward · Amber = read/repush. Data does not skip Report Server.
Live Products
Store + SQL Jobs
Bidirectional Bridge
Receive → Log → Handoff
Check → Correct → Ready
File → Share → Schedule
Staging → Journals → Completed
Operational rules and contacts for Dynamics 365 F&O go-lives and data processing (kept here so the top of the page stays focused on architecture).
Product/Sales agree with a vendor or customer and register them to get a Master Code. Without that code, the product cannot go live on the Portal. Portal activity is stored on the Report Server by legal entity and product. The Product Owner (Product Tech) moves data through a bidirectional API: it writes JSON into Transit and reads unprocessed/failed records to correct and repush. After data is in Transit, the ERP team owns detailed validation & fixes, then CSV generation, then staging → journal create → journal post → completed.
Product/Sales obtain vendor/customer code. Gatekeeper for any portal commercial activity.
Transactions store in entity-specific DBs (India, Holidays, Jumbo) ahead of transmission.
PushERPData sends 500-lot JSON batches. Unprocessed records are read back and repushed.
Strict rules validate ROE, closed periods, and prices before generating CSV & posting GL journals.
Follow the 5-step onboarding lifecycle to ensure new product integrations successfully clear commercial, technical, and ERP milestones:
Product / Sales complete commercial purchasing and setup with vendor or customer.
Fill Vendor or Customer Master template completely with legal, billing, and tax coordinates.
Provide verified information to the registration owner for entity catalog binding.
Distribute verified code to Technical Team & Technical Product Owner for pipeline linkage.
Code is linked in implementation; product is safely enabled on Portal with audit trails active.
Clear division of responsibility between Product Tech, ERP, and Finance teams ensures zero gaps during integration and daily ledger posting.
| Area | Owner |
|---|---|
| Agreement, masters, registration handoff | Product / Sales |
| Master Code association & Portal enablement | Technical Team + Product Owner |
| Report ↔ Transit movement (API write/read/repush, jobs, SPs, UAT) | Product Owner (Product Tech) |
| Transit → RIS → Staging → Posting → financial reporting | ERP Team |
| Portal GL errors on finance manual 2-side entries | Finance representative → correct on Portal → next-day push |
| ERP production go-live for new/changed products | Approval: Mr. Prabhat Kaushik / Anurag Aggarwal |
| Complete ERP technical area (migration, data processing, system control, performance enhancement, financial reporting & cost management) | Led by Vikram Singh |
| ERP data processing & UAT for new product and changes | erpteam@tbo.com |
Strict structural prerequisites must be verified prior to passing transactions into Transit and Dynamics 365 F&O:
SQL jobs on Report/application DBs transform data to compressed JSON in batches of 500. Master data is sent 1–2 hours ahead of transactions. API writes via PushERPData. On failure, API reads unprocessed/errors, data is corrected, then repushed.
After ownership switches to the ERP team, detailed validation runs (ROE rules, closed-month halt, special characters/spaces, calculated fields/grouping, sales vs purchase price alignment, masters). Failures notify Technical Product Owners; data is corrected. Only when all set does the flow continue.
Validated product data is written to CSV, landed in shared folders, and picked up by the recurring integrations scheduler.
Staging checks (mapping, masters, duplicates, currency) → journal create (GL/tax/currency/sub-ledger) → journal post (fiscal period/dimensions) → back-stamp to completed. Azure Synapse analytics is a separate track and is not part of this posting animation.
These core stored procedures power batch aggregation, transmission, validation counters, and error notifications across all source report databases:
| Stored Procedure | Purpose |
|---|---|
| usp_ERPServiceStatus | ERP service active? Returns 0 or 1 |
| usp_ExportERPFileData | Filename-wise raw data; compress; calls push SP; may send error mail |
| usp_ERPTransitDataProvider | Write Report → Transit via PushERPData JSON |
| usp_ERPTransitErrorDataProvider | Read failed txns via GetERPErrorTransactions (PKId_Name, PKId_Value) |
| usp_ERPDataValidation | Daily Report invoice count vs Transit invoices pushed |
| usp_SendERPErrorMail | Notify if lot failed to push (called from export SP) |
| Table Name | Purpose |
|---|---|
| ERPService_Audit | JSON log transferring from application DB to ERP Transit DB |
| ERPTransitLogger | Previously pushed transaction data to ERP, service-wise, with Status |
| Table Name | Purpose |
|---|---|
| ERP_SalesErrorFile | Exceptions raised by ERP application |
| ERPDataRequestAudit | JSON log from DB job to ERP Transit Service |
| ERPDataRequestLogger | Lot ID–wise and transaction-wise update status |
| ERP_Audit | Audit log for ERP Service and CSV file generation |
Transit also has a dedicated table per product across legal entities, based on Gross / Net accounting behaviour.
The IsProcess status flag governs whether a record proceeds into CSV staging, triggers an automated repush, or is placed on hold:
Successfully generated into CSV & pushed to ERP.
Pending ingestion in next scheduled CSV run.
Failed validation; reprocessed from source DB release.
Price mismatch between customer and vendor/customer.
Held for manual exception review and period verification.
| IsProcess Code | Operational Meaning |
|---|---|
| 1 | Successfully pushed to ERP via CSV generation |
| 0 | Will push in next CSV run |
| 2 | Failed — reprocess in next release from source DB |
| 3 | Declined — price mismatch customer vs Vendor/Customer |
| 4 | On hold for correction |
| 9 / 10 | Discarded — incorrect data or on request |
TransitDate = first push date · UpdatedDate = last update date
TBOI = India · TBOH = Holidays · JUMBO = Jumbonline
| Functionality | TBOI | TBOH | JUMBO |
|---|---|---|---|
| Vendor/Customer Master | Enabled | Enabled | Enabled |
| Agency Master | Enabled | Enabled | Enabled |
| Employee Master | Enabled | Enabled | Enabled |
| Published ROE | Enabled | Enabled | Enabled |
| Hotel | Enabled | Enabled | Enabled |
| Air | Enabled | Enabled | - |
| Transfer | Enabled | Enabled | - |
| Sightseeing | Enabled | Enabled | - |
| Insurance | Enabled | Enabled | - |
| Bus | Enabled | - | - |
| Mobile | Enabled | - | - |
| Train | Enabled | - | - |
| Eurorail | Enabled | - | - |
| Car | Enabled | Enabled | - |
| SMS | Enabled | Enabled | - |
| MISC | Enabled | - | - |
| JV | Enabled | Enabled | Enabled |
| GO/GI | Enabled | - | - |
| ADM/ACM | Enabled | - | - |
| Payment / Wallet Receipt | Enabled | Enabled | Enabled |
| Direct Debit | Enabled | - | - |
| Deposit Incentive | Enabled | - | - |
| Invoice Allocation | Enabled | Enabled | Enabled |
| Vendor/Customer Allocation | - | Enabled | Enabled |
| Vendor/Customer Invoice Journal | - | - | Enabled |
For UAT, Product Team can write to ERP Sandbox using PushERPData:
curl --location 'https://SandboxERP.tboholidays.com/api/Transit/PushERPData?Content-type=application%2Fjson' \
--header 'Content-Type: application/json' \
--data '{
"CompanyCode": 9999,
"FileName": "UAT",
"LotId": 1,
"ERPDataJSON": "[Data in JsonString]"
}'
{
"Status": 1,
"LotId": 1,
"CompanyCode": 9999,
"FileName": "UAT",
"Message": "Lot data accepted into Transit DB successfully. Ready for validation.",
"TransitAuditId": 984210,
"Timestamp": "2026-10-30T17:25:00Z"
}
ERPDataJSON must be a JSON string inside the request body. Sandbox only — not production.
Definitions of mission-critical architecture entities, systems, and protocols:
| Term | Architectural Meaning |
|---|---|
| Portal | Live product system; needs Master Code to enable services |
| Report Server | Where Portal data is stored by legal entity & product before Transit push |
| API Service | Bidirectional: write PushERPData; read errors/unprocessed; repush |
| Transit DB | Holding area; ERP ownership starts after receipt |
| Dynamics 365 F&O | Microsoft Dynamics 365 Finance & Operations — finance system of record |
| RIS / CSV | Validated file generation toward Dynamics 365 F&O integrations |
| TBOI / TBOH / JUMBO | India / Holidays / Jumbonline |
| Lot | Batch of records in a push |
| IsProcess | Status of a Transit transaction toward ERP CSV |