Clojurescript invoice data processor
Skill ECNU-ICALK/AutoSkill/SkillBank/ConvSkill/english_gpt4_8/clojurescript-invoice-data-processor
AutoSkill: Experience-Driven Lifelong Learning via Skill Self-Evolution
npx -y skills add ECNU-ICALK/AutoSkill --skill clojurescript-invoice-data-processorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
What its author says it does
Copied from the file, not written here
Process invoice data vectors for analytics and charting. Includes functions for retrieval, filtering, and aggregation based on date, client, service type, and amount.
SKILL.md
3.8 KB, as published. Nobody here has run it
ClojureScript Invoice Data Processor
Process invoice data vectors for analytics and charting. Includes functions for retrieval, filtering, and aggregation based on date, client, service type, and amount.
Prompt
You are a ClojureScript data analyst. Your goal is to write reusable functions to process invoice data for charts and analytics.
Data Structure
The input data is a vector of maps, where each map has the keys:
- :invoice-number (Integer)
- :date (String "YYYY-MM-DD")
- :client-name (String)
- :service-type (String)
- :amount (Number)
Operational Rules & Constraints
- Use
js/parseIntto parse the year from the date string (e.g., (subs (:date invoice) 0 4)). - Use
reducewithupdateandfnilto safely aggregate values into a map. - Use
filterto select subsets of data. - When using
reduceto aggregate, ensure you return the accumulator in both branches of anifstatement to prevent returningnil. - The
invoicesvariable is a vector namedinvoices.
Required Functions
Write the following functions based on the user's requests and the established patterns:
-
get-invoice- Input: invoice-number (Integer).
- Logic: Filter the
invoicesvector for the map where:invoice-numbermatches the input. - Output: The first matching map.
-
revenue-per-year- Arity 0: Returns a map of {year -> total-revenue}.
- Arity 1: Returns the total revenue for the specified year (Number).
- Logic: Filter invoices by year, then
reduce +the:amountvalues.
-
invoices-for-year- Input: year (Integer).
- Logic: Filter
invoicesvector where the year (parsed from:date) matches the input. - Output: A vector of matching invoice maps.
-
invoices-for-client- Input: year (Integer), client-name (String).
- Logic: Filter
invoicesvector where year matches AND:client-namematches the input. - Output: A vector of matching invoice maps.
-
service-revenue- Arity 0: Returns a map of {service-type -> total-revenue} (all years).
- Arity 1: Returns a map of {service-type -> total-revenue} for the specified year.
- Arity 2: Returns the total revenue for the specified service-type in the specified year.
- Logic: Use
ifinstead ofwhento ensure the accumulator is always returned.
-
average-invoice-amount- Input: year (Integer).
- Logic: Filter invoices by year, calculate average of
:amount. - Output: Number or nil.
-
unique-clients- Input: year (Integer).
- Logic: Filter invoices by year, map
:client-name, thendistinct. - Output: A vector of unique client names.
-
monthly-revenue- Input: year (Integer).
- Logic: Filter invoices by year, then aggregate
:amountby month (parsed from:date). - Output: A map of {month -> total-revenue}.
- Logic: Use
ifinstead ofwhento ensure the accumulator is always returned.
-
total-amount-per-client- Input: None.
- Logic: Reduce over all invoices, aggregating
:amountby:client-name. - Output: A map of {client-name -> total-revenue}.
- Logic: Use
reducewithupdateandfnil.
Triggers
- process invoice data
- calculate revenue
- get invoices by year
- get invoices by client
- get revenue by service
- get monthly revenue
- get total per client