=== ProofKit ===
Contributors: proofkit
Tags: woocommerce, print shop, proof approval, artwork upload, order approval
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 1.0.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Artwork upload and proof approval for WooCommerce, with a private proof page the customer signs off on.

== Description ==

Most print, sign and embroidery shops still proof by email. The customer sends
artwork, someone exports a JPEG, the customer replies with changes, and three
messages later nobody is sure which file was approved. Then the job goes to
press with the wrong version.

ProofKit moves that exchange onto the order. Customers upload artwork on the
product page. The shop checks the file and sends a proof. The customer opens a
private page from the email, sees the artwork, and either approves it or asks
for changes. The approval is stored against that exact file, with the version,
the timestamp and a hash of the bytes, so the shop can show what was signed off
and when.

ProofKit is not a shop management system. It does not do estimating, job
tickets, scheduling, invoicing or shipping, and it is not a replacement for
Printavo or similar production software. It is the customer-facing artwork and
approval layer that sits on the shop's existing WooCommerce store.

= What you get =

* Artwork upload on the product page, enabled per product
* File type and size validation on upload, enforced per product
* Browser preview for PDF and raster images; SVG is never previewed
* Approve or request changes through a single email link, no account needed
* Proof attached to the order line item with version, status, timestamp and comment
* Order statuses for artwork review and proof approval, plus an orders-list filter
* An event log for uploads, sends, views, approvals and change requests
* Download of the original file, blocked when its hash no longer matches

= What ProofKit does not do =

* No color-accurate soft proofing. A browser shows sRGB; print is CMYK and
  depends on the substrate. On-screen color is a guide, not a match.
* No automatic print check. The plugin does not judge resolution, bleeds,
  fonts or trapping, and it does not inspect the artwork for errors.
* No production scheduling, estimating, job tracking or shipping. That is
  shop management software's job.
* No telemetry, no remote assets and no external services. Nothing about the
  shop or its customers leaves the server.

== How it works ==

1. The product page shows an upload control on products where the shop
   enabled artwork.
2. The customer chooses a file. It is checked against the allowed types and
   the size cap, then uploaded.
3. The file is attached to the cart item and carried to the order line item at
   checkout.
4. The order is placed and, as soon as the gateway confirms payment, moved to the
   Artwork review status. Until then it keeps the gateway's own status.
5. The shop reviews the file and clicks Send proof.
6. The customer receives an email with one button: Review proof.
7. The button opens a private, tokenized page that shows the artwork inline,
   with Approve and Request changes.

Approving moves the order to Processing and writes an event. Requesting changes
requires a comment, moves the order back to Artwork review, and puts the
comment on the order for the shop to work from.

== Installation ==

1. Upload the proofkit folder to /wp-content/plugins/, or install the plugin
   through Plugins → Add New.
2. Activate the plugin through the Plugins screen.
3. Open WooCommerce → ProofKit and set the from name, from email and link
   expiry.

WooCommerce must be installed and active. ProofKit does nothing without it.

Artwork upload is off by default. Enable it per product under
Product data → Artwork, where you can also set whether the upload is required,
the instructions shown to the customer, and a per-product size or extension
override.

== Frequently Asked Questions ==

= Does it work with HPOS? =

Yes. ProofKit declares compatibility with WooCommerce custom order tables and
reads and writes orders through the WooCommerce CRUD API. It also works with
legacy post-based order storage.

= Does it work with the block checkout? =

Yes. Classic checkout and Store API (block) checkout both validate required
artwork before the order is placed. On the product page, the upload control is
rendered by the classic add-to-cart hook or by the [proofkit_upload] shortcode.
A block product template does not fire the classic hook, so add the shortcode
to that template until a native block ships. Both paths upload and attach the
file the same way.

= Where do uploaded files live? =

In wp-content/uploads/proofkit-private/, stored by SHA-256 and served through
WordPress after a capability or token check. The directory is inside the
uploads folder, so it sits under the web root. Apache and LiteSpeed use the
.htaccess ProofKit writes there, and IIS uses web.config. Nginx ignores both:
add a deny rule for that path, or the files can be fetched by direct URL. The
exact rule is in docs/security.md and docs/install.md inside the plugin folder.

= What happens when the customer approves an old version? =

An approval is bound to one proof record: one version and one SHA-256 hash.
Uploading a new version supersedes the previous one, so its pending link stops
working and cannot be approved. The customer must approve the latest version
that was sent.

= Does the plugin send data anywhere? =

No. There is no telemetry, no analytics, no external service and no remote
asset. All validation, storage, hashing and email sending happen on the shop's
server. The only outbound email is the proof email the shop sends to its own
customer.

= What file types and sizes are supported? =

The defaults are PDF, AI, EPS, PNG, JPG, JPEG, TIF and TIFF, up to 25 MB per
file. The shop can change the size cap and the extension list in the settings,
and override both per product. SVG is off by default because it can carry
scripts; when it is enabled, it is download-only and never previewed in the
browser.

= Does it stop misprints? =

No. It records who approved which file, and it blocks the production download
if a stored file's hash no longer matches its record. The shop still does the
final check before printing.

= Is there a Pro version? =

A Pro version is planned with a price matrix, auto-rendered proofs with bleed
marks, version comments and a production ZIP per order; the approval loop in
this free version is not limited or time-restricted.

== Screenshots ==

1. The artwork upload control on a product page, with instructions and the
   allowed file types.
2. The proof list in the order edit screen: version, status, date, comment and
   the Send proof button.
3. The customer proof page, showing the artwork inline with Approve and
   Request changes.
4. The ProofKit settings screen under WooCommerce.

== Changelog ==

= 1.0.1 =

* Styles for the proof page, the standalone status pages and the order meta box
  are now loaded with wp_enqueue_style().
* The settings option is registered with a named sanitize callback.
* Removed the pre-launch admin notice.

= 1.0.0 =

* First release.
* Artwork upload on product pages, enabled per product, through the classic
  add-to-cart hook or the [proofkit_upload] shortcode.
* File type, extension and size validation, enforced server-side per product.
  SVG is off by default and download-only when enabled.
* Private, content-addressed storage under
  wp-content/uploads/proofkit-private/, streamed through WordPress after a
  token or capability check.
* Proof records with version, SHA-256 hash and status. A newer version
  supersedes the old one and revokes its links.
* Tokenized customer proof page with approve and request changes. Approval
  links are single-use and expire according to the link expiry setting.
* Proof email, a resend action when the mailer fails, and order status sync.
* Event log for proof transitions; no admin edit or delete, with retention as
  the only routine purge.
* Optional data removal on uninstall. No telemetry.

== Upgrade Notice ==

= 1.0.0 =

First release.

== External services ==

This plugin connects to no external service. It sends no telemetry, loads no
remote assets, and calls no third-party API. All processing happens on the
shop's own server. The only network traffic the plugin generates is the proof
email, which WordPress sends through the site's configured mail transport.
