# Contract + Rates History * Is there a parent type? Some container with contracts and rates? * is that a Submission * Submission Revision? * submissiontype: has contract and rate types. * when you. make a new submission, it's part of the overall submission thing ## How to represent histories in the domain models ### ideas for new top level types * Submission Container Type * Contract1 + Rate1 + Rate2 * resubmitting rate1 adds a submission revision to this container * unlinking rate2 adds a submission revision to this container * Is this a db level concept? * Feels like we are overloading the join table * Sumbit: c0,r1,r2 * Unlock: c0.1, r1, r2 * Resubmit: c0.1, r1, r2 * ResubmitRate: c0.1, r1.1, r2 * UnlinkRate: c0.1, r.1., REMOVE r2 ### ideas for new fields on the contract/rate type * Add HISTORY field that replaces the revisions field, we compute based on the join table with the submitInfos. * More details on his [hackmd](https://hackmd.io/vTHI_MUfSL-ke03Qy0WzAw?both) * history has both contractrev entries and raterev entries. * one place that has rate rev and contract rev is good * changes domain model only * How can you tell if a rate is unlinked? * it would be in the history, but it's contracts wouldn't include this contract? seems complicated * Jason has a doc on this https://docs.google.com/document/d/1hvP0axqGZJOKB0HarvzJW5iNQozNWyZbZtoz_axrhw8/edit * Add new table recording submission history events. This becomes new field on contract/rate. When the rate gets unlinked, that would be a new entry in the shared table. * THere's a table that is the history of a given contract or rate, each entry is a line item in that table * contractID, action: linkng | unlinking, rateID * Submission: contract + rate + rate + rate * changes domain model and database * new submissionHistory: SubmitInfo[] field * collect related submit infos for this type, including a submit info where a rate is unlinked * Add actionLog field * values like: SubmitContract, LinkRate, etc * changes to database and domain model * Very explicit, easier to reason about ## Migrations? * do we have the data we need in general? * We dont have a way to say these contract and rates were submitted as part of the same submission * Figuring out the domain model solution with the current data model would mean no migration which woudl be chill. ## General * whatedver we do we'd better document exactly how these things are constructed. * Q: Does Rate History include the same level of detail for the contract? ``` ContractActionType: SubmitContract, UnlockContract, UpdateRate, UnlinkRate, LinkRate RateActionType: SubmitRate, UnlockRate, UpdateContract, UnlinkContract, LinkContract (submission + action): here's the submission and it was a RateUpdate or a LinkRate Submission: ThingSubmitted: RateRevision | ContractRevision RelatedThigns: ContractRevision[] | RateRevision[] THINGS: (RateRevision | ContractRevision)[] type ContractType = { id: string; status: "SUBMITTED" | "DRAFT" | "UNLOCKED" | "RESUBMITTED"; stateCode: string; stateNumber: number; mccrsID: string | undefined, draftRevision: ContractRevisionWithRatesType actionLog: ActionType[], submissionHistory: submitInfo[] history: (ContractRevisionWithRatesType | RateRevisionWithContractType)[], revisions: ContractRevisionWithRatesType[] { id: string; contract: { stateCode: string; id: string; stateNumber: number; }; submitInfo: UpdateInfoType | undefined, unlockInfo: UpdateInfoType | undefined, createdAt: Date, updatedAt: Date, formData: ContractFormDataType, rateRevisions: RateRevisionType[] }[] } type RateType = { id: string; status: "SUBMITTED" | "DRAFT" | "UNLOCKED" | "RESUBMITTED"; stateCode: string; stateNumber: number; mccrsID: string | undefined, draftRevision: RateRevisionWithContractsType revisions: RateRevisionWithContractsType[] { id: string; rate: { stateCode: string; id: string; stateNumber: number; createdAt: Date; }; submitInfo: UpdateInfoType | undefined, unlockInfo: UpdateInfoType | undefined, createdAt: Date, updatedAt: Date, formData: RateFormDataType, } contractRevisions: ContractRevisionType[] } ``` Example of adding "submissions" to Contract+Rate ``` ContractA = { id status stateCode mccrsID stateNumber draftRevision revisions: [ { //A.0 id submitInfo unlockInfo formData }, { //A.1 id submitInfo unlockInfo formData } ], submissionHistory: [ { updatedRev: Contract | Rate contractRev: ContractRev rateRevs: RateRev[] } ] submissions: [ { // ContractA.0 updatedAt updateReason updatedBy contractRevision: { // A.0 id formData rateRevisions: [ {...}, // Rate1.0 {...}, // Rate2.0 ] } rateRevisions: [ {// Rate1.0 id formData contractRevisions: [ {...}// ContractA.0 ] }, {// Rate2.0 id formData contractRevisions: [ {...}// ContractA.0 ] }, ] }, { // Rate1.1 updatedAt updateReason updatedBy contractRevision: undefined rateRevisions: [ {// Rate1.1 id formData contractRevisions: [ {...}// ContractA.0 ] }, ] }, { // ContractA.1 updatedAt updateReason updatedBy contractRevision: { // A.1 id formData rateRevisions: [ {...}, // Rate1.1 {...}, // Rate2.0 ] } rateRevisions: [] } ] } Rate2 = { id status stateCode stateNumber draftRevision draftContracts revisions: [ { //2.0 id submitInfo unlockInfo formData }, ], submissionHistory: [ { updatedRev: (ContractRev | RateRev)[] rateRev: RateRev contractRevs: ContractRev[] } ] submissions: [ { // ContractA.0 updatedAt updateReason updatedBy contractRevision: { // A.0 id formData rateRevisions: [ {...}, // Rate1.0 {...}, // Rate2.0 ] }, rateRevisions: [ {// Rate1.0 id formData contractRevisions: [ {...}// ContractA.0 ] }, {// Rate2.0 id formData contractRevisions: [ {...}// ContractA.0 ] }, ] }, { // ContractC.0 updatedAt updateReason updatedBy contractRevision: { // C.0 id formData rateRevisions: [ {// Rate4.0 id formData contractRevisions: [ {...}// ContractC.0 ] }, {// Rate2.0 id formData contractRevisions: [ {...}// ContractA.0, {...}// ContractC.0, ] }, ] } }, { // ContractA.1 updatedAt updateReason updatedBy contractRevision: { // A.1 id formData rateRevisions: [ {...}, // Rate1.1 {...}, // Rate2.0 ] } rateRevisions: [] } { // ContractC.1 updatedAt updateReason updatedBy contractRevision: {...} // C.1 rateRevisions: [] } ] } ``` * This doesn't really let us construct the snapshots we want in rate history, really. * The removal especially is confusing, we'd need to see how rateRevisions are set? * What I actually want is "snapshot of _____ at time of x submission"