summaryrefslogtreecommitdiff
path: root/import/load_assemblies.php
blob: 140b424462de9f8ab62b41f8f76b5147a57e46b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
/**
 * Load stock assemblies and their BOM from a CSV file.
 *
 * Place your CSV at:  stock/import/data/assemblies.csv
 *
 * CSV columns (with header row skipped):
 *   assembly_title, component_title, quantity_value, quantity_item, item_position
 *
 * Rows are grouped by assembly_title. Components must already exist
 * (run load_components.php first).
 *
 * @package stock
 */

namespace Bitweaver\Stock;

require_once '../../kernel/includes/setup_inc.php';

global $gBitSystem, $gBitSmarty, $gBitDb;

$gBitSystem->verifyPackage( 'stock' );
$gBitSystem->verifyPermission( 'p_stock_admin' );

require_once __DIR__.'/ImportAssembly.php';

$csvFile = __DIR__.'/data/simple_assemblies.csv';
$loaded  = 0;
$skipped = 0;
$errors  = [];

if( !file_exists( $csvFile ) ) {
	$errors[] = 'CSV file not found: '.$csvFile;
} else {
	$handle = fopen( $csvFile, 'r' );
	if( $handle === false ) {
		$errors[] = 'Cannot open CSV file.';
	} else {
		// Group rows by assembly title
		$batches  = [];
		$rowNum   = 0;
		while( ( $data = fgetcsv( $handle, 1000, ',', '"', '\\' ) ) !== false ) {
			$rowNum++;
			if( $rowNum === 1 ) {
				continue; // skip header
			}
			$assemblyTitle = trim( $data[0] ?? '' );
			if( empty( $assemblyTitle ) ) {
				$skipped++;
				$errors[] = "Row $rowNum: empty assembly title, skipped.";
				continue;
			}
			$batches[$assemblyTitle][] = array_merge( [ $rowNum ], $data );
		}
		fclose( $handle );

		// Process each assembly batch
		foreach( $batches as $assemblyTitle => $rows ) {
			$result = StockAssemblyBatchLoad( $assemblyTitle, $rows );
			$loaded  += $result['loaded'];
			$skipped += $result['skipped'];
			$errors   = array_merge( $errors, $result['errors'] );
		}
	}
}

$gBitSmarty->assign( 'loaded',  $loaded );
$gBitSmarty->assign( 'skipped', $skipped );
$gBitSmarty->assign( 'errors',  $errors );
$gBitSmarty->assign( 'csvFile', $csvFile );

$gBitSystem->display( 'bitpackage:stock/import_results.tpl', 'Import Assemblies' );