procbay-schema 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +189 -0
- package/package.json +77 -0
- package/prisma/.env +13 -0
- package/prisma/migrations/20250116142512_init_user_table/migration.sql +38 -0
- package/prisma/migrations/20250116142709_init_role_table/migration.sql +20 -0
- package/prisma/migrations/20250116143847_init_user_role_table/migration.sql +20 -0
- package/prisma/migrations/20250116144035_init_permission_table/migration.sql +21 -0
- package/prisma/migrations/20250116144140_init_role_permission_table/migration.sql +21 -0
- package/prisma/migrations/20250116144233_init_department_table/migration.sql +20 -0
- package/prisma/migrations/20250116144345_init_user_department_table/migration.sql +20 -0
- package/prisma/migrations/20250116152941_init_serial_number_table/migration.sql +17 -0
- package/prisma/migrations/20250116153048_init_category_table/migration.sql +22 -0
- package/prisma/migrations/20250116153415_init_attributes_table/migration.sql +28 -0
- package/prisma/migrations/20250116153628_init_attribute_values_table/migration.sql +27 -0
- package/prisma/migrations/20250116153900_init_purchase_intake_table/migration.sql +32 -0
- package/prisma/migrations/20250116154038_init_purchase_intake_item_table/migration.sql +15 -0
- package/prisma/migrations/20250120090355_added_reset_token_column_in_user_table/migration.sql +10 -0
- package/prisma/migrations/20250120100616_init_item_table/migration.sql +42 -0
- package/prisma/migrations/20250120123720_init_vendor_table/migration.sql +39 -0
- package/prisma/migrations/20250120124526_init_vendor_categories_table/migration.sql +20 -0
- package/prisma/migrations/20250122114935_added_email_template_and_smtp_config_table/migration.sql +41 -0
- package/prisma/migrations/20250123095637_chnages_in_vendr_table/migration.sql +3 -0
- package/prisma/migrations/20250123103705_added_delated_filed_in_email_template_table/migration.sql +4 -0
- package/prisma/migrations/20250123103810_added_delated_filed_in_smtp_config_table/migration.sql +13 -0
- package/prisma/migrations/20250127123900_create_approval_heirarchy_table/migration.sql +72 -0
- package/prisma/migrations/20250128054523_make_optional_role_and_user_in_approval_hierachy/migration.sql +3 -0
- package/prisma/migrations/20250129084223_item_table_chnages/migration.sql +151 -0
- package/prisma/migrations/20250130115331_chnages_in_item_table/migration.sql +9 -0
- package/prisma/migrations/20250131054132_added_approval_journey_table/migration.sql +22 -0
- package/prisma/migrations/20250131064653_added_default_for_product_id_in_item_table/migration.sql +2 -0
- package/prisma/migrations/20250204101253_chnages_in_approval_table/migration.sql +39 -0
- package/prisma/migrations/20250206091422_added_item_document_table/migration.sql +17 -0
- package/prisma/migrations/20250207113110_added_new_column_media/migration.sql +9 -0
- package/prisma/migrations/20250207125224_added_chnages_in_pr_table/migration.sql +12 -0
- package/prisma/migrations/20250212092048_vendor_contact_table/migration.sql +30 -0
- package/prisma/migrations/20250212133620_added_tamplate_master_table/migration.sql +43 -0
- package/prisma/migrations/20250213111908_created_faq_catgory_and_faq_table/migration.sql +58 -0
- package/prisma/migrations/20250214065142_chnages_in_uom_table/migration.sql +50 -0
- package/prisma/migrations/20250217061122_corrected_email_teamplate_table/migration.sql +11 -0
- package/prisma/migrations/20250218073530_init_events/migration.sql +120 -0
- package/prisma/migrations/20250218092119_corrected_table_name/migration.sql +37 -0
- package/prisma/migrations/20250218120935_chnages_in_event_table/migration.sql +5 -0
- package/prisma/migrations/20250219083326_added_new_table_for_event_startegy/migration.sql +60 -0
- package/prisma/migrations/20250219083416_added_cms_table/migration.sql +29 -0
- package/prisma/migrations/20250219092918_alter_event_table/migration.sql +5 -0
- package/prisma/migrations/20250219093046_alter_event_to_draft/migration.sql +2 -0
- package/prisma/migrations/20250220080337_altered_event_table/migration.sql +9 -0
- package/prisma/migrations/20250221105922_added_unique_to_email_in_user_table/migration.sql +8 -0
- package/prisma/migrations/20250225063838_created_vendor_kyc_table/migration.sql +23 -0
- package/prisma/migrations/20250227060646_template_field_types_added_enum/migration.sql +14 -0
- package/prisma/migrations/20250227110306_updated_event_items_and_event_vendor_table/migration.sql +7 -0
- package/prisma/migrations/20250228060440_added_country_code_in_vendor_contact_person/migration.sql +2 -0
- package/prisma/migrations/20250228095319_init_currencies_table/migration.sql +23 -0
- package/prisma/migrations/20250303082614_added_support_ticket_table/migration.sql +89 -0
- package/prisma/migrations/20250304050248_alter_support_ticket_relations/migration.sql +35 -0
- package/prisma/migrations/20250304050613_alter_support_ticket_realtions/migration.sql +36 -0
- package/prisma/migrations/20250304061954_init_support_category_table/migration.sql +261 -0
- package/prisma/migrations/20250304092346_alter_event_vendor_table/migration.sql +2 -0
- package/prisma/migrations/20250305065430_alter_vendor_kyc_table/migration.sql +2 -0
- package/prisma/migrations/20250305111735_alter_vendor_and_user_table/migration.sql +5 -0
- package/prisma/migrations/20250307033751_alter_token_version_in_user_and_vendor_token/migration.sql +5 -0
- package/prisma/migrations/20250307034907_alter_user_and_vendor_table/migration.sql +14 -0
- package/prisma/migrations/20250307064359_chnages_in_approval_herarcy_table/migration.sql +2 -0
- package/prisma/migrations/20250307105352_alter_itme_and_vendorkyc_table/migration.sql +21 -0
- package/prisma/migrations/20250310103914_init_vendor_status_table/migration.sql +21 -0
- package/prisma/migrations/20250310105209_alter_vendor_status_table/migration.sql +18 -0
- package/prisma/migrations/20250310105413_init_vendor_kyc_status_table/migration.sql +23 -0
- package/prisma/migrations/20250311090552_alter_vendor_kyc_status_table/migration.sql +2 -0
- package/prisma/migrations/20250312055258_alter_status_column_in_event_vendors/migration.sql +12 -0
- package/prisma/migrations/20250312072145_init_vendor_event_watchlist_table/migration.sql +26 -0
- package/prisma/migrations/20250312083842_alter_vendor_event_watchlisst_table/migration.sql +41 -0
- package/prisma/migrations/20250312134730_added_chnages_in_kyc_table/migration.sql +19 -0
- package/prisma/migrations/20250317040841_init_admin_and_vendor_tables/migration.sql +38 -0
- package/prisma/migrations/20250317044110_alter_event_vendor_table/migration.sql +2 -0
- package/prisma/migrations/20250317071807_alter_rejected_reason_in_approval_journey_and_purchase_intak_table/migration.sql +5 -0
- package/prisma/migrations/20250318085504_init_customer_notification_table/migration.sql +31 -0
- package/prisma/migrations/20250318085856_alter_purchase_intake_table/migration.sql +18 -0
- package/prisma/migrations/20250319085159_alter_purchase_intake_table/migration.sql +12 -0
- package/prisma/migrations/20250320093356_init_bid_and_bidlog_table/migration.sql +75 -0
- package/prisma/migrations/20250320095501_alter_email_template_table/migration.sql +2 -0
- package/prisma/migrations/20250321053926_alter_approval_journey_table/migration.sql +2 -0
- package/prisma/migrations/20250324040851_alter_bidlog_table/migration.sql +2 -0
- package/prisma/migrations/20250324091328_init_form_master_and_dynamic_form_table/migration.sql +53 -0
- package/prisma/migrations/20250324103742_alter_bidlog_table/migration.sql +5 -0
- package/prisma/migrations/20250325052714_alter_form_master_table/migration.sql +27 -0
- package/prisma/migrations/20250327011625_init_module_and_tenant_configuration_table/migration.sql +39 -0
- package/prisma/migrations/20250403054008_alter_purchase_intake_table/migration.sql +5 -0
- package/prisma/migrations/20250404115613_init_approval_level_user/migration.sql +98 -0
- package/prisma/migrations/20250410060521_alter_approval_journey_enums/migration.sql +12 -0
- package/prisma/migrations/20250410110823_alter_purchase_intake/migration.sql +2 -0
- package/prisma/migrations/20250411062955_alter_template_field_table/migration.sql +2 -0
- package/prisma/migrations/20250414065640_alter_template/migration.sql +2 -0
- package/prisma/migrations/20250414111856_alter_event_vendors/migration.sql +2 -0
- package/prisma/migrations/20250414125356_alter_event_vendor/migration.sql +9 -0
- package/prisma/migrations/20250415063558_alter_alert_type_enum/migration.sql +2 -0
- package/prisma/migrations/20250416062508_alter_purchase_intake_table/migration.sql +15 -0
- package/prisma/migrations/20250417090325_alter_purchase_intake_table_updated_enum/migration.sql +13 -0
- package/prisma/migrations/20250417111024_alter_purchase_intake_and_purchase_intake_item/migration.sql +16 -0
- package/prisma/migrations/20250421061732_init_quotation_and_quotation_log_tables/migration.sql +96 -0
- package/prisma/migrations/20250421112331_alter_item_table_added_unique_to_slug/migration.sql +8 -0
- package/prisma/migrations/20250422060655_init_user_activity_table/migration.sql +17 -0
- package/prisma/migrations/20250423053027_/migration.sql +9 -0
- package/prisma/migrations/20250423103233_alter_user_login_activity_table/migration.sql +5 -0
- package/prisma/migrations/20250423111141_init_location_tables/migration.sql +141 -0
- package/prisma/migrations/20250424120106_alter_event_table_added_user_relation/migration.sql +2 -0
- package/prisma/migrations/20250424141637_alter_states_table/migration.sql +11 -0
- package/prisma/migrations/20250425105131_alter_user_login_activity_table/migration.sql +9 -0
- package/prisma/migrations/20250428092626_alter_location_tables/migration.sql +34 -0
- package/prisma/migrations/20250428114301_alter_location_table/migration.sql +14 -0
- package/prisma/migrations/20250429103436_alter_event_vendor_table/migration.sql +14 -0
- package/prisma/migrations/20250429135621_alter_event_vendor_table/migration.sql +5 -0
- package/prisma/migrations/20250430094809_alter_form_master_table_added_user_relation/migration.sql +2 -0
- package/prisma/migrations/20250430103440_alter_event_table/migration.sql +3 -0
- package/prisma/migrations/20250501125411_alter_strategies_table/migration.sql +2 -0
- package/prisma/migrations/20250502065554_init_location_table/migration.sql +41 -0
- package/prisma/migrations/20250505104038_alter_bid_quotation_and_dynamic_form/migration.sql +22 -0
- package/prisma/migrations/20250505105253_alter_quotation/migration.sql +5 -0
- package/prisma/migrations/20250505124851_alter_alert_enum/migration.sql +56 -0
- package/prisma/migrations/20250505133250_init_sub_module_table/migration.sql +17 -0
- package/prisma/migrations/20250506054325_alter_event_vendor_bid_status/migration.sql +14 -0
- package/prisma/migrations/20250506102135_init_counter_offer_table/migration.sql +38 -0
- package/prisma/migrations/20250506103355_alter_bid_and_quotaion_table/migration.sql +5 -0
- package/prisma/migrations/20250506110309_alter_tenant_configuration_table/migration.sql +3 -0
- package/prisma/migrations/20250506123527_alter_vendor_kyu_infor_verification_status/migration.sql +2 -0
- package/prisma/migrations/20250507055536_alter_dynamic_form_table/migration.sql +2 -0
- package/prisma/migrations/20250507070518_alter_bid_log_and_quotation_log/migration.sql +15 -0
- package/prisma/migrations/20250507130834_alter_bid_status/migration.sql +10 -0
- package/prisma/migrations/20250508065503_alter_purchase_intake_item_table/migration.sql +16 -0
- package/prisma/migrations/20250508130119_alter_purchase_intake_item/migration.sql +13 -0
- package/prisma/migrations/20250512082244_altered_template_table_to_add_currency_id/migration.sql +12 -0
- package/prisma/migrations/20250512100817_alter_approval_journey_table/migration.sql +3 -0
- package/prisma/migrations/20250513083700_alter_item_table/migration.sql +2 -0
- package/prisma/migrations/20250514100915_alter_event_table_added_template_realtion/migration.sql +2 -0
- package/prisma/migrations/20250514103503_alter_vendor_table_added_is_kyc_approved_column/migration.sql +2 -0
- package/prisma/migrations/20250520131556_init_purchase_order_table/migration.sql +52 -0
- package/prisma/migrations/20250521113946_alter_purchase_order_status_enum/migration.sql +16 -0
- package/prisma/migrations/20250522083917_alter_event_vendor_bid_status_enum/migration.sql +17 -0
- package/prisma/migrations/20250522131610_updated_vendor_table/migration.sql +16 -0
- package/prisma/migrations/20250523051058_alter_vendor_kyc_verificaiton_status_enum/migration.sql +2 -0
- package/prisma/migrations/20250526072120_alter_vendor_table/migration.sql +16 -0
- package/prisma/migrations/20250527055351_init_purchase_order_activity_log/migration.sql +41 -0
- package/prisma/migrations/20250528060657_alter_item_tale/migration.sql +14 -0
- package/prisma/migrations/20250528061946_alter_event_item_table/migration.sql +5 -0
- package/prisma/migrations/20250528081337_alter_item_table/migration.sql +2 -0
- package/prisma/migrations/20250528081524_removed_item_id_from_item_table/migration.sql +11 -0
- package/prisma/migrations/20250528081843_alter_item_table/migration.sql +2 -0
- package/prisma/migrations/20250528094057_alter_alert_type_enum/migration.sql +11 -0
- package/prisma/migrations/20250529053721_alter_added_quantity_in_purchase_order/migration.sql +2 -0
- package/prisma/migrations/20250602055114_alter_approval_journey_parent_id_to_string/migration.sql +2 -0
- package/prisma/migrations/20250602055748_alter_event_configuration_added_rule_slug/migration.sql +2 -0
- package/prisma/migrations/20250602111042_init_user_vendor_socket_token_table/migration.sql +17 -0
- package/prisma/migrations/20250602125833_alter_bidlog_and_quoatationlog_tableto_add_json_field/migration.sql +5 -0
- package/prisma/migrations/20250603063501_alter_bid_and_quoatation_table/migration.sql +29 -0
- package/prisma/migrations/20250606015045_alter_quotation_log_table/migration.sql +2 -0
- package/prisma/migrations/20250606020918_alter_quotation_table/migration.sql +2 -0
- package/prisma/migrations/20250606022901_alter_quotation_log_table/migration.sql +3 -0
- package/prisma/migrations/20250606054914_init_event_activity_logs_table/migration.sql +35 -0
- package/prisma/migrations/20250606100634_alter_added_counter_offer_status/migration.sql +5 -0
- package/prisma/migrations/20250606100908_alter_counter_offer_table/migration.sql +2 -0
- package/prisma/migrations/20250610055710_alter_enum/migration.sql +16 -0
- package/prisma/migrations/20250610060558_alter_event_and_event_vendor_db/migration.sql +14 -0
- package/prisma/migrations/20250610091013_alter_purchase_intak_item_table/migration.sql +4 -0
- package/prisma/migrations/20250610100156_alter_purchase_intake_item_table/migration.sql +19 -0
- package/prisma/migrations/20250610125706_alter_event_table/migration.sql +6 -0
- package/prisma/migrations/20250610133613_added_timestamp/migration.sql +319 -0
- package/prisma/migrations/20250611090439_init_contact_us_table/migration.sql +23 -0
- package/prisma/migrations/20250611121005_alter_event_vendor_table/migration.sql +10 -0
- package/prisma/migrations/20250612064335_alter_tenant_configuration/migration.sql +3 -0
- package/prisma/migrations/20250612094643_alter_event_vendor_bid_status_enum/migration.sql +2 -0
- package/prisma/migrations/20250618074558_alter_updated_bid_status_and_quotation_status/migration.sql +21 -0
- package/prisma/migrations/20250618122242_alter_added_event_phase_closed/migration.sql +2 -0
- package/prisma/migrations/20250620054518_alter_event_phase/migration.sql +2 -0
- package/prisma/migrations/20250620062723_alter_event_phase/migration.sql +2 -0
- package/prisma/migrations/20250620063056_alter_event_phase/migration.sql +2 -0
- package/prisma/migrations/20250620100507_alter_event_phase/migration.sql +2 -0
- package/prisma/migrations/20250627104958_alter_counter_offer_status/migration.sql +2 -0
- package/prisma/migrations/20250702095923_alter_item_table/migration.sql +74 -0
- package/prisma/migrations/20250702120134_/migration.sql +14 -0
- package/prisma/migrations/20250702150717_alter_attribute_table/migration.sql +9 -0
- package/prisma/migrations/20250703090321_alter_item_table/migration.sql +2 -0
- package/prisma/migrations/20250707054625_alter_purchase_order_table/migration.sql +15 -0
- package/prisma/migrations/20250707111354_alter_purchase_order_table_and_init_purchase_order_item_table/migration.sql +39 -0
- package/prisma/migrations/20250707111522_alter_purchase_order_item_table/migration.sql +17 -0
- package/prisma/migrations/20250710054113_alter_bid_and_quotation_status/migration.sql +31 -0
- package/prisma/migrations/20250710070813_alter_event_status/migration.sql +2 -0
- package/prisma/migrations/20250710082332_alter_bid_and_quotations_table/migration.sql +36 -0
- package/prisma/migrations/20250714102325_init_upload_log_table/migration.sql +27 -0
- package/prisma/migrations/20250716061012_alter_event_activity_logs_to_activity_logs/migration.sql +48 -0
- package/prisma/migrations/20250716071839_init_chat_thread_chat_message_and_ai_models/migration.sql +56 -0
- package/prisma/migrations/20250716135548_alter_admin_alerts_enum/migration.sql +2 -0
- package/prisma/migrations/20250717100515_init_user_event_configuration/migration.sql +21 -0
- package/prisma/migrations/20250717101037_alter_user_event_configuration_table/migration.sql +19 -0
- package/prisma/migrations/20250718071630_alter_added_module_in_upload_logs_table/migration.sql +5 -0
- package/prisma/migrations/20250718071732_alter_module_enum/migration.sql +15 -0
- package/prisma/migrations/20250721054851_init_export_log_table/migration.sql +34 -0
- package/prisma/migrations/20250722054549_init_fiscal_year_table/migration.sql +22 -0
- package/prisma/migrations/20250722072051_alter_fiscal_year_table_added_uuid/migration.sql +14 -0
- package/prisma/migrations/20250722095259_alter_fiscal_table/migration.sql +9 -0
- package/prisma/migrations/20250723071050_alter_department_table/migration.sql +14 -0
- package/prisma/migrations/20250724071201_alter_export_upload_log_enum/migration.sql +8 -0
- package/prisma/migrations/20250725094759_new_migrate/migration.sql +2 -0
- package/prisma/migrations/20250725095012_alter_migration/migration.sql +2 -0
- package/prisma/migrations/20250728072402_init_budget_management_tables/migration.sql +80 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +2609 -0
- package/prisma/seeders/approval-hierarchy.seed.js +340 -0
- package/prisma/seeders/attribute-value.seed.js +64 -0
- package/prisma/seeders/attribute.seed.js +61 -0
- package/prisma/seeders/category.seed.js +133 -0
- package/prisma/seeders/city.seed.js +147 -0
- package/prisma/seeders/country.seed.js +282 -0
- package/prisma/seeders/currency.seed.js +41 -0
- package/prisma/seeders/customer-notification.seed.js +83 -0
- package/prisma/seeders/department.seed.js +38 -0
- package/prisma/seeders/docs/CORE_SEEDER_OPTIMIZATIONS.md +270 -0
- package/prisma/seeders/docs/GEOGRAPHIC_PERFORMANCE_OPTIMIZATIONS.md +175 -0
- package/prisma/seeders/dynamic-form.seed.js +135 -0
- package/prisma/seeders/email-template.seed.js +68 -0
- package/prisma/seeders/faq-category.seed.js +56 -0
- package/prisma/seeders/faq.seed.js +61 -0
- package/prisma/seeders/form-master.seed.js +55 -0
- package/prisma/seeders/item.seed.js +133 -0
- package/prisma/seeders/permission.seed.js +102 -0
- package/prisma/seeders/region.seed.js +78 -0
- package/prisma/seeders/role-permission.seed.js +70 -0
- package/prisma/seeders/role.seed.js +38 -0
- package/prisma/seeders/seed.js +553 -0
- package/prisma/seeders/serial-number-config.seed.js +58 -0
- package/prisma/seeders/smtp-config.seed.js +61 -0
- package/prisma/seeders/state.seed.js +170 -0
- package/prisma/seeders/strategies.seed.js +54 -0
- package/prisma/seeders/subregion.seed.js +88 -0
- package/prisma/seeders/support-category.seed.js +56 -0
- package/prisma/seeders/template.seed.js +87 -0
- package/prisma/seeders/test-core-seeders.js +276 -0
- package/prisma/seeders/user-department.seed.js +66 -0
- package/prisma/seeders/user-event-configuration.seed.js +47 -0
- package/prisma/seeders/user-role.seed.js +74 -0
- package/prisma/seeders/user.seed.js +114 -0
- package/prisma/seeders/utils/bulk-seeder.js +300 -0
- package/prisma/seeders/utils/config.js +103 -0
- package/prisma/seeders/utils/connection-manager.js +380 -0
- package/prisma/seeders/utils/content-seeder.js +472 -0
- package/prisma/seeders/utils/core-seeder.js +330 -0
- package/prisma/seeders/utils/json-loader.js +69 -0
- package/prisma/seeders/utils/performance-config.js +341 -0
- package/prisma/seeders/utils/performance-helpers.js +206 -0
- package/prisma/seeders/utils/progress-tracker.js +364 -0
- package/prisma/seeders/utils/seeder-config-mapper.js +316 -0
- package/scripts/seed-databases.js +873 -0
- package/scripts/sync-schemas.js +865 -0
- package/scripts/truncate-tables.js +1048 -0
- package/src/prisma/client.d.ts +1 -0
- package/src/prisma/client.js +4 -0
- package/src/prisma/default.d.ts +1 -0
- package/src/prisma/default.js +4 -0
- package/src/prisma/edge.d.ts +1 -0
- package/src/prisma/edge.js +2084 -0
- package/src/prisma/index-browser.js +2043 -0
- package/src/prisma/index.d.ts +202051 -0
- package/src/prisma/index.js +2113 -0
- package/src/prisma/libquery_engine-darwin.dylib.node +0 -0
- package/src/prisma/libquery_engine-darwin.dylib.node.tmp24628 +0 -0
- package/src/prisma/libquery_engine-darwin.dylib.node.tmp29464 +0 -0
- package/src/prisma/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
- package/src/prisma/package.json +140 -0
- package/src/prisma/query_engine-windows.dll.node +0 -0
- package/src/prisma/query_engine-windows.dll.node.tmp4144 +0 -0
- package/src/prisma/runtime/edge-esm.js +34 -0
- package/src/prisma/runtime/edge.js +34 -0
- package/src/prisma/runtime/index-browser.d.ts +370 -0
- package/src/prisma/runtime/index-browser.js +16 -0
- package/src/prisma/runtime/library.d.ts +3647 -0
- package/src/prisma/runtime/library.js +146 -0
- package/src/prisma/runtime/react-native.js +83 -0
- package/src/prisma/runtime/wasm.js +35 -0
- package/src/prisma/schema.prisma +2609 -0
- package/src/prisma/wasm.d.ts +1 -0
- package/src/prisma/wasm.js +2043 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { PrismaClient } from "../../src/prisma/index.js";
|
|
2
|
+
import {
|
|
3
|
+
createProgressTracker,
|
|
4
|
+
logSeederStart,
|
|
5
|
+
logSeederComplete,
|
|
6
|
+
logSeederError,
|
|
7
|
+
logEntityError,
|
|
8
|
+
} from "./utils/progress-tracker.js";
|
|
9
|
+
import { loadGeoData } from "./utils/json-loader.js";
|
|
10
|
+
import { createPerformanceConfig } from "./utils/performance-config.js";
|
|
11
|
+
import { withOptimizedConnection } from "./utils/connection-manager.js";
|
|
12
|
+
|
|
13
|
+
// Process cities in optimized parallel batches with retry logic
|
|
14
|
+
async function processBatch(prisma, batch, countryIdMap, stateIdMap, tracker, retryAttempts = 3) {
|
|
15
|
+
const citiesToCreate = batch
|
|
16
|
+
.map((city) => {
|
|
17
|
+
const countryDbId = city.country_id
|
|
18
|
+
? countryIdMap.get(city.country_id)
|
|
19
|
+
: null;
|
|
20
|
+
const stateDbId = city.state_id ? stateIdMap.get(city.state_id) : null;
|
|
21
|
+
|
|
22
|
+
// City must have a country. State is optional.
|
|
23
|
+
if (!countryDbId) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
name: city.name,
|
|
29
|
+
country_id: countryDbId,
|
|
30
|
+
state_id: stateDbId,
|
|
31
|
+
latitude: city.latitude ? parseFloat(city.latitude) : null,
|
|
32
|
+
longitude: city.longitude ? parseFloat(city.longitude) : null,
|
|
33
|
+
wikiDataId: city.wikiDataId,
|
|
34
|
+
status: true,
|
|
35
|
+
};
|
|
36
|
+
})
|
|
37
|
+
.filter(Boolean); // Filter out nulls for cities with no country match
|
|
38
|
+
|
|
39
|
+
if (citiesToCreate.length === 0) {
|
|
40
|
+
tracker.update(batch.length);
|
|
41
|
+
return { success: true, created: 0 };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Retry logic for database operations
|
|
45
|
+
for (let attempt = 1; attempt <= retryAttempts; attempt++) {
|
|
46
|
+
try {
|
|
47
|
+
const result = await prisma.city.createMany({
|
|
48
|
+
data: citiesToCreate,
|
|
49
|
+
skipDuplicates: true, // Use INSERT ... ON CONFLICT DO NOTHING for performance
|
|
50
|
+
});
|
|
51
|
+
tracker.update(batch.length);
|
|
52
|
+
return { success: true, created: result.count };
|
|
53
|
+
} catch (error) {
|
|
54
|
+
if (attempt === retryAttempts) {
|
|
55
|
+
logEntityError("city batch", `attempt ${attempt}/${retryAttempts}`, error.message);
|
|
56
|
+
tracker.update(batch.length);
|
|
57
|
+
return { success: false, error: error.message };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Wait before retry with exponential backoff
|
|
61
|
+
const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);
|
|
62
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Seeds city data with optional filtering by country IDs
|
|
69
|
+
*
|
|
70
|
+
* @param {PrismaClient} prismaClient - Prisma client instance or transaction
|
|
71
|
+
* @param {Map} countryIdMap - Mapping of country JSON IDs to DB IDs
|
|
72
|
+
* @param {Map} stateIdMap - Mapping of state JSON IDs to DB IDs
|
|
73
|
+
* @param {Set} [filteredCountryIds] - Optional Set of country JSON IDs to filter cities by
|
|
74
|
+
*/
|
|
75
|
+
export async function seedCities(
|
|
76
|
+
prismaClient,
|
|
77
|
+
countryIdMap,
|
|
78
|
+
stateIdMap,
|
|
79
|
+
filteredCountryIds = null
|
|
80
|
+
) {
|
|
81
|
+
const prisma = prismaClient || new PrismaClient();
|
|
82
|
+
logSeederStart("cities");
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// Get performance configuration
|
|
86
|
+
const perfConfig = createPerformanceConfig();
|
|
87
|
+
const cityConfig = perfConfig.getConfig('geographic', 'cities');
|
|
88
|
+
|
|
89
|
+
console.log(`Using optimized configuration: batch=${cityConfig.batchSize}, concurrent=${cityConfig.maxConcurrentBatches}`);
|
|
90
|
+
|
|
91
|
+
const citiesData = loadGeoData("cities");
|
|
92
|
+
let filteredCitiesData = citiesData;
|
|
93
|
+
|
|
94
|
+
if (filteredCountryIds && filteredCountryIds.size > 0) {
|
|
95
|
+
filteredCitiesData = citiesData.filter((city) =>
|
|
96
|
+
filteredCountryIds.has(city.country_id)
|
|
97
|
+
);
|
|
98
|
+
console.log(`Filtering cities by ${filteredCountryIds.size} countries`);
|
|
99
|
+
console.log(
|
|
100
|
+
`Found ${filteredCitiesData.length} matching cities out of ${citiesData.length} total`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const totalCount = filteredCitiesData.length;
|
|
105
|
+
console.log(
|
|
106
|
+
`Total number of cities to process: ${totalCount.toLocaleString()}`
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const tracker = createProgressTracker(totalCount, "cities");
|
|
110
|
+
|
|
111
|
+
// Use performance-optimized batch size
|
|
112
|
+
const batchSize = cityConfig.batchSize;
|
|
113
|
+
const maxConcurrentBatches = cityConfig.maxConcurrentBatches;
|
|
114
|
+
|
|
115
|
+
// Process in controlled concurrent batches
|
|
116
|
+
const chunks = [];
|
|
117
|
+
for (let i = 0; i < filteredCitiesData.length; i += batchSize) {
|
|
118
|
+
chunks.push(filteredCitiesData.slice(i, i + batchSize));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
console.log(`Processing ${chunks.length} chunks with max ${maxConcurrentBatches} concurrent batches`);
|
|
122
|
+
|
|
123
|
+
// Process chunks in controlled batches to avoid overwhelming the database
|
|
124
|
+
for (let i = 0; i < chunks.length; i += maxConcurrentBatches) {
|
|
125
|
+
const currentBatch = chunks.slice(i, i + maxConcurrentBatches);
|
|
126
|
+
const batchPromises = currentBatch.map(chunk =>
|
|
127
|
+
processBatch(prisma, chunk, countryIdMap, stateIdMap, tracker, cityConfig.retryAttempts || 3)
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
await Promise.all(batchPromises);
|
|
131
|
+
|
|
132
|
+
// Memory management: force garbage collection if available
|
|
133
|
+
if (global.gc && chunks.length > 10) {
|
|
134
|
+
global.gc();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
logSeederComplete(`Cities${filteredCountryIds ? " (filtered)" : ""}`);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
logSeederError("cities", error);
|
|
141
|
+
throw error;
|
|
142
|
+
} finally {
|
|
143
|
+
if (!prismaClient) {
|
|
144
|
+
await prisma.$disconnect();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { PrismaClient } from "../../src/prisma/index.js";
|
|
2
|
+
import { loadGeoData } from "./utils/json-loader.js";
|
|
3
|
+
import {
|
|
4
|
+
createProgressTracker,
|
|
5
|
+
logSeederStart,
|
|
6
|
+
logSeederComplete,
|
|
7
|
+
logSeederError,
|
|
8
|
+
logEntityError,
|
|
9
|
+
} from "./utils/progress-tracker.js";
|
|
10
|
+
import { createPerformanceConfig } from "./utils/performance-config.js";
|
|
11
|
+
import { connectionManager } from "./utils/connection-manager.js";
|
|
12
|
+
import { RetryHandler, MemoryManager } from "./utils/performance-helpers.js";
|
|
13
|
+
|
|
14
|
+
// Map to store JSON ID to database ID mapping
|
|
15
|
+
const countryIdMap = new Map();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Repopulate country ID mapping after bulk operations
|
|
19
|
+
*/
|
|
20
|
+
async function repopulateCountryIdMap(prisma, countriesData, regionIdMap) {
|
|
21
|
+
logSeederStart("Re-populating country ID map");
|
|
22
|
+
|
|
23
|
+
// Get all created countries
|
|
24
|
+
const allCreatedCountries = await prisma.country.findMany({
|
|
25
|
+
select: { id: true, iso3: true, name: true },
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Create lookup map by ISO3 code (unique identifier)
|
|
29
|
+
const dbCountryLookup = new Map();
|
|
30
|
+
allCreatedCountries.forEach((country) => {
|
|
31
|
+
dbCountryLookup.set(country.iso3, country.id);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Map JSON IDs to database IDs
|
|
35
|
+
countriesData.forEach((jsonCountry) => {
|
|
36
|
+
const dbId = dbCountryLookup.get(jsonCountry.iso3);
|
|
37
|
+
if (dbId) {
|
|
38
|
+
countryIdMap.set(jsonCountry.id, dbId);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
logSeederComplete(
|
|
43
|
+
`Country ID map re-populated with ${countryIdMap.size} entries`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Optimized batch processor using createMany with retry logic and transactions
|
|
49
|
+
*/
|
|
50
|
+
async function processBatchOptimized(
|
|
51
|
+
prisma,
|
|
52
|
+
batch,
|
|
53
|
+
regionIdMap,
|
|
54
|
+
subregionIdMap,
|
|
55
|
+
retryHandler
|
|
56
|
+
) {
|
|
57
|
+
const countriesToCreate = batch
|
|
58
|
+
.map((country) => {
|
|
59
|
+
const regionDbId = country.region_id
|
|
60
|
+
? regionIdMap.get(country.region_id)
|
|
61
|
+
: null;
|
|
62
|
+
const subregionDbId = country.subregion_id
|
|
63
|
+
? subregionIdMap.get(country.subregion_id)
|
|
64
|
+
: null;
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
name: country.name,
|
|
68
|
+
iso3: country.iso3,
|
|
69
|
+
iso2: country.iso2,
|
|
70
|
+
numeric_code: country.numeric_code,
|
|
71
|
+
phonecode: country.phonecode,
|
|
72
|
+
capital: country.capital,
|
|
73
|
+
currency: country.currency,
|
|
74
|
+
currency_name: country.currency_name,
|
|
75
|
+
currency_symbol: country.currency_symbol,
|
|
76
|
+
tld: country.tld,
|
|
77
|
+
native: country.native,
|
|
78
|
+
region: country.region,
|
|
79
|
+
subregion: country.subregion,
|
|
80
|
+
nationality: country.nationality,
|
|
81
|
+
timezones: country.timezones,
|
|
82
|
+
translations: country.translations,
|
|
83
|
+
latitude: country.latitude,
|
|
84
|
+
longitude: country.longitude,
|
|
85
|
+
emoji: country.emoji,
|
|
86
|
+
emojiU: country.emojiU,
|
|
87
|
+
status: true,
|
|
88
|
+
region_id: regionDbId,
|
|
89
|
+
subregion_id: subregionDbId,
|
|
90
|
+
};
|
|
91
|
+
})
|
|
92
|
+
.filter(Boolean);
|
|
93
|
+
|
|
94
|
+
if (countriesToCreate.length === 0) {
|
|
95
|
+
return { success: true, created: 0 };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
// Use transaction for batch processing
|
|
100
|
+
const result = await retryHandler.execute(async () => {
|
|
101
|
+
return await prisma.country.createMany({
|
|
102
|
+
data: countriesToCreate,
|
|
103
|
+
skipDuplicates: true,
|
|
104
|
+
});
|
|
105
|
+
}, `Country batch (${countriesToCreate.length} items)`);
|
|
106
|
+
|
|
107
|
+
return { success: true, created: result.count };
|
|
108
|
+
} catch (error) {
|
|
109
|
+
logEntityError("country batch", "N/A", error.message);
|
|
110
|
+
return { success: false, error: error.message };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Seeds country data with optional filtering by country names
|
|
116
|
+
*
|
|
117
|
+
* @param {PrismaClient} prismaClient - Prisma client instance or transaction
|
|
118
|
+
* @param {Map} regionIdMap - Mapping of region JSON IDs to DB IDs
|
|
119
|
+
* @param {Map} subregionIdMap - Mapping of subregion JSON IDs to DB IDs
|
|
120
|
+
* @param {string[]} [countryNames] - Optional array of country names to seed; if not provided, all countries will be seeded
|
|
121
|
+
* @returns {Map} Mapping of country JSON IDs to DB IDs
|
|
122
|
+
*/
|
|
123
|
+
export async function seedCountries(
|
|
124
|
+
prismaClient,
|
|
125
|
+
regionIdMap,
|
|
126
|
+
subregionIdMap,
|
|
127
|
+
countryNames = []
|
|
128
|
+
) {
|
|
129
|
+
// Use provided transaction object or create a new prisma client
|
|
130
|
+
const prisma = prismaClient || new PrismaClient();
|
|
131
|
+
logSeederStart("countries");
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
// Load countries data from JSON file using our utility
|
|
135
|
+
const countriesData = loadGeoData("countries");
|
|
136
|
+
|
|
137
|
+
// Filter countries if specific names are provided
|
|
138
|
+
let filteredCountriesData = countriesData;
|
|
139
|
+
if (countryNames && countryNames.length > 0) {
|
|
140
|
+
// Case-insensitive matching of country names
|
|
141
|
+
const normalizedCountryNames = countryNames.map((name) =>
|
|
142
|
+
name.toLowerCase().trim()
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
filteredCountriesData = countriesData.filter((country) =>
|
|
146
|
+
normalizedCountryNames.includes(country.name.toLowerCase().trim())
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// Log information about the filtering
|
|
150
|
+
console.log(`Filtering countries by name: ${countryNames.join(", ")}`);
|
|
151
|
+
console.log(
|
|
152
|
+
`Found ${filteredCountriesData.length} matching countries out of ${countriesData.length} total`
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
// Check if any requested countries were not found
|
|
156
|
+
const foundCountryNames = filteredCountriesData.map((c) =>
|
|
157
|
+
c.name.toLowerCase().trim()
|
|
158
|
+
);
|
|
159
|
+
const missingCountryNames = normalizedCountryNames.filter(
|
|
160
|
+
(name) => !foundCountryNames.includes(name)
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
if (missingCountryNames.length > 0) {
|
|
164
|
+
console.warn(
|
|
165
|
+
`Warning: Could not find the following requested countries: ${missingCountryNames.join(
|
|
166
|
+
", "
|
|
167
|
+
)}`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Create progress tracker
|
|
173
|
+
const tracker = createProgressTracker(
|
|
174
|
+
filteredCountriesData.length,
|
|
175
|
+
"countries"
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
// Get performance configuration for countries
|
|
179
|
+
const performanceConfig = createPerformanceConfig().getConfig(
|
|
180
|
+
"geographic",
|
|
181
|
+
"countries"
|
|
182
|
+
);
|
|
183
|
+
const batchSize = performanceConfig.batchSize;
|
|
184
|
+
const retryHandler = new RetryHandler(
|
|
185
|
+
performanceConfig.retryAttempts || 3,
|
|
186
|
+
performanceConfig.retryDelay || 1000
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// Create an array of batch processing promises
|
|
190
|
+
const batchPromises = [];
|
|
191
|
+
|
|
192
|
+
for (let i = 0; i < filteredCountriesData.length; i += batchSize) {
|
|
193
|
+
const batch = filteredCountriesData.slice(i, i + batchSize);
|
|
194
|
+
batchPromises.push(
|
|
195
|
+
processBatchOptimized(
|
|
196
|
+
prisma,
|
|
197
|
+
batch,
|
|
198
|
+
regionIdMap,
|
|
199
|
+
subregionIdMap,
|
|
200
|
+
retryHandler
|
|
201
|
+
)
|
|
202
|
+
);
|
|
203
|
+
global.gc && global.gc(); // Hint garbage collection after large batches
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Log initial memory usage
|
|
207
|
+
MemoryManager.logMemoryUsage("Before country processing");
|
|
208
|
+
|
|
209
|
+
// Execute all batches sequentially to avoid overwhelming the database
|
|
210
|
+
for (let i = 0; i < batchPromises.length; i++) {
|
|
211
|
+
await batchPromises[i];
|
|
212
|
+
|
|
213
|
+
// Keep the batch completion messages but don't interrupt progress bar
|
|
214
|
+
if (i < batchPromises.length - 1) {
|
|
215
|
+
// Don't show for the last batch
|
|
216
|
+
tracker.log(
|
|
217
|
+
`Completed batch ${i + 1}/${batchPromises.length} of countries`,
|
|
218
|
+
"success"
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Force garbage collection every 10 batches
|
|
223
|
+
if ((i + 1) % 10 === 0) {
|
|
224
|
+
await MemoryManager.forceGarbageCollectionWithDelay();
|
|
225
|
+
MemoryManager.logMemoryUsage(`After batch ${i + 1}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Repopulate country ID map after bulk operations
|
|
230
|
+
await repopulateCountryIdMap(prisma, filteredCountriesData, regionIdMap);
|
|
231
|
+
|
|
232
|
+
// Store full countryData mapping for all countries even if we filtered
|
|
233
|
+
// This allows subsequent state/city seeders to check which countries to seed
|
|
234
|
+
if (countryNames && countryNames.length > 0) {
|
|
235
|
+
// For non-seeded countries, we need to fetch their IDs from the database
|
|
236
|
+
// to properly populate countryIdMap for the state and city seeders
|
|
237
|
+
const nonSeededCountryData = countriesData.filter(
|
|
238
|
+
(country) => !filteredCountriesData.includes(country)
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
if (nonSeededCountryData.length > 0) {
|
|
242
|
+
const existingCountries = await prisma.country.findMany({
|
|
243
|
+
where: {
|
|
244
|
+
iso3: {
|
|
245
|
+
in: nonSeededCountryData.map((c) => c.iso3),
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
select: { id: true, iso3: true },
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
// Map existing countries to countryIdMap
|
|
252
|
+
for (const existingCountry of existingCountries) {
|
|
253
|
+
const jsonCountry = nonSeededCountryData.find(
|
|
254
|
+
(c) => c.iso3 === existingCountry.iso3
|
|
255
|
+
);
|
|
256
|
+
if (jsonCountry) {
|
|
257
|
+
countryIdMap.set(jsonCountry.id, existingCountry.id);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
logSeederComplete("Countries");
|
|
264
|
+
|
|
265
|
+
// Only disconnect if we created our own client
|
|
266
|
+
if (!prismaClient) {
|
|
267
|
+
await prisma.$disconnect();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return countryIdMap;
|
|
271
|
+
} catch (error) {
|
|
272
|
+
logSeederError("Countries", error);
|
|
273
|
+
|
|
274
|
+
// Only disconnect if we created our own client
|
|
275
|
+
if (!prismaClient) {
|
|
276
|
+
await prisma.$disconnect();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
console.error("Error seeding countries:", error);
|
|
280
|
+
throw error;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { PrismaClient } from "../../src/prisma/index.js";
|
|
2
|
+
import { loadCoreData } from "./utils/json-loader.js";
|
|
3
|
+
import { seedCoreEntity } from "./utils/core-seeder.js";
|
|
4
|
+
|
|
5
|
+
export const seedCurrencies = async (prismaClient) => {
|
|
6
|
+
// Use the passed client or create new one only if needed (for standalone testing)
|
|
7
|
+
const prisma = prismaClient || new PrismaClient();
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
// Load currency data from JSON
|
|
11
|
+
const currencies = loadCoreData("currency");
|
|
12
|
+
|
|
13
|
+
// Process currencies with optimized core seeder
|
|
14
|
+
const result = await seedCoreEntity(
|
|
15
|
+
prisma,
|
|
16
|
+
currencies,
|
|
17
|
+
'currencies',
|
|
18
|
+
{
|
|
19
|
+
model: 'currency',
|
|
20
|
+
whereField: 'code',
|
|
21
|
+
updateFields: ['name', 'symbol', 'is_active'],
|
|
22
|
+
createFields: ['name', 'code', 'symbol', 'is_active']
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
profile: 'stability', // Currencies are critical entities
|
|
26
|
+
enableRetries: true,
|
|
27
|
+
logProgress: true
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
return result;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error(`Failed to seed currencies: ${error.message}`);
|
|
34
|
+
throw error;
|
|
35
|
+
} finally {
|
|
36
|
+
// Only disconnect if we created our own client
|
|
37
|
+
if (!prismaClient) {
|
|
38
|
+
await prisma.$disconnect();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { PrismaClient } from "../../src/prisma/index.js";
|
|
2
|
+
import { loadContentData } from "./utils/json-loader.js";
|
|
3
|
+
import {
|
|
4
|
+
createProgressTracker,
|
|
5
|
+
logSeederStart,
|
|
6
|
+
logSeederComplete,
|
|
7
|
+
logEntityError,
|
|
8
|
+
} from "./utils/progress-tracker.js";
|
|
9
|
+
|
|
10
|
+
export async function seedCustomerNotification(prismaClient) {
|
|
11
|
+
// Use the passed client or create new one only if needed (for standalone testing)
|
|
12
|
+
const prisma = prismaClient || new PrismaClient();
|
|
13
|
+
|
|
14
|
+
logSeederStart("customer notifications");
|
|
15
|
+
|
|
16
|
+
// Load customer notifications from JSON
|
|
17
|
+
const notificationData = loadContentData("customer-notification");
|
|
18
|
+
|
|
19
|
+
// Create progress tracker
|
|
20
|
+
const tracker = createProgressTracker(
|
|
21
|
+
notificationData.length,
|
|
22
|
+
"customer notifications"
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
for (const notification of notificationData) {
|
|
26
|
+
try {
|
|
27
|
+
// Check if the record exists based on unique fields (event + medium)
|
|
28
|
+
const existingNotification = await prisma.customerNotification.findFirst({
|
|
29
|
+
where: {
|
|
30
|
+
event: notification.event,
|
|
31
|
+
medium: notification.medium,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
if (!existingNotification) {
|
|
36
|
+
// Create if the record does not exist
|
|
37
|
+
await prisma.customerNotification.create({
|
|
38
|
+
data: {
|
|
39
|
+
template_name: notification.template_name,
|
|
40
|
+
title: notification.title,
|
|
41
|
+
event: notification.event,
|
|
42
|
+
medium: notification.medium,
|
|
43
|
+
remark: notification.remark,
|
|
44
|
+
template_slug: notification.template_slug,
|
|
45
|
+
trigger_message: notification.trigger_message,
|
|
46
|
+
is_recurring: notification.is_recurring,
|
|
47
|
+
is_active: notification.is_active,
|
|
48
|
+
created_by: notification.created_by,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Information messages now handled differently - only display if really important
|
|
53
|
+
if (tracker.progress % 5 === 0) {
|
|
54
|
+
// Show info message every 5 items
|
|
55
|
+
tracker.log(
|
|
56
|
+
`Created notification for event: ${notification.event}`,
|
|
57
|
+
"info"
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
} else {
|
|
61
|
+
tracker.log(
|
|
62
|
+
`Notification for event ${notification.event} already exists`,
|
|
63
|
+
"info"
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// Log error but don't interrupt progress bar
|
|
68
|
+
logEntityError(
|
|
69
|
+
"customer notification",
|
|
70
|
+
notification.template_name,
|
|
71
|
+
error.message
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
tracker.update();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
logSeederComplete("Customer notifications");
|
|
78
|
+
|
|
79
|
+
// Only disconnect if we created our own client
|
|
80
|
+
if (!prismaClient) {
|
|
81
|
+
await prisma.$disconnect();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PrismaClient } from "../../src/prisma/index.js";
|
|
2
|
+
import { loadCoreData } from "./utils/json-loader.js";
|
|
3
|
+
import { seedCoreEntity } from "./utils/core-seeder.js";
|
|
4
|
+
|
|
5
|
+
export async function seedDepartments(prismaClient) {
|
|
6
|
+
// Use the passed client or create new one only if needed (for standalone testing)
|
|
7
|
+
const prisma = prismaClient || new PrismaClient();
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
// Load departments from JSON
|
|
11
|
+
const departmentData = loadCoreData("departments");
|
|
12
|
+
|
|
13
|
+
// Process departments with optimized core seeder
|
|
14
|
+
const result = await seedCoreEntity(
|
|
15
|
+
prisma,
|
|
16
|
+
departmentData,
|
|
17
|
+
'departments',
|
|
18
|
+
{
|
|
19
|
+
model: 'department',
|
|
20
|
+
whereField: 'department_slug',
|
|
21
|
+
updateFields: ['department_name', 'description', 'is_active'],
|
|
22
|
+
createFields: ['department_name', 'department_slug', 'description', 'is_active']
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
profile: 'stability', // Departments are critical entities
|
|
26
|
+
enableRetries: true,
|
|
27
|
+
logProgress: true
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
return result;
|
|
32
|
+
} finally {
|
|
33
|
+
// Only disconnect if we created our own client
|
|
34
|
+
if (!prismaClient) {
|
|
35
|
+
await prisma.$disconnect();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|