{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","title":"HACCP self-checking plan","description":"The description of the self-checking system of a food operator for one establishment unit: regime, process steps, hazard analysis with critical control points, good hygiene practices, verification and records (royal decree of 14 November 2003, art. 3).","additionalProperties":false,"required":["document","operator","establishment","regime","team","process","hazard_analysis","verification","records","signatory"],"properties":{"document":{"type":"object","additionalProperties":false,"required":["date","version"],"properties":{"place":{"type":"string","description":"Place where the plan is drawn up (optional)."},"date":{"type":"string","format":"date","description":"Date of the plan."},"reference":{"type":"string","description":"Internal reference of the plan (optional)."},"version":{"type":"string","minLength":1,"description":"Version of the plan."},"next_review_date":{"type":"string","format":"date","description":"Date of the next planned review (optional)."}}},"operator":{"type":"object","additionalProperties":false,"required":["name","address"],"properties":{"name":{"type":"string","minLength":1,"description":"Name of the operator."},"enterprise_number":{"type":"string","description":"Belgian enterprise number (BCE / KBO) of the operator (optional)."},"address":{"type":"string","minLength":1,"description":"Address of the operator."}}},"establishment":{"type":"object","additionalProperties":false,"required":["activities"],"properties":{"unit_number":{"type":"string","description":"Establishment-unit number (optional)."},"name":{"type":"string","description":"Name of the establishment (optional)."},"afsca_reference":{"type":"string","description":"Registration, authorisation or approval number of the food agency, as given (optional)."},"activities":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"The activities of the establishment."},"product_groups":{"type":"array","minItems":1,"items":{"type":"string","minLength":1},"description":"The product groups handled (optional)."},"headcount":{"type":"integer","minimum":0,"description":"Number of persons working in the establishment (optional)."}}},"regime":{"type":"object","additionalProperties":false,"required":["kind"],"properties":{"kind":{"type":"string","enum":["full_haccp","relaxed_haccp","good_hygiene_practices_only"],"description":"The self-checking regime the operator states it applies."},"basis_stated":{"type":"string","description":"The operator's own reason for the regime (optional)."},"guides":{"type":"array","minItems":1,"description":"The approved guide(s) the operator applies.","items":{"type":"object","additionalProperties":false,"required":["name","version","sector"],"properties":{"name":{"type":"string","minLength":1,"description":"Name of the guide."},"version":{"type":"string","minLength":1,"description":"Version of the guide."},"sector":{"type":"string","minLength":1,"description":"Sector or sub-sector the guide covers."}}}},"b2b_share_stated":{"type":"string","description":"The share of turnover delivered to other establishments, as the operator states it (optional)."},"radius_stated":{"type":"string","description":"The delivery radius, as the operator states it (optional)."}},"allOf":[{"if":{"properties":{"kind":{"enum":["relaxed_haccp","good_hygiene_practices_only"]}},"required":["kind"]},"then":{"required":["guides"]}}]},"team":{"type":"object","additionalProperties":false,"required":["responsible"],"properties":{"responsible":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"description":"Name of the person responsible for the system."},"title":{"type":"string","description":"Function of the person responsible (optional)."}}},"members":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","minLength":1,"description":"Name of the team member."},"function":{"type":"string","description":"Function of the team member (optional)."}}},"description":"The other members of the team (optional)."}}},"process":{"type":"object","additionalProperties":false,"required":["steps"],"properties":{"steps":{"type":"array","minItems":1,"description":"The steps of the process, in order.","items":{"type":"object","additionalProperties":false,"required":["order","step"],"properties":{"order":{"type":"integer","minimum":1,"description":"Position of the step."},"step":{"type":"string","minLength":1,"description":"Name of the step."},"description":{"type":"string","description":"Description of the step (optional)."}}}}}},"hazard_analysis":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["step","hazard_type","hazard","control_measure","is_ccp"],"properties":{"step":{"type":"string","minLength":1,"description":"Process step the hazard belongs to."},"hazard_type":{"type":"string","enum":["biological","chemical","physical","allergen"],"description":"Type of the hazard."},"hazard":{"type":"string","minLength":1,"description":"The hazard identified at this step."},"control_measure":{"type":"string","minLength":1,"description":"The control measure applied against the hazard."},"is_ccp":{"type":"boolean","description":"Whether this step is a critical control point."},"critical_limit":{"type":"string","description":"Critical limit at the critical control point, as the operator sets it (required for a critical control point)."},"monitoring_what":{"type":"string","description":"What is monitored (optional)."},"monitoring_frequency":{"type":"string","description":"How often it is monitored (optional)."},"monitoring_who":{"type":"string","description":"Who monitors (optional)."},"corrective_action":{"type":"string","description":"Corrective action when the point is not under control (required for a critical control point)."},"record":{"type":"string","description":"The record kept (optional)."},"from_guide":{"type":"boolean","description":"Whether this row is taken from the guide without modification (optional)."}},"allOf":[{"if":{"properties":{"is_ccp":{"const":true}},"required":["is_ccp"]},"then":{"required":["critical_limit","corrective_action"]}}]},"description":"The hazard analysis, one row per hazard."},"bph":{"type":"object","additionalProperties":false,"description":"The twelve themes of the good hygiene practices; a missing theme is printed as not stated.","properties":{"cleaning_disinfection":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"pest_control":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"water_quality":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"cold_hot_chain":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"staff_health":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"personal_hygiene":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"training":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"infrastructure_maintenance":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"waste":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"incoming_goods":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"contamination_prevention":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}},"product_handling":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the procedure for this theme (optional)."},"summary":{"type":"string","description":"Short summary of what is done for this theme (optional)."},"record":{"type":"string","description":"The record kept for this theme (optional)."}}}}},"verification":{"type":"object","additionalProperties":false,"required":["procedures"],"properties":{"procedures":{"type":"string","minLength":1,"description":"The verification procedures (principle 6)."},"frequency_stated":{"type":"string","description":"How often the verification is done, as the operator states it (optional)."},"review_triggers":{"type":"string","description":"What triggers a review of the procedures (optional)."},"last_review_date":{"type":"string","format":"date","description":"Date of the last review (optional)."}}},"records":{"type":"array","minItems":1,"description":"The documents and records kept (principle 7).","items":{"type":"object","additionalProperties":false,"required":["name","where"],"properties":{"name":{"type":"string","minLength":1,"description":"Name of the record or document."},"where":{"type":"string","minLength":1,"description":"Where it is kept."},"retention_stated":{"type":"string","description":"How long the operator keeps it, in its own words (optional)."}}}},"sampling":{"type":"object","additionalProperties":false,"properties":{"plan":{"type":"string","description":"The sampling and analysis plan when the operator needs one (optional)."}}},"notification":{"type":"object","additionalProperties":false,"properties":{"procedure_reference":{"type":"string","description":"Reference of the notification procedure (optional)."}}},"validation":{"type":"object","additionalProperties":false,"properties":{"status":{"type":"string","enum":["none","requested","validated"],"description":"Validation status of the system (optional)."},"body":{"type":"string","description":"Body that validated the system (optional)."},"valid_until":{"type":"string","format":"date","description":"End of the validation (optional)."}}},"signatory":{"type":"object","additionalProperties":false,"required":["name","title"],"properties":{"name":{"type":"string","minLength":1,"description":"Name of the person who signs."},"title":{"type":"string","minLength":1,"description":"Function of the person who signs."}}}}}