familyHub/scripts/grocery_recurring.php

72 lines
2.1 KiB
PHP

<?php
/**
* Add recurring catalog items back to the active list when nextDueDate is today or past.
* Run from cron after daily_export or on its own.
*/
require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/grocery_helpers.php';
if (!file_exists(dirname(__DIR__) . '/.env')) {
fwrite(STDERR, "Family Hub: .env missing.\n");
exit(1);
}
migrateLegacyGroceriesIfNeeded();
$catalog = normalizeCatalogList(readJsonFile('grocery_catalog.json'));
$lists = normalizeGroceryLists(readJsonFile('grocery_lists.json'));
$today = gmdate('Y-m-d');
$added = 0;
foreach ($catalog as $ci => $c) {
$next = isset($c['nextDueDate']) ? trim((string) $c['nextDueDate']) : '';
$interval = max(0, (int) ($c['recurringIntervalDays'] ?? 0));
if ($next === '' || $interval < 1) {
continue;
}
if (strcmp($next, $today) > 0) {
continue;
}
$storeId = (string) ($c['storeId'] ?? '');
if ($storeId === '') {
continue;
}
$name = trim((string) ($c['name'] ?? ''));
if ($name === '') {
continue;
}
$line = normalizeGroceryLineItem([
'id' => bin2hex(random_bytes(8)),
'catalogId' => (string) ($c['id'] ?? ''),
'name' => $name,
'description' => trim((string) ($c['description'] ?? '')),
'size' => trim((string) ($c['defaultSize'] ?? '')),
'quantity' => '1',
'price' => '',
'image' => trim((string) ($c['defaultImage'] ?? '')),
'status' => 'active',
'purchasedAt' => null,
'source' => 'manual',
'recurringIntervalDays' => $interval,
'addedAt' => gmdate('c'),
]);
if (!isset($lists['byStore'][$storeId])) {
$lists['byStore'][$storeId] = [];
}
$lists['byStore'][$storeId][] = $line;
$catalog[$ci]['nextDueDate'] = gmdate('Y-m-d', strtotime('+' . $interval . ' days'));
$added++;
}
if ($added > 0) {
writeJsonFile('grocery_catalog.json', $catalog);
writeJsonFile('grocery_lists.json', $lists);
}
fwrite(STDOUT, 'grocery_recurring: added ' . $added . " item(s).\n");