quickbooks-medusa-plugin 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +1832 -0
- package/.medusa/server/src/admin/index.mjs +1831 -0
- package/.medusa/server/src/api/admin/plugin/route.js +7 -0
- package/.medusa/server/src/api/admin/quickbooks/callback/route.js +95 -0
- package/.medusa/server/src/api/admin/quickbooks/connect/route.js +12 -0
- package/.medusa/server/src/api/admin/quickbooks/connection/route.js +32 -0
- package/.medusa/server/src/api/admin/quickbooks/disconnect/route.js +16 -0
- package/.medusa/server/src/api/admin/quickbooks/settings/route.js +33 -0
- package/.medusa/server/src/api/admin/quickbooks/webhooks/route.js +95 -0
- package/.medusa/server/src/api/store/plugin/route.js +7 -0
- package/.medusa/server/src/modules/quickbooks/index.js +13 -0
- package/.medusa/server/src/modules/quickbooks/migrations/Migration20260107000000.js +19 -0
- package/.medusa/server/src/modules/quickbooks/models/index.js +10 -0
- package/.medusa/server/src/modules/quickbooks/models/quickbooks-connection.js +20 -0
- package/.medusa/server/src/modules/quickbooks/models/quickbooks-settings.js +27 -0
- package/.medusa/server/src/modules/quickbooks/models/quickbooks-sync-mapping.js +20 -0
- package/.medusa/server/src/modules/quickbooks/services/quickbooks-service.js +425 -0
- package/.medusa/server/src/subscribers/quickbooks-order-sync.js +18 -0
- package/.medusa/server/src/subscribers/quickbooks-product-sync.js +26 -0
- package/.medusa/server/src/subscribers/quickbooks-sync.js +22 -0
- package/.medusa/server/src/workflows/index.js +23 -0
- package/.medusa/server/src/workflows/steps/order/sync-order-to-quickbooks.js +41 -0
- package/.medusa/server/src/workflows/steps/order/transform-order.js +78 -0
- package/.medusa/server/src/workflows/steps/order/update-order-mapping.js +17 -0
- package/.medusa/server/src/workflows/steps/order/validate-order-sync.js +23 -0
- package/.medusa/server/src/workflows/steps/reverse-sync/sync-customer-from-quickbooks.js +102 -0
- package/.medusa/server/src/workflows/steps/reverse-sync/sync-inventory-from-quickbooks.js +62 -0
- package/.medusa/server/src/workflows/steps/reverse-sync/sync-order-status-from-quickbooks.js +76 -0
- package/.medusa/server/src/workflows/steps/sync-customer-to-quickbooks.js +55 -0
- package/.medusa/server/src/workflows/steps/sync-product-to-quickbooks.js +59 -0
- package/.medusa/server/src/workflows/steps/transform-customer.js +41 -0
- package/.medusa/server/src/workflows/steps/transform-product.js +39 -0
- package/.medusa/server/src/workflows/steps/update-product-sync-mapping.js +17 -0
- package/.medusa/server/src/workflows/steps/update-sync-mapping.js +17 -0
- package/.medusa/server/src/workflows/steps/validate-customer-sync.js +17 -0
- package/.medusa/server/src/workflows/steps/validate-product-sync.js +17 -0
- package/.medusa/server/src/workflows/sync-customer-from-quickbooks.js +10 -0
- package/.medusa/server/src/workflows/sync-customer-to-quickbooks.js +32 -0
- package/.medusa/server/src/workflows/sync-inventory-from-quickbooks.js +10 -0
- package/.medusa/server/src/workflows/sync-order-status-from-quickbooks.js +10 -0
- package/.medusa/server/src/workflows/sync-order-to-quickbooks.js +28 -0
- package/.medusa/server/src/workflows/sync-product-to-quickbooks.js +31 -0
- package/README.md +104 -0
- package/package.json +75 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
async function GET(req, res) {
|
|
5
|
+
res.sendStatus(200);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const quickbooks_1 = require("../../../../modules/quickbooks");
|
|
5
|
+
const GET = async (req, res) => {
|
|
6
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
7
|
+
try {
|
|
8
|
+
const { code, realmId, state, error } = req.query;
|
|
9
|
+
if (error) {
|
|
10
|
+
return res.send(renderErrorPage(`QuickBooks connection failed: ${error}`));
|
|
11
|
+
}
|
|
12
|
+
if (!code || !realmId) {
|
|
13
|
+
return res.send(renderErrorPage("Missing required parameters"));
|
|
14
|
+
}
|
|
15
|
+
// Exchange code for tokens
|
|
16
|
+
await quickBooksService.exchangeCodeForTokens(code, realmId);
|
|
17
|
+
// Fetch company info to update connection
|
|
18
|
+
await quickBooksService.getCompanyInfo();
|
|
19
|
+
return res.send(renderSuccessPage(realmId));
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error("QuickBooks OAuth callback error:", error);
|
|
23
|
+
return res.send(renderErrorPage(error.message || "Connection failed"));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.GET = GET;
|
|
27
|
+
function renderSuccessPage(realmId) {
|
|
28
|
+
return `
|
|
29
|
+
<!DOCTYPE html>
|
|
30
|
+
<html lang="en">
|
|
31
|
+
<head>
|
|
32
|
+
<meta charset="UTF-8">
|
|
33
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
34
|
+
<title>QuickBooks Connected</title>
|
|
35
|
+
<style>
|
|
36
|
+
body { font-family: -apple-system, sans-serif; margin: 0; padding: 40px; display: flex; align-items: center; justify-content: center; min-height: 100vh; background: #f8fafc; }
|
|
37
|
+
.container { text-align: center; background: white; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); max-width: 400px; }
|
|
38
|
+
.success { color: #059669; }
|
|
39
|
+
.check { width: 64px; height: 64px; background: #10b981; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px; }
|
|
40
|
+
.check::after { content: '✓'; color: white; font-size: 32px; font-weight: bold; }
|
|
41
|
+
h1 { margin: 0 0 16px; font-size: 24px; }
|
|
42
|
+
p { margin: 0 0 24px; color: #64748b; }
|
|
43
|
+
.btn { background: #3b82f6; color: white; padding: 12px 24px; border: none; border-radius: 6px; cursor: pointer; }
|
|
44
|
+
.btn:hover { background: #2563eb; }
|
|
45
|
+
</style>
|
|
46
|
+
</head>
|
|
47
|
+
<body>
|
|
48
|
+
<div class="container">
|
|
49
|
+
<div class="check"></div>
|
|
50
|
+
<h1 class="success">QuickBooks Connected!</h1>
|
|
51
|
+
<p>Successfully connected to QuickBooks company.</p>
|
|
52
|
+
<p><strong>Company ID:</strong> ${realmId}</p>
|
|
53
|
+
<button class="btn" onclick="window.close()">Complete Setup</button>
|
|
54
|
+
</div>
|
|
55
|
+
<script>
|
|
56
|
+
window.opener?.postMessage({ type: 'quickbooks_oauth_success', realmId: '${realmId}' }, window.location.origin);
|
|
57
|
+
setTimeout(() => window.close(), 2000);
|
|
58
|
+
</script>
|
|
59
|
+
</body>
|
|
60
|
+
</html>
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
function renderErrorPage(message) {
|
|
64
|
+
return `
|
|
65
|
+
<!DOCTYPE html>
|
|
66
|
+
<html lang="en">
|
|
67
|
+
<head>
|
|
68
|
+
<meta charset="UTF-8">
|
|
69
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
70
|
+
<title>Connection Failed</title>
|
|
71
|
+
<style>
|
|
72
|
+
body { font-family: -apple-system, sans-serif; margin: 0; padding: 40px; display: flex; align-items: center; justify-content: center; min-height: 100vh; background: #f8fafc; }
|
|
73
|
+
.container { text-align: center; background: white; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); max-width: 400px; }
|
|
74
|
+
.error { color: #dc2626; }
|
|
75
|
+
h1 { margin: 0 0 16px; font-size: 24px; }
|
|
76
|
+
p { margin: 0 0 24px; color: #64748b; }
|
|
77
|
+
.btn { background: #3b82f6; color: white; padding: 12px 24px; border: none; border-radius: 6px; cursor: pointer; }
|
|
78
|
+
.btn:hover { background: #2563eb; }
|
|
79
|
+
</style>
|
|
80
|
+
</head>
|
|
81
|
+
<body>
|
|
82
|
+
<div class="container">
|
|
83
|
+
<h1 class="error">Connection Failed</h1>
|
|
84
|
+
<p>${message}</p>
|
|
85
|
+
<button class="btn" onclick="window.close()">Close Window</button>
|
|
86
|
+
</div>
|
|
87
|
+
<script>
|
|
88
|
+
window.opener?.postMessage({ type: 'quickbooks_oauth_error', error: '${message}' }, window.location.origin);
|
|
89
|
+
setTimeout(() => window.close(), 3000);
|
|
90
|
+
</script>
|
|
91
|
+
</body>
|
|
92
|
+
</html>
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3F1aWNrYm9va3MvY2FsbGJhY2svcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0RBQWtFO0FBRTNELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNqRSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUE0QixDQUFBO0lBRXpGLElBQUksQ0FBQztRQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFBO1FBRWpELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGlDQUFpQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDOUUsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQTtRQUNuRSxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE1BQU0saUJBQWlCLENBQUMscUJBQXFCLENBQUMsSUFBYyxFQUFFLE9BQWlCLENBQUMsQ0FBQTtRQUVoRiwwQ0FBMEM7UUFDMUMsTUFBTSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUV4QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBaUIsQ0FBQyxDQUFDLENBQUE7SUFFekQsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN4RCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFBO0lBQzFFLENBQUM7QUFDTCxDQUFDLENBQUE7QUExQlksUUFBQSxHQUFHLE9BMEJmO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxPQUFlO0lBQ3RDLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQ0F3QitCLE9BQU87Ozs7bUZBSWtDLE9BQU87Ozs7O0dBS3ZGLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBZTtJQUNwQyxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQW9CRSxPQUFPOzs7OytFQUkyRCxPQUFPOzs7OztHQUtuRixDQUFBO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const quickbooks_1 = require("../../../../modules/quickbooks");
|
|
5
|
+
const GET = async (req, res) => {
|
|
6
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
7
|
+
const state = Math.random().toString(36).substring(7);
|
|
8
|
+
const authUrl = quickBooksService.getAuthorizationUrl(state);
|
|
9
|
+
res.json({ authUrl, state });
|
|
10
|
+
};
|
|
11
|
+
exports.GET = GET;
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3F1aWNrYm9va3MvY29ubmVjdC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwrREFBa0U7QUFFM0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ2pFLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQTRCLENBQUE7SUFFekYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0FBQ2hDLENBQUMsQ0FBQTtBQVBZLFFBQUEsR0FBRyxPQU9mIn0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const quickbooks_1 = require("../../../../modules/quickbooks");
|
|
5
|
+
const GET = async (req, res) => {
|
|
6
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
7
|
+
try {
|
|
8
|
+
const connection = await quickBooksService.getActiveConnection();
|
|
9
|
+
if (!connection) {
|
|
10
|
+
return res.json({
|
|
11
|
+
connected: false,
|
|
12
|
+
connection: null,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
res.json({
|
|
16
|
+
connected: true,
|
|
17
|
+
connection: {
|
|
18
|
+
realm_id: connection.realm_id,
|
|
19
|
+
company_name: connection.company_name,
|
|
20
|
+
environment: connection.environment,
|
|
21
|
+
is_active: connection.is_active,
|
|
22
|
+
last_sync_at: connection.last_sync_at,
|
|
23
|
+
token_expires_at: connection.token_expires_at,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
res.status(500).json({ error: error.message });
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
exports.GET = GET;
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3F1aWNrYm9va3MvY29ubmVjdGlvbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwrREFBa0U7QUFFM0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ2pFLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQTRCLENBQUE7SUFFekYsSUFBSSxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBRWhFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNkLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDWixTQUFTLEVBQUUsS0FBSztnQkFDaEIsVUFBVSxFQUFFLElBQUk7YUFDbkIsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQUVELEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLFVBQVUsRUFBRTtnQkFDUixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7Z0JBQzdCLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTtnQkFDckMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO2dCQUNuQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7Z0JBQy9CLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTtnQkFDckMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjthQUNoRDtTQUNKLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ2xELENBQUM7QUFDTCxDQUFDLENBQUE7QUEzQlksUUFBQSxHQUFHLE9BMkJmIn0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const quickbooks_1 = require("../../../../modules/quickbooks");
|
|
5
|
+
const POST = async (req, res) => {
|
|
6
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
7
|
+
try {
|
|
8
|
+
await quickBooksService.disconnect();
|
|
9
|
+
res.json({ success: true, message: "Disconnected from QuickBooks" });
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
res.status(500).json({ success: false, error: error.message });
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
exports.POST = POST;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3F1aWNrYm9va3MvZGlzY29ubmVjdC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwrREFBa0U7QUFFM0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ2xFLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQWlCLENBQTRCLENBQUE7SUFFekYsSUFBSSxDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNwQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDbEUsQ0FBQztBQUNMLENBQUMsQ0FBQTtBQVRZLFFBQUEsSUFBSSxRQVNoQiJ9
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PUT = exports.GET = void 0;
|
|
4
|
+
const quickbooks_1 = require("../../../../modules/quickbooks");
|
|
5
|
+
const GET = async (req, res) => {
|
|
6
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
7
|
+
try {
|
|
8
|
+
const settings = await quickBooksService.getOrCreateSettings();
|
|
9
|
+
res.json({ settings });
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
res.status(500).json({ error: error.message });
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
exports.GET = GET;
|
|
16
|
+
const PUT = async (req, res) => {
|
|
17
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
18
|
+
try {
|
|
19
|
+
const currentSettings = await quickBooksService.getOrCreateSettings();
|
|
20
|
+
await quickBooksService.updateQuickBooksSettings([{
|
|
21
|
+
selector: { id: currentSettings.id },
|
|
22
|
+
data: req.body,
|
|
23
|
+
}]);
|
|
24
|
+
const updatedSettings = await quickBooksService.getOrCreateSettings();
|
|
25
|
+
console.log("[QuickBooks Settings] Updated:", updatedSettings);
|
|
26
|
+
res.json({ settings: updatedSettings });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
res.status(500).json({ error: error.message });
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.PUT = PUT;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3F1aWNrYm9va3Mvc2V0dGluZ3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0RBQWtFO0FBRTNELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNqRSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUE0QixDQUFBO0lBRXpGLElBQUksQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0saUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUM5RCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0FBQ0wsQ0FBQyxDQUFBO0FBVFksUUFBQSxHQUFHLE9BU2Y7QUFFTSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDakUsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBaUIsQ0FBNEIsQ0FBQTtJQUV6RixJQUFJLENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFFckUsTUFBTSxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2dCQUM5QyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFXO2FBQ3hCLENBQUMsQ0FBQyxDQUFBO1FBRUgsTUFBTSxlQUFlLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFFOUQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ2xELENBQUM7QUFDTCxDQUFDLENBQUE7QUFsQlksUUFBQSxHQUFHLE9Ba0JmIn0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.POST = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const quickbooks_1 = require("../../../../modules/quickbooks");
|
|
9
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
10
|
+
const workflows_1 = require("../../../../workflows");
|
|
11
|
+
/**
|
|
12
|
+
* QuickBooks Webhook Handler
|
|
13
|
+
* Receives real-time notifications from QuickBooks
|
|
14
|
+
*/
|
|
15
|
+
const POST = async (req, res) => {
|
|
16
|
+
const quickBooksService = req.scope.resolve(quickbooks_1.QUICKBOOKS_MODULE);
|
|
17
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
18
|
+
try {
|
|
19
|
+
// Verify webhook signature
|
|
20
|
+
const verifierToken = process.env.QUICKBOOKS_WEBHOOK_VERIFIER_TOKEN;
|
|
21
|
+
if (verifierToken) {
|
|
22
|
+
const signature = req.headers["intuit-signature"];
|
|
23
|
+
if (!signature) {
|
|
24
|
+
logger.warn("[QB Webhook] Missing intuit-signature header");
|
|
25
|
+
return res.status(401).json({ error: "Missing signature" });
|
|
26
|
+
}
|
|
27
|
+
const payload = JSON.stringify(req.body);
|
|
28
|
+
const hash = crypto_1.default
|
|
29
|
+
.createHmac("sha256", verifierToken)
|
|
30
|
+
.update(payload)
|
|
31
|
+
.digest("base64");
|
|
32
|
+
if (hash !== signature) {
|
|
33
|
+
logger.warn("[QB Webhook] Invalid signature");
|
|
34
|
+
return res.status(401).json({ error: "Invalid signature" });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const body = req.body;
|
|
38
|
+
logger.info(`[QB Webhook] Received event: ${JSON.stringify(body, null, 2)}`);
|
|
39
|
+
// Get settings to check which reverse syncs are enabled
|
|
40
|
+
const settings = await quickBooksService.getOrCreateSettings();
|
|
41
|
+
// Process each event notification
|
|
42
|
+
for (const notification of body.eventNotifications || []) {
|
|
43
|
+
const realmId = notification.realmId;
|
|
44
|
+
const events = notification.dataChangeEvent?.entities || [];
|
|
45
|
+
for (const event of events) {
|
|
46
|
+
const entityType = event.name;
|
|
47
|
+
const entityId = event.id;
|
|
48
|
+
const operation = event.operation;
|
|
49
|
+
logger.info(`[QB Webhook] ${operation} ${entityType} ${entityId} (realm: ${realmId})`);
|
|
50
|
+
switch (entityType) {
|
|
51
|
+
case "Customer":
|
|
52
|
+
if (settings.reverse_sync_customers) {
|
|
53
|
+
logger.info(`[QB Webhook] Syncing customer ${entityId} to Medusa`);
|
|
54
|
+
await (0, workflows_1.syncCustomerFromQuickBooksWorkflow)(req.scope).run({
|
|
55
|
+
input: { quickbooksCustomerId: entityId }
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
case "Item":
|
|
60
|
+
if (settings.reverse_sync_inventory) {
|
|
61
|
+
logger.info(`[QB Webhook] Syncing item ${entityId} inventory to Medusa`);
|
|
62
|
+
await (0, workflows_1.syncInventoryFromQuickBooksWorkflow)(req.scope).run({
|
|
63
|
+
input: { quickbooksItemId: entityId }
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
case "Invoice":
|
|
68
|
+
case "SalesReceipt":
|
|
69
|
+
if (settings.reverse_sync_order_status) {
|
|
70
|
+
logger.info(`[QB Webhook] Syncing ${entityType} ${entityId} status to Medusa`);
|
|
71
|
+
await (0, workflows_1.syncOrderStatusFromQuickBooksWorkflow)(req.scope).run({
|
|
72
|
+
input: {
|
|
73
|
+
quickbooksEntityId: entityId,
|
|
74
|
+
entityType: entityType
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
case "Payment":
|
|
80
|
+
logger.info(`[QB Webhook] Payment event received for ${entityId}`);
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
logger.info(`[QB Webhook] Unhandled entity type: ${entityType}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
res.status(200).json({ status: "received" });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.error(`[QB Webhook] Error: ${error.message}`);
|
|
91
|
+
res.status(500).json({ error: error.message });
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
exports.POST = POST;
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3F1aWNrYm9va3Mvd2ViaG9va3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esb0RBQTJCO0FBRTNCLCtEQUFrRTtBQUNsRSxxREFBcUU7QUFDckUscURBQXNKO0FBRXRKOzs7R0FHRztBQUNJLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNsRSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUE0QixDQUFBO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRWxFLElBQUksQ0FBQztRQUNELDJCQUEyQjtRQUMzQixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFBO1FBQ25FLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBVyxDQUFBO1lBQzNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7Z0JBQzNELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFBO1lBQy9ELENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN4QyxNQUFNLElBQUksR0FBRyxnQkFBTTtpQkFDZCxVQUFVLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQztpQkFD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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
async function GET(req, res) {
|
|
5
|
+
res.sendStatus(200);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.QUICKBOOKS_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const quickbooks_service_1 = __importDefault(require("./services/quickbooks-service"));
|
|
9
|
+
exports.QUICKBOOKS_MODULE = "quickbooksModuleService";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.QUICKBOOKS_MODULE, {
|
|
11
|
+
service: quickbooks_service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9xdWlja2Jvb2tzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFrRDtBQUNsRCx1RkFBbUU7QUFFdEQsUUFBQSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQTtBQUUxRCxrQkFBZSxJQUFBLGNBQU0sRUFBQyx5QkFBaUIsRUFBRTtJQUNyQyxPQUFPLEVBQUUsNEJBQXVCO0NBQ25DLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260107000000 = void 0;
|
|
4
|
+
const migrations_1 = require("@mikro-orm/migrations");
|
|
5
|
+
class Migration20260107000000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql('CREATE TABLE "quickbooks_connection" ("id" text not null, "realm_id" text not null, "company_name" text null, "access_token" text not null, "refresh_token" text not null, "token_expires_at" timestamptz not null, "refresh_token_expires_at" timestamptz null, "is_active" boolean not null default false, "environment" text not null default \'sandbox\', "last_sync_at" timestamptz null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), constraint "quickbooks_connection_pkey" primary key ("id"));');
|
|
8
|
+
this.addSql('ALTER TABLE "quickbooks_connection" ADD CONSTRAINT "quickbooks_connection_realm_id_unique" UNIQUE ("realm_id");');
|
|
9
|
+
this.addSql('CREATE TABLE "quickbooks_settings" ("id" text not null, "auto_sync_customers" boolean not null default true, "auto_sync_products" boolean not null default true, "auto_sync_orders" boolean not null default true, "reverse_sync_customers" boolean not null default false, "reverse_sync_inventory" boolean not null default false, "reverse_sync_order_status" boolean not null default false, "webhook_enabled" boolean not null default true, "income_account_id" text null, "cogs_account_id" text null, "asset_account_id" text null, "deposit_account_id" text null, "updated_by" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), constraint "quickbooks_settings_pkey" primary key ("id"));');
|
|
10
|
+
this.addSql('CREATE TABLE "quickbooks_sync_mapping" ("id" text not null, "medusa_entity_type" text not null, "medusa_entity_id" text not null, "quickbooks_entity_type" text not null, "quickbooks_entity_id" text not null, "sync_token" text null, "sync_status" text not null default \'pending\', "last_synced_at" timestamptz null, "error_message" text null, "retry_count" integer not null default 0, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), constraint "quickbooks_sync_mapping_pkey" primary key ("id"));');
|
|
11
|
+
}
|
|
12
|
+
async down() {
|
|
13
|
+
this.addSql('DROP TABLE "quickbooks_sync_mapping";');
|
|
14
|
+
this.addSql('DROP TABLE "quickbooks_settings";');
|
|
15
|
+
this.addSql('DROP TABLE "quickbooks_connection";');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.Migration20260107000000 = Migration20260107000000;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAxMDcwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9xdWlja2Jvb2tzL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjAxMDcwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQWtEO0FBRWxELE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFbEQsS0FBSyxDQUFDLEVBQUU7UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLHNqQkFBc2pCLENBQUMsQ0FBQztRQUNwa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpSEFBaUgsQ0FBQyxDQUFDO1FBRS9ILElBQUksQ0FBQyxNQUFNLENBQUMsa3VCQUFrdUIsQ0FBQyxDQUFDO1FBRWh2QixJQUFJLENBQUMsTUFBTSxDQUFDLDBqQkFBMGpCLENBQUMsQ0FBQztJQUM1a0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUVKO0FBakJELDBEQWlCQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuickBooksSettings = exports.QuickBooksSyncMapping = exports.QuickBooksConnection = void 0;
|
|
4
|
+
var quickbooks_connection_1 = require("./quickbooks-connection");
|
|
5
|
+
Object.defineProperty(exports, "QuickBooksConnection", { enumerable: true, get: function () { return quickbooks_connection_1.QuickBooksConnection; } });
|
|
6
|
+
var quickbooks_sync_mapping_1 = require("./quickbooks-sync-mapping");
|
|
7
|
+
Object.defineProperty(exports, "QuickBooksSyncMapping", { enumerable: true, get: function () { return quickbooks_sync_mapping_1.QuickBooksSyncMapping; } });
|
|
8
|
+
var quickbooks_settings_1 = require("./quickbooks-settings");
|
|
9
|
+
Object.defineProperty(exports, "QuickBooksSettings", { enumerable: true, get: function () { return quickbooks_settings_1.QuickBooksSettings; } });
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9xdWlja2Jvb2tzL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRUFBOEQ7QUFBckQsNkhBQUEsb0JBQW9CLE9BQUE7QUFDN0IscUVBQWlFO0FBQXhELGdJQUFBLHFCQUFxQixPQUFBO0FBQzlCLDZEQUEwRDtBQUFqRCx5SEFBQSxrQkFBa0IsT0FBQSJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuickBooksConnection = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
exports.QuickBooksConnection = utils_1.model.define("quickbooks_connection", {
|
|
6
|
+
id: utils_1.model.id().primaryKey(),
|
|
7
|
+
realm_id: utils_1.model.text().unique(),
|
|
8
|
+
company_name: utils_1.model.text().nullable(),
|
|
9
|
+
access_token: utils_1.model.text(),
|
|
10
|
+
refresh_token: utils_1.model.text(),
|
|
11
|
+
token_expires_at: utils_1.model.dateTime(),
|
|
12
|
+
refresh_token_expires_at: utils_1.model.dateTime().nullable(),
|
|
13
|
+
is_active: utils_1.model.boolean().default(false),
|
|
14
|
+
environment: utils_1.model.enum(["sandbox", "production"]).default("sandbox"),
|
|
15
|
+
last_sync_at: utils_1.model.dateTime().nullable(),
|
|
16
|
+
metadata: utils_1.model.json().nullable(),
|
|
17
|
+
created_at: utils_1.model.dateTime().default(new Date()),
|
|
18
|
+
updated_at: utils_1.model.dateTime().default(new Date()),
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tib29rcy1jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcXVpY2tib29rcy9tb2RlbHMvcXVpY2tib29rcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFpRDtBQUVwQyxRQUFBLG9CQUFvQixHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUU7SUFDdEUsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7SUFDL0IsWUFBWSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDckMsWUFBWSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDMUIsYUFBYSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDM0IsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRTtJQUNsQyx3QkFBd0IsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3JELFNBQVMsRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN6QyxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDckUsWUFBWSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDekMsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDakMsVUFBVSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxVQUFVLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0NBQ25ELENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuickBooksSettings = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
exports.QuickBooksSettings = utils_1.model.define("quickbooks_settings", {
|
|
6
|
+
id: utils_1.model.id().primaryKey(),
|
|
7
|
+
// Forward sync settings (Medusa → QB)
|
|
8
|
+
auto_sync_customers: utils_1.model.boolean().default(true),
|
|
9
|
+
auto_sync_products: utils_1.model.boolean().default(true),
|
|
10
|
+
auto_sync_orders: utils_1.model.boolean().default(true),
|
|
11
|
+
// Reverse sync settings (QB → Medusa)
|
|
12
|
+
reverse_sync_customers: utils_1.model.boolean().default(false),
|
|
13
|
+
reverse_sync_inventory: utils_1.model.boolean().default(false),
|
|
14
|
+
reverse_sync_order_status: utils_1.model.boolean().default(false),
|
|
15
|
+
// Webhook settings
|
|
16
|
+
webhook_enabled: utils_1.model.boolean().default(true),
|
|
17
|
+
// Account configuration (for product sync)
|
|
18
|
+
income_account_id: utils_1.model.text().nullable(),
|
|
19
|
+
cogs_account_id: utils_1.model.text().nullable(),
|
|
20
|
+
asset_account_id: utils_1.model.text().nullable(),
|
|
21
|
+
deposit_account_id: utils_1.model.text().nullable(),
|
|
22
|
+
// Audit
|
|
23
|
+
updated_by: utils_1.model.text().nullable(),
|
|
24
|
+
created_at: utils_1.model.dateTime().default(new Date()),
|
|
25
|
+
updated_at: utils_1.model.dateTime().default(new Date()),
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tib29rcy1zZXR0aW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3F1aWNrYm9va3MvbW9kZWxzL3F1aWNrYm9va3Mtc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWlEO0FBRXBDLFFBQUEsa0JBQWtCLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTtJQUNsRSxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixzQ0FBc0M7SUFDdEMsbUJBQW1CLEVBQUUsYUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDbEQsa0JBQWtCLEVBQUUsYUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDakQsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDL0Msc0NBQXNDO0lBQ3RDLHNCQUFzQixFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3RELHNCQUFzQixFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3RELHlCQUF5QixFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3pELG1CQUFtQjtJQUNuQixlQUFlLEVBQUUsYUFBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDOUMsMkNBQTJDO0lBQzNDLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDMUMsZUFBZSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN6QyxrQkFBa0IsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNDLFFBQVE7SUFDUixVQUFVLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxVQUFVLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ2hELFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Q0FDbkQsQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuickBooksSyncMapping = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
exports.QuickBooksSyncMapping = utils_1.model.define("quickbooks_sync_mapping", {
|
|
6
|
+
id: utils_1.model.id().primaryKey(),
|
|
7
|
+
medusa_entity_type: utils_1.model.enum(["customer", "order", "product"]),
|
|
8
|
+
medusa_entity_id: utils_1.model.text(),
|
|
9
|
+
quickbooks_entity_type: utils_1.model.enum(["Customer", "Invoice", "Item", "SalesReceipt"]),
|
|
10
|
+
quickbooks_entity_id: utils_1.model.text(),
|
|
11
|
+
sync_token: utils_1.model.text().nullable(),
|
|
12
|
+
sync_status: utils_1.model.enum(["pending", "synced", "failed", "retry"]).default("pending"),
|
|
13
|
+
last_synced_at: utils_1.model.dateTime().nullable(),
|
|
14
|
+
error_message: utils_1.model.text().nullable(),
|
|
15
|
+
retry_count: utils_1.model.number().default(0),
|
|
16
|
+
metadata: utils_1.model.json().nullable(),
|
|
17
|
+
created_at: utils_1.model.dateTime().default(new Date()),
|
|
18
|
+
updated_at: utils_1.model.dateTime().default(new Date()),
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tib29rcy1zeW5jLW1hcHBpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9xdWlja2Jvb2tzL21vZGVscy9xdWlja2Jvb2tzLXN5bmMtbWFwcGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBaUQ7QUFFcEMsUUFBQSxxQkFBcUIsR0FBRyxhQUFLLENBQUMsTUFBTSxDQUFDLHlCQUF5QixFQUFFO0lBQ3pFLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLGtCQUFrQixFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDOUIsc0JBQXNCLEVBQUUsYUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ25GLG9CQUFvQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDbEMsVUFBVSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbkMsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDcEYsY0FBYyxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0MsYUFBYSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdEMsV0FBVyxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2pDLFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEQsVUFBVSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztDQUNuRCxDQUFDLENBQUEifQ==
|