generate_test_import.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. /**
  3. * Script to generate test Excel file for ImportOrdersService tests
  4. * Run: php tests/fixtures/generate_test_import.php
  5. */
  6. require_once __DIR__ . '/../../vendor/autoload.php';
  7. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  9. $spreadsheet = new Spreadsheet();
  10. $sheet = $spreadsheet->getActiveSheet();
  11. // Headers (must match ImportOrdersService::HEADERS)
  12. $headers = [
  13. 'Округ',
  14. 'Район',
  15. 'Название площадки',
  16. 'Адрес объекта',
  17. 'Тип объекта',
  18. 'Артикул',
  19. 'Номер номенклатуры',
  20. 'Габаритные размеры',
  21. 'RFID',
  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. // Write headers
  47. $sheet->fromArray($headers, null, 'A1');
  48. // Test data rows
  49. $rows = [
  50. // Row 1: Valid row - should create order, product, product_sku
  51. [
  52. 'ЦАО', // Округ (districts.shortname)
  53. 'Тверской', // Район
  54. 'Тестовая площадка 1', // Название площадки
  55. 'ул. Тестовая, д. 1', // Адрес объекта
  56. 'Детская площадка', // Тип объекта
  57. 'ART-001', // Артикул
  58. 'NOM-001', // Номер номенклатуры
  59. '100x200x300', // Габаритные размеры
  60. 'RFID-001', // RFID
  61. 'Тестовый производитель', // Наименование производителя
  62. 'Горка детская', // Наименование по ТЗ
  63. 'Тип ТЗ 1', // Тип по тз
  64. 'Горка', // ТИП
  65. 100000, // Цена товара
  66. 50000, // Цена установки
  67. 150000, // Итоговая цена
  68. 'Примечание 1', // Примечание
  69. 2025, // Год установки
  70. 'MAF-001', // Номер заказа МАФ
  71. 'В-001', // № Ведомости
  72. 45658, // Дата ведомости (Excel date: 2025-01-15)
  73. 'УПД-001', // №УПД
  74. 'Новый', // Статус
  75. 'Комментарий к заказу', // Комментарий
  76. 'Тест Менеджер', // Менеджер
  77. 'F-001', // Номер фабрики
  78. 45658, // Дата пр-ва (Excel date)
  79. 60, // Срок эксплуатации (месяцев)
  80. 'CERT-001', // № сертификата
  81. 45658, // Дата выдачи (Excel date)
  82. 'Росстандарт', // Орган сертификации
  83. 'Сертификат', // ТИП (Декларация/Сертификат/Отказное)
  84. ],
  85. // Row 2: Same address, different product - tests order reuse
  86. [
  87. 'ЦАО',
  88. 'Тверской',
  89. 'Тестовая площадка 1',
  90. 'ул. Тестовая, д. 1', // Same address
  91. 'Детская площадка',
  92. 'ART-002',
  93. 'NOM-002', // Different nomenclature
  94. '200x300x400',
  95. 'RFID-002',
  96. 'Тестовый производитель 2',
  97. 'Качели детские',
  98. 'Тип ТЗ 2',
  99. 'Качели',
  100. 200000,
  101. 75000,
  102. 275000,
  103. 'Примечание 2',
  104. 2025,
  105. 'MAF-001', // Same MAF - should increment quantity
  106. 'В-002',
  107. 45658,
  108. 'УПД-002',
  109. 'Новый',
  110. '',
  111. 'Тест Менеджер',
  112. 'F-002',
  113. 45658,
  114. 72,
  115. 'CERT-002',
  116. 45658,
  117. 'Росстандарт',
  118. 'Сертификат',
  119. ],
  120. // Row 3: Invalid district - should be skipped
  121. [
  122. 'НЕСУЩЕСТВУЮЩИЙ_ОКРУГ', // Invalid district
  123. 'Тверской',
  124. 'Площадка с ошибкой',
  125. 'ул. Ошибочная, д. 999',
  126. 'Детская площадка',
  127. 'ART-003',
  128. 'NOM-003',
  129. '300x400x500',
  130. 'RFID-003',
  131. 'Производитель 3',
  132. 'Песочница',
  133. 'Тип ТЗ 3',
  134. 'Песочница',
  135. 50000,
  136. 25000,
  137. 75000,
  138. 'Примечание 3',
  139. 2025,
  140. '',
  141. 'В-003',
  142. 45658,
  143. 'УПД-003',
  144. 'Новый',
  145. 'Комментарий 3',
  146. 'Тест Менеджер',
  147. 'F-003',
  148. 45658,
  149. 48,
  150. 'CERT-003',
  151. 45658,
  152. 'Росстандарт',
  153. 'Сертификат',
  154. ],
  155. // Row 4: Duplicate of Row 1 - should be skipped (same RFID, product, order, maf)
  156. [
  157. 'ЦАО',
  158. 'Тверской',
  159. 'Тестовая площадка 1',
  160. 'ул. Тестовая, д. 1',
  161. 'Детская площадка',
  162. 'ART-001',
  163. 'NOM-001', // Same nomenclature as Row 1
  164. '100x200x300',
  165. 'RFID-001', // Same RFID
  166. 'Тестовый производитель',
  167. 'Горка детская',
  168. 'Тип ТЗ 1',
  169. 'Горка',
  170. 100000,
  171. 50000,
  172. 150000,
  173. 'Примечание 1',
  174. 2025,
  175. 'MAF-001', // Same MAF
  176. 'В-001', // Same statement
  177. 45658,
  178. 'УПД-001', // Same UPD
  179. 'Новый',
  180. 'Комментарий к заказу',
  181. 'Тест Менеджер',
  182. 'F-001', // Same factory number
  183. 45658, // Same manufacture date
  184. 60,
  185. 'CERT-001',
  186. 45658,
  187. 'Росстандарт',
  188. 'Сертификат',
  189. ],
  190. // Row 5: New order, product without MAF
  191. [
  192. 'ЦАО',
  193. 'Тверской',
  194. 'Тестовая площадка 2',
  195. 'ул. Другая, д. 5', // Different address - new order
  196. 'Детская площадка',
  197. 'ART-004',
  198. 'NOM-004',
  199. '150x250x350',
  200. 'RFID-004',
  201. 'Производитель 4',
  202. 'Карусель',
  203. 'Тип ТЗ 4',
  204. 'Карусель',
  205. 300000,
  206. 100000,
  207. 400000,
  208. 'Примечание 4', // Note - required field
  209. 2025,
  210. '', // No MAF order
  211. 'В-004', // Statement number
  212. 45658,
  213. 'УПД-004',
  214. 'Новый',
  215. 'Комментарий 4',
  216. 'Тест Менеджер',
  217. 'F-004',
  218. 45658,
  219. 84,
  220. 'CERT-004',
  221. 45658,
  222. 'Росстандарт',
  223. 'Декларация',
  224. ],
  225. ];
  226. // Write data rows starting from row 2
  227. $rowNum = 2;
  228. foreach ($rows as $row) {
  229. $sheet->fromArray($row, null, "A{$rowNum}");
  230. $rowNum++;
  231. }
  232. // Save file
  233. $writer = new Xlsx($spreadsheet);
  234. $writer->save(__DIR__ . '/test_orders_import.xlsx');
  235. echo "Test file created: tests/fixtures/test_orders_import.xlsx\n";
  236. echo "Contains " . count($rows) . " data rows:\n";
  237. echo "- Row 1: Valid - creates order, product, maf_order, product_sku\n";
  238. echo "- Row 2: Valid - reuses order, creates product, increments maf_order quantity\n";
  239. echo "- Row 3: Invalid district - should be skipped\n";
  240. echo "- Row 4: Duplicate of Row 1 - should be skipped\n";
  241. echo "- Row 5: Valid - creates new order without MAF\n";