Comprehensive documentation of the contract lifecycle management system including framework agreements, rate contracts, amendments, milestones, and compliance tracking.
ProKure supports various types of vendor contracts to accommodate different procurement scenarios.
Master agreement with multiple vendors for same items
Fixed pricing for items over a period
Service-based contracts with milestones
Pre-approved spend limit with vendor
Annual Maintenance Contracts
| Status | Description | Actions Allowed |
|---|---|---|
| DRAFT | Contract being created, not yet submitted | Edit, Delete, Submit for Approval |
| PENDING_APPROVAL | Awaiting approval from authorized users | Approve, Reject, Request Changes |
| ACTIVE | Contract is in effect, POs can reference it | Amend, Create PO, Track Compliance |
| EXPIRED | Contract end date has passed | Renew, Archive |
| TERMINATED | Manually terminated before expiry | View Only, Audit |
Purchase Orders can reference active contracts to automatically apply negotiated pricing and terms.
-- Query to find applicable contract for a vendor-item combination SELECT c.contract_number, c.contract_name, ci.unit_price, ci.discount_percent, (c.contract_value - c.utilized_value) AS remaining_value FROM contract.contracts c JOIN contract.contract_items ci ON c.id = ci.contract_id WHERE c.vendor_id = :vendor_id AND ci.item_id = :item_id AND c.status = 'ACTIVE' AND CURRENT_DATE BETWEEN c.start_date AND c.end_date AND CURRENT_DATE BETWEEN ci.effective_from AND ci.effective_until AND ci.is_active = true ORDER BY ci.unit_price ASC LIMIT 1;
When a PO is created against a contract, the system automatically updates utilized_value on the contract header and ordered_quantity on the contract item. This prevents over-ordering beyond contract limits.
User creates amendment request specifying the type of change (value change, extension, scope change, or price revision).
System captures the current contract state in old_value JSONB field and proposed changes in new_value.
-- Example amendment record { "old_value": { "contract_value": 500000, "end_date": "2026-12-31" }, "new_value": { "contract_value": 750000, "end_date": "2027-06-30" }, "value_change": 250000, "end_date_change": "2027-06-30" }
Amendment follows the standard approval matrix. Value-based approvals apply to the amendment value, not the full contract value.
Upon approval, the amendment is applied to the contract. All changes are audited with full before/after state preservation.
renewal_notice_days-- Scheduled job: Check contracts expiring within notice period SELECT c.id, c.contract_number, c.end_date, c.renewal_notice_days, c.owner_id FROM contract.contracts c WHERE c.status = 'ACTIVE' AND c.end_date BETWEEN CURRENT_DATE AND CURRENT_DATE + (c.renewal_notice_days || ' days')::INTERVAL AND NOT EXISTS ( -- Avoid duplicate notifications SELECT 1 FROM config.notifications n WHERE n.entity_type = 'CONTRACT' AND n.entity_id = c.id AND n.notification_type = 'EXPIRY_REMINDER' AND n.created_at > CURRENT_DATE - INTERVAL '7 days' );
When current_renewal >= max_renewals, auto-renewal is disabled for that contract. The owner receives a notification indicating manual intervention is required for continued service.
Contract compliance tracks vendor adherence to contractual obligations across multiple dimensions.
On-time delivery performance
Product quality standards
Required document submissions
Valid insurance coverage
Valid licenses/certifications
-- Query non-compliant contracts with severity SELECT c.contract_number, c.vendor_id, v.vendor_name, cc.compliance_type, cc.compliance_item, cc.severity, cc.action_due_date, CASE WHEN cc.action_due_date < CURRENT_DATE THEN 'OVERDUE' WHEN cc.action_due_date <= CURRENT_DATE + 7 THEN 'DUE_SOON' ELSE 'ON_TRACK' END AS urgency FROM contract.contract_compliance cc JOIN contract.contracts c ON cc.contract_id = c.id JOIN vendor.vendors v ON c.vendor_id = v.id WHERE cc.is_compliant = false AND cc.action_completed_date IS NULL AND c.status = 'ACTIVE' ORDER BY CASE cc.severity WHEN 'CRITICAL' THEN 1 WHEN 'HIGH' THEN 2 WHEN 'MEDIUM' THEN 3 ELSE 4 END, cc.action_due_date;
For service contracts, define milestones with specific deliverables and acceptance criteria. This enables objective completion tracking and payment scheduling.
Configure renewal_notice_days based on contract complexity. Simple rate contracts may need 30 days; complex service agreements may need 90+ days for renegotiation.
Set up alerts when utilized_value reaches 80% of contract_value. This provides time to negotiate amendments or new contracts before limits are reached.
Schedule periodic compliance reviews (monthly/quarterly) for critical contracts. Use the compliance table to track findings and corrective actions systematically.