UNPKG

@lineai/gov-deals

Version:

Explore Federal contracts for government building renovations, city hall renovations, courthouse updates, library modernizations, federal building improvement contracts, base housing and facilities upgrades.

167 lines 12.1 kB
"use strict"; /** * Field mapping between CSV columns and SAM.gov API fields * * The CSV uses different field names than the API, so we need to map between them */ Object.defineProperty(exports, "__esModule", { value: true }); exports.filterCsvRow = exports.mapCsvToSamOpportunity = void 0; /** * Map CSV row to SAM.gov opportunity format */ function mapCsvToSamOpportunity(csvRow) { return { // Core identifiers noticeId: csvRow.NoticeId, title: csvRow.Title, solicitationNumber: csvRow['Sol#'], // Agency information fullParentPathName: csvRow['Department/Ind.Agency'], fullParentPathCode: csvRow.CGAC, organizationType: csvRow.OrganizationType, // Dates postedDate: csvRow.PostedDate, responseDeadLine: csvRow.ResponseDeadLine, archiveDate: csvRow.ArchiveDate, // Type information type: csvRow.Type, baseType: csvRow.BaseType, archiveType: csvRow.ArchiveType, // Set-aside information (map the text value to our enum codes) typeOfSetAside: mapSetAsideTextToCode(csvRow.SetASide), typeOfSetAsideDescription: csvRow.SetASide, // Classification naicsCode: String(csvRow.NaicsCode), naicsCodes: [String(csvRow.NaicsCode)], classificationCode: csvRow.ClassificationCode, // Status active: csvRow.Active === '1' ? 'Yes' : 'No', // Description URL description: csvRow.Description || `/opportunities/v1/noticedesc?noticeid=${csvRow.NoticeId}`, // Contacts - map to array format pointOfContact: [ ...(csvRow.PrimaryContactFullname ? [{ type: 'primary', fullName: csvRow.PrimaryContactFullname, title: csvRow.PrimaryContactTitle, email: csvRow.PrimaryContactEmail, phone: csvRow.PrimaryContactPhone, fax: csvRow.PrimaryContactFax, }] : []), ...(csvRow.SecondaryContactFullname ? [{ type: 'secondary', fullName: csvRow.SecondaryContactFullname, title: csvRow.SecondaryContactTitle, email: csvRow.SecondaryContactEmail, phone: csvRow.SecondaryContactPhone, fax: csvRow.SecondaryContactFax, }] : []), ], // Addresses officeAddress: csvRow.City ? { city: csvRow.City, state: csvRow.State, zipcode: csvRow.ZipCode, countryCode: csvRow.CountryCode, } : null, placeOfPerformance: csvRow.PopCity ? { city: { code: csvRow.PopCity || undefined, name: csvRow.PopCity || undefined, }, state: { code: csvRow.PopState || undefined, name: csvRow.PopState || undefined, // Use same value for both code and name }, country: { code: csvRow.PopCountry || undefined, name: csvRow.PopCountry || undefined, }, } : null, // Award information award: csvRow.AwardNumber ? { awardee: { name: csvRow.Awardee, manual: false, } } : null, // Links uiLink: csvRow.Link, additionalInfoLink: csvRow.AdditionalInfoLink, links: [], resourceLinks: null, // CSV doesn't have resource links }; } exports.mapCsvToSamOpportunity = mapCsvToSamOpportunity; /** * Map set-aside text descriptions to codes * Based on the analysis, we saw these set-aside values in the CSV */ function mapSetAsideTextToCode(setAsideText) { if (!setAsideText || setAsideText === 'None/Null') return null; const mapping = { 'Total Small Business Set-Aside (FAR 19.5)': 'SBA', 'Service-Disabled Veteran-Owned Small Business (SDVOSB) Set-Aside (FAR 19.14)': 'SBP', 'SBA Certified Women-Owned Small Business (WOSB) Program Set-Aside (FAR 19.15)': 'WOSB', 'Historically Underutilized Business (HUBZone) Set-Aside (FAR 19.13)': 'HUB', '8(a) Set-Aside (FAR 19.8)': '8AN', 'Veteran-Owned Small Business Set-Aside (specific to Department of Veterans Affairs)': 'VSA', 'No Set aside used': '', }; // Return the code if we have a mapping, otherwise keep the original text return mapping[setAsideText] || setAsideText; } /** * Filter CSV rows based on SAM.gov search filters */ function filterCsvRow(row, filters) { var _a, _b, _c; if (!filters) return true; // Keywords search in title if (filters.keywords) { const keywords = filters.keywords.toLowerCase(); if (!row.Title.toLowerCase().includes(keywords)) { return false; } } // NAICS codes filter if ((_a = filters.naicsCodes) === null || _a === void 0 ? void 0 : _a.length) { const naicsStr = String(row.NaicsCode); const matches = filters.naicsCodes.some((code) => naicsStr.startsWith(code)); if (!matches) return false; } // Active only filter if (filters.activeOnly && row.Active !== '1') { return false; } // Place of performance states if ((_b = filters.placeOfPerformanceStates) === null || _b === void 0 ? void 0 : _b.length) { if (!filters.placeOfPerformanceStates.includes(row.PopState)) { return false; } } // Set-aside types if ((_c = filters.setAsideTypes) === null || _c === void 0 ? void 0 : _c.length) { const mappedCode = mapSetAsideTextToCode(row.SetASide); if (!mappedCode || !filters.setAsideTypes.includes(mappedCode)) { return false; } } // Date filters if (filters.postedFrom) { if (new Date(row.PostedDate) < new Date(filters.postedFrom)) { return false; } } if (filters.postedTo) { if (new Date(row.PostedDate) > new Date(filters.postedTo)) { return false; } } return true; } exports.filterCsvRow = filterCsvRow; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtbWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhc291cmNlcy9jc3YvZmllbGQtbWFwcGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBdURIOztHQUVHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsTUFBeUI7SUFDOUQsT0FBTztRQUNMLG1CQUFtQjtRQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFbEMscUJBQXFCO1FBQ3JCLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQztRQUNuRCxrQkFBa0IsRUFBRSxNQUFNLENBQUMsSUFBSTtRQUMvQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1FBRXpDLFFBQVE7UUFDUixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtRQUN6QyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFFL0IsbUJBQW1CO1FBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBRS9CLCtEQUErRDtRQUMvRCxjQUFjLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0RCx5QkFBeUIsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUUxQyxpQkFBaUI7UUFDakIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25DLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtR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