Last active
February 22, 2026 11:39
-
-
Save benoitjadinon/58616ddaa3b5480bedae761ed24c7447 to your computer and use it in GitHub Desktop.
Subscriptions obsidian base
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| model: | |
| version: 1 | |
| kind: Table | |
| columns: [] | |
| pluginVersion: 1.0.0 | |
| summaries: | |
| Unique: values.unique().length | |
| Total: values.reduce(number(acc)+number(value), 0).toFixed(2) | |
| filters: | |
| and: | |
| - file.folder.endsWith('Subscriptions') | |
| - file.ext == "md" | |
| - file.basename != this.file.basename | |
| - '!file.basename.endsWith("Template")' | |
| - file.basename != "Subscriptions" | |
| formulas: | |
| icon: if (favicon || icon || url, image(if(favicon, favicon, if(icon, icon, "https://www.google.com/s2/favicons?domain="+url)))) | |
| enabled: endDate>=now().date() || formula.isRenewing | |
| price-adjusted: (price+formula["shared-adjustment"]).toFixed(2) | |
| shared-adjustment: (number(if(note["share-price"], -number(note["share-price"]) * shared, 0))) | |
| cyclesStarted: |- | |
| if(cycle.endsWith("d"), | |
| (((if(endDate, endDate,today()))-startDate).days / number(cycle)).floor(), | |
| if(cycle.endsWith("M"), | |
| (((if(endDate, endDate,today()))-startDate).months / number(cycle)).floor(), | |
| if(cycle.endsWith("y"), | |
| (((if(endDate, endDate,today()))-startDate).years / number(cycle)).floor(), | |
| ((if(endDate, endDate,today()))-startDate).days | |
| ) | |
| ) | |
| ) | |
| cyclesNext: |- | |
| if(cycle.endsWith("d"), | |
| (((if(endDate, endDate,today()))-startDate).days / number(cycle)).ceil(), | |
| if(cycle.endsWith("M"), | |
| (((if(endDate, endDate,today()))-startDate).months / number(cycle)).ceil(), | |
| if(cycle.endsWith("y"), | |
| (((if(endDate, endDate,today()))-startDate).years / number(cycle)).ceil(), | |
| ((if(endDate, endDate,today()))-startDate).days | |
| ) | |
| ) | |
| ) | |
| cycleNextDuration: |- | |
| if(cycle.endsWith("d"), | |
| (formula.cyclesNext * number(cycle)).abs().ceil() + "d", | |
| if(cycle.endsWith("M"), | |
| (formula.cyclesNext * number(cycle)).abs().ceil() + "M", | |
| if(cycle.endsWith("y"), | |
| (formula.cyclesNext * number(cycle)).abs().ceil() + "y", | |
| formula.cyclesNext + "d" | |
| ) | |
| ) | |
| ) | |
| next-payment-date: |- | |
| if(cycle == "lifetime", null, | |
| if(startDate > now(), startDate, | |
| if(endDate, endDate, | |
| startDate + formula.cycleNextDuration | |
| ) | |
| ) | |
| ) | |
| started: startDate.relative() | |
| duration: if (endDate, endDate, now())-startDate | |
| next-payment-duration: if (formula["next-payment-date"].date() == today(), "TODAY",date(formula["next-payment-date"]).relative()) | |
| isRenewing: endDate.isEmpty() | |
| status: |- | |
| if(cycle == "lifetime", | |
| 'lifetime', | |
| if (startDate > now(), | |
| "starts", | |
| if (formula.isRenewing, "renews", if (endDate > now(), "ends", "ended")) | |
| )+" "+formula["next-payment-duration"] | |
| ) | |
| next-payment-days: |- | |
| if(cycle == "lifetime", 0, | |
| number((date(formula["next-payment-date"])-now()).days.toFixed(0)) | |
| ) | |
| cycleDays: |- | |
| if(cycle == "lifetime", 'lifetime', | |
| (date("1970-01-01")-formula.cycleDaysRounded-date("1970-01-01")).days.abs() | |
| ) | |
| pricePerMonth: |- | |
| if(cycle == "lifetime", (price / formula.duration.months).toFixed(2), | |
| number((price/(formula.cycleDays)*31) + (if (shared, (formula["shared-adjustment"]),0))).toFixed(2) | |
| ) | |
| priceInFuture: if(formula.willRenew && startDate < now(),formula.pricePerMonth,number(0).toFixed(2)) | |
| willRenew: |- | |
| if(cycle == "lifetime", 'lifetime', | |
| endDate == null || (endDate.relative() > now()+cycle) | |
| ) | |
| totalCost: |- | |
| if(cycle == "lifetime", price.toFixed(2), | |
| if(startDate > now(),number(0).toFixed(2),(formula.cyclesStarted * number(price)).toFixed(2)) | |
| ) | |
| duration-precise: formula.duration.months.toFixed(2) | |
| endDateOrForever: if (endDate, endDate, date('2099-01-01')) | |
| cycleDaysRounded: duration(number(cycle).ceil().toString()+cycle.slice(-1)) | |
| durationSinceStart: (if(endDate, endDate,today()))-startDate | |
| properties: | |
| formula.enabled: | |
| displayName: active | |
| formula.price-adjusted: | |
| displayName: price-adjusted | |
| formula.next-payment-date: | |
| displayName: next-payment-date | |
| formula.started: | |
| displayName: started | |
| formula.cycleDays: | |
| displayName: cycleDays | |
| formula.priceInFuture: | |
| displayName: priceThisMonth | |
| views: | |
| - type: table | |
| name: Subscriptions | |
| groupBy: | |
| property: formula.enabled | |
| direction: DESC | |
| order: | |
| - formula.icon | |
| - file.name | |
| - product | |
| - formula.status | |
| - formula.next-payment-date | |
| - formula.cyclesStarted | |
| - cycle | |
| - price | |
| - formula.pricePerMonth | |
| - formula.priceInFuture | |
| - formula.totalCost | |
| - currency | |
| - formula.started | |
| - startDate | |
| - endDate | |
| - platform | |
| - formula.duration | |
| - formula.duration-precise | |
| - account | |
| - account-holder | |
| - category | |
| - tags | |
| - shared | |
| - share-price | |
| - notes | |
| - formula.cyclesNext | |
| - formula.durationSinceStart | |
| sort: | |
| - property: formula.next-payment-date | |
| direction: ASC | |
| - property: cycle | |
| direction: ASC | |
| - property: file.name | |
| direction: ASC | |
| summaries: | |
| price: Sum | |
| formula.pricePerMonth: Total | |
| formula.priceInFuture: Total | |
| formula.totalCost: Total | |
| columnSize: | |
| formula.icon: 38 | |
| file.name: 204 | |
| note.product: 129 | |
| formula.status: 128 | |
| formula.next-payment-date: 106 | |
| formula.cyclesStarted: 51 | |
| note.cycle: 55 | |
| note.price: 62 | |
| formula.pricePerMonth: 61 | |
| formula.priceInFuture: 61 | |
| formula.totalCost: 73 | |
| note.currency: 55 | |
| note.endDate: 126 | |
| formula.duration-precise: 62 | |
| note.account: 172 | |
| note.account-holder: 53 | |
| note.category: 112 | |
| note.share-price: 67 | |
| note.notes: 204 | |
| - type: table | |
| name: Subscriptions Active | |
| filters: | |
| and: | |
| - formula.enabled == true | |
| order: | |
| - formula.icon | |
| - file.name | |
| - formula.status | |
| - formula.next-payment-date | |
| - cycle | |
| - price | |
| - formula.pricePerMonth | |
| - currency | |
| - formula.started | |
| - endDate | |
| - formula.duration | |
| - account | |
| - account-holder | |
| - category | |
| - tags | |
| - shared | |
| - share-price | |
| - formula.price-adjusted | |
| - notes | |
| sort: | |
| - property: formula.next-payment-date | |
| direction: ASC | |
| - property: file.name | |
| direction: ASC | |
| columnSize: | |
| formula.icon: 38 | |
| formula.status: 128 | |
| formula.next-payment-date: 116 | |
| note.cycle: 47 | |
| formula.pricePerMonth: 58 | |
| note.currency: 55 | |
| note.endDate: 126 | |
| formula.duration_precise: 254 | |
| note.account: 172 | |
| note.account-holder: 53 | |
| note.category: 112 | |
| formula.price-adjusted: 80 | |
| note.notes: 204 | |
| - type: table | |
| name: Subscriptions Inactive | |
| filters: | |
| and: | |
| - formula.enabled == false | |
| order: | |
| - formula.icon | |
| - file.name | |
| - endDate | |
| - cycle | |
| - price | |
| - formula.pricePerMonth | |
| - currency | |
| - formula.started | |
| - formula.duration | |
| - account | |
| - account-holder | |
| - category | |
| - tags | |
| - shared | |
| - share-price | |
| - formula.price-adjusted | |
| - notes | |
| sort: | |
| - property: endDate | |
| direction: DESC | |
| - property: formula.started | |
| direction: ASC | |
| columnSize: | |
| formula.icon: 38 | |
| formula.status: 128 | |
| formula.next-payment-date: 116 | |
| note.cycle: 47 | |
| formula.pricePerMonth: 58 | |
| note.currency: 55 | |
| note.endDate: 126 | |
| formula.duration_precise: 254 | |
| note.account: 172 | |
| note.account-holder: 53 | |
| note.category: 112 | |
| formula.price-adjusted: 80 | |
| note.notes: 204 | |
| - type: calendar | |
| name: Renewals | |
| filters: | |
| and: | |
| - formula.enabled == true | |
| - formula.isRenewing == true | |
| startDate: formula.next-payment-date | |
| showICS_ics_q3765di1smf12p46b: false | |
| showICS_ics_0k7qvgafnmghaso1i: false | |
| - type: calendar | |
| name: Ending | |
| filters: | |
| and: | |
| - formula.isRenewing == false | |
| startDate: formula.next-payment-date | |
| - type: table | |
| name: Subscriptions Soon | |
| filters: | |
| and: | |
| - formula.enabled == true | |
| order: | |
| - formula.icon | |
| - file.name | |
| - formula.status | |
| - formula.next-payment-date | |
| - notes | |
| sort: | |
| - property: formula.next-payment-date | |
| direction: ASC | |
| limit: 4 | |
| columnSize: | |
| formula.icon: 38 | |
| formula.status: 128 | |
| formula.next-payment-date: 116 | |
| note.currency: 55 | |
| note.cycle: 66 | |
| note.endDate: 126 | |
| note.account: 172 | |
| note.account-holder: 53 | |
| note.category: 112 | |
| formula.price-adjusted: 80 | |
| note.notes: 204 | |
| - type: list | |
| name: Subscriptions Soon List | |
| filters: | |
| and: | |
| - formula.enabled == true | |
| order: | |
| - formula.icon | |
| - file.name | |
| - formula.status | |
| - notes | |
| - formula.next-payment-date | |
| - price | |
| sort: | |
| - property: formula.next-payment-date | |
| direction: ASC | |
| limit: 3 | |
| columnSize: | |
| formula.icon: 38 | |
| formula.status: 128 | |
| formula.next-payment-date: 116 | |
| note.currency: 55 | |
| note.cycle: 66 | |
| note.endDate: 126 | |
| note.account: 172 | |
| note.account-holder: 53 | |
| note.category: 112 | |
| formula.price-adjusted: 80 | |
| note.notes: 204 | |
| separator: " " | |
| markers: number | |
| nestedProperties: false | |
| indentProperties: false | |
| - type: calendar | |
| name: Opened Calendar | |
| order: | |
| - file.name | |
| startDate: note.startDate | |
| endDate: formula.endDateOrForever |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment