namespace eval ::QW::DATAEASE {} namespace eval ::QW::DATAEASE::IMPORTER {} itcl::class ${::qw::script::namespace}::IMPORTER { inherit itk::Toplevel; protected variable _database ""; protected variable _manager_root ""; protected variable _manager ""; protected variable _status 0; protected variable _import_action ""; protected variable _table; protected variable _file_handle ""; protected variable _error_file_handle ""; protected variable _file_seek 0; protected variable _file_line_number 0; protected variable _file_name ""; protected variable _idDescription ""; protected variable _idprefix ""; protected variable _slashIdPrefix ""; protected variable _current_fiscal_year_end ""; protected variable _contact_begin_date [::qw::date::null]; protected variable _order_begin_date [::qw::date::null]; protected variable _database_directory ""; protected variable _database_path ""; protected variable _import_type ""; protected variable _type_list ""; protected variable _exported_path ""; protected variable _logFileHandle ""; protected variable _errorText ""; protected variable _error_flag 0; protected variable _logFileName "deimport.log"; protected variable _commit_sequence 0; protected variable _commit_limit 100; protected variable _seconds 0; protected variable _stopwatch ""; protected variable _access ""; protected variable _cancelled 0; protected variable _batch_number 0; protected variable _save_audit_state ""; private variable _contactFieldNameArray {}; private variable _contractFieldNameArray {}; private variable _creditcardFieldNameArray {}; private variable _customerFieldNameArray {}; private variable _orderFieldNameArray {}; private variable _orderitemFieldNameArray {}; private variable _productFieldNameArray {}; private variable _serialnumberFieldNameArray {}; protected variable _order_array ""; protected variable _valid_support_reps ""; protected variable _orphan_order_ref ""; protected variable _pre_order_hookup_shutdown_done 0; protected variable _customer_root_address ""; protected variable _supportrep_root_address ""; protected variable _order_root_address ""; protected variable _options ""; protected variable _batch_override 0; protected variable _is_batch 0; protected variable _save_user ""; protected variable _save_session ""; protected variable _is_importing 0; protected variable _order_journal ""; protected variable _hookup_orders_done 0; method debug_puts {Src} { ::if {$::qw::verbose(dataease)} {::puts "IMPORTER::debug: $Src";} } public method status {args} { switch -- [::llength $args] { 0 { ::return $_status; } 1 { ::set _status [::lindex $args 0]; ::update ::if {$_status ne ""} {::puts "IMPORTER::status: $_status";} ::return $this; } } error "Wrong number of args to IMPORTER::status method."; } public method option {Path} {return [::qw::structure::get_poly $_options $Path];} public method options {Options} { ::set _options [::qw::structure::+= $_options $Options]; return $this; } method batch_startup {} { ::set ::qw::control(crm_include) 1; ::set ::qw::control(de_import) 1; ::set ::qw::control(de_import_batch_complete_every_file) 1; ::set _idprefix "001"; ::set _slashIdPrefix "/001"; ::set _idDescription "Dataease"; ::set Args [::string tolower $::argv]; ::set Index [::lsearch -exact $Args "-directory"]; ::if {$Index>=0} {::set _database_path [::string tolower [::file normalize [::lindex $Args [::incr Index]]]];} ::set _database_directory [::string map {"/database.nv2" {}} $_database_path]; ::if {$_database_path eq ""} {import_error "The database path was not specified.";} ::set _exported_path $_database_directory; ::if {![::file exists [::file join $_database_directory "database.nv2"]]} { ::if {[::file exists "$_database_directory/exported.control"]} { ::qw::throw [::qw::structure \ .text "Found file exported.control but no database." \ ]; } ::qw::try { [::qw::odb::factory database] cpp_create [::qw::structure .database_path $_database_path .database_type "application" .access "singleuser"]; ::set _database [::qw::odb::factory database]; ::set _manager $_database; $_database cpp_database_open [::qw::structure .database_path $_database_path .access "singleuser"]; ::if {[$_manager cpp_find "/OBJECT"] eq ""} { ::qw::script::source \ .script.path [::file join $::qw_library object install.qw_script] \ .database $_manager \ .command application \ ; } ::if {[$_manager cpp_find "/OBJECT/SYSTEM/USER"] eq ""} { status "[::file normalize $_database_directory] installing system classes."; ::qw::script::source \ .script.path [::file join $::qw_library object system install.qw_script] \ .database $_manager \ .command application \ ; } ::set ClientdataBefore [$_database cpp_clientdata_get]; ::set ClientdataAfter $ClientdataBefore; ::qw::structure::var::set ClientdataAfter .semiloops_are_allowed 1; $_manager cpp_commit ".odb_commit_before 0"; } catch Exception { ::puts $::errorInfo; import_error "Could not create database: $Exception"; } } else { ::qw::try { ::set _database [::qw::odb::factory database]; ::set _manager $_database; $_database cpp_database_open [::qw::structure .database_path $_database_path .access "singleuser"]; } catch Exception { import_error "Could not open database: $Exception"; } } ::set Path [::file join $_database_directory "exported.control"]; ::if {[::file exists $Path]} { ::set Handle [::open $Path r]; ::set Header [::read $Handle]; ::close $Handle; ::set _file_seek [::qw::structure::get $Header ".seek"]; ::set _file_line_number [::qw::structure::get $Header ".file_line_number"]; ::set _import_type [::qw::structure::get $Header ".import_type"]; ::set _type_list [::qw::structure::get $Header ".type_list"]; ::set _seconds [::qw::structure::get $Header ".seconds"]; ::foreach Name $_table(names) { ::set _table($Name-processed) [::qw::structure::set $Header ".processed.$Name"]; ::set _table($Name-errors) [::qw::structure::set $Header ".errors.$Name"]; ::set _table($Name-items_at_load) [::qw::structure::set $Header ".processed.$Name"]; ::set _table($Name-target) [::qw::structure::set $Header ".target.$Name"]; } ::set _geometry_at_shutdown [::qw::structure::set $Header ".geometry_at_shutdown"] ::array set _timeStats [::qw::structure::set $Header ".timeStats"]; ::array set _order_array [::qw::structure::set $Header ".order_array"]; ::set _orphan_order_ref [::qw::structure::set $Header ".orphan_order_ref"]; ::set _pre_order_hookup_shutdown_done [::qw::structure::set $Header ".pre_order_hookup_shutdown_done"]; ::set _batch_number [::qw::structure::set $Header ".batch_number"]; ::set _order_hookup_total_to_do [::qw::structure::set $Header ".order_hookup_total_to_do"]; ::set _order_hookup_total_processed [::qw::structure::set $Header ".order_hookup_total_processed"]; ::set _order_hookup_total_attached [::qw::structure::set $Header ".order_hookup_total_attached"]; } ::foreach Name $_table(names) { ::set Index [::lsearch -exact $Args "-${Name}-items"]; ::if {$Index<0} {::continue;} ::incr Index; ::set _table(${Name}-items_per_batch) [::lindex $Args $Index]; } ::foreach Name { contact_begin_date order_begin_date } { ::set Index [::lsearch -exact $Args "-${Name}"]; ::if {$Index<0} {::continue;} ::incr Index; ::set _${Name} [::lindex $Args $Index]; } ::return $this; } method batch_shutdown {args} { ::if {$_database ne ""} { $_manager cpp_audit_state_set $_save_audit_state; $_manager cpp_commit ".odb_commit_before 0"; ::set _manager ""; $_database cpp_destroy; ::set _database ""; } ::set ControlFileName [::file join $_database_directory exported.control]; ::set EndFileName [::file join $_database_directory exported.end]; ::if {[::lindex $args 0] eq "DONE"} { ::set Handle [::open $EndFileName w+]; ::puts $Handle "DONE"; ::close $Handle; ::file delete $ControlFileName; ::return; } ::set Header ""; ::if {$_file_handle ne ""} { ::qw::structure::var::set Header ".seek" [::tell $_file_handle]; } else { ::qw::structure::var::set Header ".seek" 0; } ::qw::structure::var::set Header ".file_line_number" $_file_line_number ::qw::structure::var::set Header ".import_type" $_import_type; ::qw::structure::var::set Header ".type_list" $_type_list; ::qw::structure::var::set Header ".seconds" [::expr {[$_stopwatch seconds]+$_seconds}]; ::qw::structure::var::set Header ".geometry_at_shutdown" [::winfo geometry $itk_component(hull)]; ::qw::structure::var::set Header ".timeStats" [::array get _timeStats]; ::qw::structure::var::set Header ".order_array" [::array get _order_array]; ::qw::structure::var::set Header ".orphan_order_ref" $_orphan_order_ref; ::qw::structure::var::set Header ".batch_number" $_batch_number; ::qw::structure::var::set Header ".pre_order_hookup_shutdown_done" $_pre_order_hookup_shutdown_done; ::qw::structure::var::set Header ".order_hookup_total_to_do" $_order_hookup_total_to_do; ::qw::structure::var::set Header ".order_hookup_total_processed" $_order_hookup_total_processed; ::qw::structure::var::set Header ".order_hookup_total_attached" $_order_hookup_total_attached; ::if {$_file_handle ne ""} {::close $_file_handle;} ::foreach Name $_table(names) { ::qw::structure::var::set Header ".processed.$Name" $_table($Name-processed); ::qw::structure::var::set Header ".target.$Name" $_table($Name-target); ::qw::structure::var::set Header ".errors.$Name" $_table($Name-errors); } ::set Handle [::open $ControlFileName w+]; ::puts -nonewline $Handle [::qw::structure::format $Header]; ::close $Handle; ::qw::shutdown; } method import_error {Src} { ::set Handle [::open [::file join $_database_directory "exported.error"] w+]; ::puts -nonewline $Handle $Src; ::close $Handle; ::qw::throw $Src; } method increment {VarName {Increment 1}} { ::incr _table($VarName) $Increment; ::update; } public method database_directory {} {::return $_destination;} public method tableNames {} {::return $_table(names);} public method constructor {args} { ::set _is_batch 0; ::set _options [::qw::structure::+= $::qw::widget::default [::subst { /header {} /table {} /status {} /button {} }]]; buildFieldNameArrays; ::array set _table { contact-description "Contacts" contract-description "Support Contracts" creditcard-description "Credit Cards" customer-description "Customers" order-description "Orders" orderitem-description "Order Items" product-description "Products" serialnumber-description "Serial Numbers" supportrep-description "Support Reps" topic-description "Contact Topics" order_hookup-description "Order Hookups" } ::array set _table { contact-filename "contacts.ins" contract-filename "contract.ins" creditcard-filename "creditca.ins" customer-filename "custfile.ins" order-filename "qorder1.ins" orderitem-filename "qitem1.ins" product-filename "products.ins" serialnumber-filename "serial.ins" supportrep-filename "" topic-filename "" order_hookup-filename "Order Hookups" } ::array set _table { contact-errorfilename "contacts.err" contract-errorfilename "contract.err" creditcard-errorfilename "creditca.err" customer-errorfilename "custfile.err" order-errorfilename "qorder1.err" orderitem-errorfilename "qitem1.err" product-errorfilename "products.err" serialnumber-errorfilename "serial.err" supportrep-errorfilename "" topic-errorfilename "" order_hookup-errorfilename "" } ::set _table(names) ""; ::lappend _table(names) "customer"; ::lappend _table(names) "contact"; ::lappend _table(names) "contract"; ::lappend _table(names) "creditcard"; ::lappend _table(names) "product"; ::lappend _table(names) "order"; ::lappend _table(names) "orderitem"; ::lappend _table(names) "serialnumber"; ::lappend _table(names) "supportrep"; ::lappend _table(names) "topic"; ::lappend _table(names) "order_hookup"; ::foreach Name $_table(names) { ::set _table($Name-errors) 0; ::set _table($Name-processed) 0; ::set _table($Name-target) 0; ::set _table($Name-doit) 1; ::set _table($Name-items_per_batch) 1000; ::set _table($Name-items_at_load) 0; } ::set _table(_errors) 0; ::set _table(_warnings) 0; ::set _batch_override 0; ::unset -nocomplain _order_array; ::set _valid_support_reps { SALES MCGRATH PARFETT BEZEMER OLDFIELD QURESHI TERSIGNI BORENSTE BONE DOOKIE SMITH GORDON ALCAIDE GARRETT DEPOOTER CLARIDGE SHIPPING HALPIN GOLDEN LYN SCHAPPLER PETERS }; ::set LabelBorderWidth 0.5m; ::set ControlPadding 1m; ::set Me $itk_interior; ::frame $Me.table; ::frame $Me.controls -height 2 -borderwidth 1m -relief sunken; ::button $Me.controls.action -borderwidth $ControlPadding -font [option /button.font]; ::button $Me.controls.help -text Help -borderwidth $ControlPadding -command [::list ::qwhelp -webpageid 314120010102170123] -font [option /button.font]; ::label $Me.status -textvariable "@itcl $this _status" -relief sunken -borderwidth $LabelBorderWidth -anchor w -font [option /status.font]; ::pack $Me.table -expand yes -fill both -padx 4 -pady 4; ::pack $Me.controls -expand no -fill x -padx $ControlPadding -pady $ControlPadding; ::pack $Me.controls.action -side left -expand yes -fill x -padx $ControlPadding -pady $ControlPadding; ::pack $Me.controls.help -side left -expand yes -fill x -padx $ControlPadding -pady $ControlPadding; ::pack $Me.status -fill x -padx 4 -pady 4; ::wm group $itk_component(hull) .; ::label $Me.table._titlelabel -text "Type" -font [option /header.font] -relief raised -borderwidth $LabelBorderWidth -width 22 -anchor c ::label $Me.table._titletarget -text "Count" -font [option /header.font] -relief raised -borderwidth $LabelBorderWidth -width 11 -anchor c ::label $Me.table._titleitems -text "Done" -font [option /header.font] -relief raised -borderwidth $LabelBorderWidth -width 11 -anchor c ::label $Me.table._titleerrors -text "Errors" -font [option /header.font] -relief raised -borderwidth $LabelBorderWidth -width 11 -anchor c ::label $Me.table._titlecompletion -text "Percent Done" -font [option /header.font] -relief raised -borderwidth $LabelBorderWidth -width 30 -anchor c ::set Row 0; ::set Column 0; ::grid $Me.table._titlelabel -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table._titletarget -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table._titleitems -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table._titleerrors -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table._titlecompletion -row $Row -column $Column -sticky ewns;::incr Column; ::incr Row; ::foreach Name [tableNames] { ::label $Me.table.${Name}label -text [::set "@itcl $this _table($Name-description)"] -font [option /table.font] -relief sunken -borderwidth $LabelBorderWidth -width 22 -anchor e; ::label $Me.table.${Name}target -textvariable "@itcl $this _table($Name-target)" -font [option /table.font] -relief sunken -borderwidth $LabelBorderWidth -width 11 -anchor e; ::label $Me.table.${Name}items -textvariable "@itcl $this _table($Name-processed)" -font [option /table.font] -relief sunken -borderwidth $LabelBorderWidth -width 11 -anchor e; ::label $Me.table.${Name}errors -textvariable "@itcl $this _table($Name-errors)" -font [option /table.font] -relief sunken -borderwidth $LabelBorderWidth -width 11 -anchor e; ::QW::WIDGET::COMPLETION_PERCENTAGE $Me.table.${Name}completion -limitvariable "@itcl $this _table($Name-target)" -valuevariable "@itcl $this _table($Name-processed)"; ::set Column 0; ::grid $Me.table.${Name}label -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table.${Name}target -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table.${Name}items -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table.${Name}errors -row $Row -column $Column -sticky ewns;::incr Column; ::grid $Me.table.${Name}completion -row $Row -column $Column -sticky ewns;::incr Column; ::grid rowconfigure $Me.table $Row -weight 1; ::incr Row; } ::grid columnconfigure $Me.table 0 -weight 1; ::grid columnconfigure $Me.table 1 -weight 1; ::grid columnconfigure $Me.table 2 -weight 1; ::grid columnconfigure $Me.table 3 -weight 1; ::grid columnconfigure $Me.table 4 -weight 1; ::eval itk_initialize $args; ::set _batch_number 0; ::array set Args $::argv; ::if {[::info exists Args(-mode)]&&$Args(-mode) eq "batch"} { ::set _is_batch 1; batch_startup; ::incr _batch_number; } else { ::if {![::info exists ::qw::script::env(manager)]||$::qw::script::env(manager) eq ""} {::qw::throw "[::info script] should be run from a NewViews database.";} ::set _manager $::qw::script::env(manager); } ::set _database [$_manager cpp_database]; ::set _access [$_database cpp_access]; ::set _database_directory [$_database cpp_directory]; ::set _database_directory [::string map {"/database.nv2" {}} $_database_directory]; ::set _exported_path $_database_directory; ::foreach Type { contact contract creditcard customer order orderitem product serialnumber } { ::set FileName $_table($Type-filename); ::if {![::file exists [::file join $_database_directory $FileName]]} { ::set _exported_path ""; ::break; } } ::if {$_is_batch} { ::wm withdraw . ::qw::status::destroy; import; ::return $this; } ::if {$_exported_path eq ""} { $Me.controls.action configure -text "Press to select exported file." -command [::itcl::code $this directory_select] configure -title "Ready to select exported file." status "Ready to select exported file ..." } else { $Me.controls.action configure -text "Press to begin import." -borderwidth $ControlPadding -command [::itcl::code $this import] -font [option /button.font]; configure -title "Ready to import DataEase data." status "Ready to import DataEase data into $_database_directory ..." } ::wm protocol $itk_component(hull) WM_DELETE_WINDOW [::list ::qw::itcl_delete_object $this;]; ::focus $Me.controls.action; ::bind $Me.controls.action "$Me.controls.action invoke"; ::return $this; } public method destructor {} { ::if {$_stopwatch ne ""} {::qw::itcl_delete_object $_stopwatch;} } method update {} {::update} method manager {} {return $_manager;} protected method centerOnScreen {} { ::update idletasks; ::set Width [::winfo reqwidth $itk_component(hull)] ::set Height [::winfo reqheight $itk_component(hull)] ::set x [::expr ([::winfo screenwidth $itk_component(hull)]-$Width)/2] ::set y [::expr ([::winfo screenheight $itk_component(hull)]-$Height)/2] ::wm minsize $itk_component(hull) $Width $Height ::wm geometry $itk_component(hull) +$x+$y ::return $this; } protected method directory_select {} { if {![::string length [::QW::ENVIRONMENT::get ".application.newviews.legacy.nv1import.directory"]]} { ::QW::ENVIRONMENT::set ".application.newviews.legacy.nv1import.directory" c:/nv/desmall; } ::set _exported_path [::qw::dialog::file .title "Select exported data file." .files 1 .default [::file join $_database_directory exported]]; ::if {![::string length $_exported_path]} {::return "";} ::QW::ENVIRONMENT::set ".application.newviews.legacy.nv1import.directory" $_exported_path; ::raise $itk_component(hull); ::set Me $itk_interior; $Me.controls.action configure -text "Import the Data" -command [::itcl::code $this import]; } public method dismiss {} { ::if {$_is_batch} { status "Shutting down..."; batch_shutdown "DONE"; ::qw::shutdown ::return; } ::qw::itcl_delete_object $this; } protected method commit {Object {s_args ""}} { $Object odb_commit $s_args; ::incr _commit_sequence; ::if {$_commit_sequence>=$_commit_limit} { $_manager cpp_commit; ::set _commit_sequence 0; } $_manager cpp_ping; } method batch_complete {} { ::qw::throw ".text {The end of a batch was reached.} .id batch_complete"; } method batch_check {} { ::if {!$_is_batch} {::return;} ::if {$_batch_override} {::return;} ::set LoadItems $_table(${_import_type}-items_at_load); ::set BatchItems $_table(${_import_type}-items_per_batch); ::set Items $_table(${_import_type}-processed); ::if {[::expr $Items-$LoadItems]<$BatchItems} {::return;} batch_complete; } protected method import_files {} { ::while {1} { ::set _import_type [::lindex $_type_list 0] ::if {$_import_type eq ""} {::break;} ::if {$_import_action ne "count" &&$_table($_import_type-processed)==$_table($_import_type-target)} { ::set _type_list [::lrange $_type_list 1 end]; ::if {$::qw::control(de_import_batch_complete_every_file)} { batch_complete; } ::continue; } ::set _file_name [::file join $_exported_path $_table(${_import_type}-filename)]; source $_file_name; ::if {$_import_action ne "count" &&$::qw::control(de_import_batch_complete_every_file)} { ::set _type_list [::lrange $_type_list 1 end]; batch_complete; } ::set _type_list [::lrange $_type_list 1 end]; } } method deleteErrorFiles {} { ::foreach Name $_type_list { ::if {![::info exists _table(${Name}-errorFileName)]} {::continue;} ::set FileName [::file join $_exported_path $_table(${_import_type}-errorfilename)]; ::if {![::file exists $FileName]} {::continue;} ::file delete $FileName; } } method writeErrorRecord {Src} { ::if {$_import_action eq "process"} {::return;} ::if {[::catch {::set ErrorFileHandle [::open [::file join $_exported_path $_table(${_import_type}-errorfilename)] a]} ErrorText]} { ::qw::throw "Could not open error file; $ErrorText"; } ::puts $ErrorFileHandle $Src\n; ::close $ErrorFileHandle; } method reportErrors {} { ::foreach Name $_type_list { ::if {![::info exists _table(${Name}-errors)]} {::continue;} importError "$_table(${Name}-errors) errors in $Name file."; } } method source {Path} { ::set _error_flag 0; ::qw::try { ::if {$_file_handle eq ""} { ::set _file_handle [::open $Path r]; ::seek $_file_handle $_file_seek; } else { ::seek $_file_handle 0; } ::array set Record {}; ::set RawRecord ""; ::set RecordHasData 0; ::while {[::gets $_file_handle Data]>=0} { ::incr _file_line_number; ::set Data [::string trim $Data]; ::if {$Data eq ""} { ::if {$RecordHasData} { ::if {$_error_flag} { ::if {$_import_action ne "process"} { writeErrorRecord $RawRecord; ::incr _table(${_import_type}-errors); } } else { ::eval ${_import_type}_$_import_action [::array get Record]; } ::array unset Record; ::set RawRecord ""; ::set RecordHasData 0; ::set _error_flag 0; } ::continue; } ::set DEFieldName [::string tolower [::lindex [::split $Data " "] 0]]; ::set ArrayName _${_import_type}FieldNameArray; ::set FieldData [::string trim [::string range $Data [::string length $DEFieldName] end]]; ::append RawRecord "[::format %12d $_file_line_number] $DEFieldName $Data\n"; ::if {![::info exists ${ArrayName}($DEFieldName-nvName)]} {::qw::throw "Unknown DataEase field name \"$DEFieldName\" at line $_file_line_number";} ::set FieldType [::subst $${ArrayName}($DEFieldName-type)]; ::if {$FieldType ne "ignore"} { ::set NVFieldName [::subst $${ArrayName}($DEFieldName-nvName)]; ::set FieldData [checkData $DEFieldName $FieldType $FieldData]; ::set Record($NVFieldName) $FieldData; ::set RecordHasData 1; } } ::close $_file_handle; ::set _file_handle ""; ::set _file_seek 0; ::set _file_line_number 0; } catch Exception { ::puts $::errorInfo; ::qw::throw $Exception; } } protected method import {} { ::if {!$_is_batch&&[[$_manager cpp_database] cpp_access] ne "singleuser"} { ::set Result [::qw::dialog::confirm [::qw::list { .title "Proceed with import?" \ .text "Database $_database_directory is open with multiuser access.\nLarge batch-oriented operations are faster with singleuser access.\n\nProceed with the import now?\nOr cancel and import the data later." /button { /ok { .text "Proceed" } /cancel { .text "Cancel" } } }]]; ::if {!$Result} { ::qw::itcl_delete_object $this; ::return; } } ::set _save_user [$_manager cpp_user_get]; ::set _save_session [$_manager cpp_session_get]; ::set _save_audit_state [$_manager cpp_audit_state_get]; $_manager cpp_audit_state_set "disabled"; configure -title "[::string tolower [::file normalize $_database_directory]] importing DataEase data."; $_manager cpp_user_set ""; $_manager cpp_session_set ""; $itk_interior.controls.action configure -text Abort -command [::itcl::code $this abort]; ::qw::try { ::set _is_importing 1; ::set _stopwatch [::QW::STOPWATCH #auto]; logMessage "Import DataEase data from $_exported_path into database $_database_directory"; ::if {!$_is_batch \ ||[$_manager cpp_find "/OBJECT/DATAEASE"] eq "" \ ||![::file exists "$_database_directory/exported.control"] \ } { ::set _import_action "count"; status "Counting and checking import objects ..."; read_topic_codes; ::set _type_list { customer contact contract creditcard product order orderitem serialnumber } load_order_array; status "Counting and checking import objects ..."; deleteErrorFiles; import_files; ::set _type_list { customer contact contract creditcard product order orderitem serialnumber } } ::if {[$_manager cpp_find "/OBJECT/NEWVIEWS"] eq ""} { logMessage "Installing Newviews classes"; ::qw::script::source \ .script.path [::file join $::qw_library object newviews install.qw_script] \ .database $_manager \ .command application \ ; } ::if {[$_manager cpp_find "/OBJECT/NEWVIEWS/PAYROLL"] eq ""} { logMessage "Installing Payroll classes"; ::qw::script::source \ .script.path [::file join $::qw_library object newviews payroll install.qw_script] \ .database $_manager \ .command application \ ; } ::if {[$_manager cpp_find "/OBJECT/NEWVIEWS/PAYROLL/CANADA"] eq ""} { logMessage "Installing Canada Payroll classes"; ::qw::script::source \ .script.path [::file join $::qw_library object newviews payroll canada install.qw_script] \ .database $_manager \ .command application \ ; } ::if {[$_manager cpp_find "/OBJECT/DATAEASE"] eq ""} { logMessage "Installing DataEase classes"; ::qw::script::source \ .script.path [::file join $::qw_library object newviews payroll usa install.qw_script] \ .database $_manager \ .command application \ ; } setup_invoice_information; setup_trade_taxes; ;#// create GST and PST accounts, set defaults for .../JOURNAL/SALES and .../ACCOUNT/SALES ::if {$::qw::control(summary_posting)} { setup_summary_posting_dates; } ::if {[$_manager cpp_find "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE/ACTIVE"] eq ""} { ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE.odb_deriveds"] odb_factory -odb_id "/ACTIVE"]; [$Master ".name"] odb_set "ACTIVE"; [$Master ".description"] odb_set "Active"; [$Master ".folder"] odb_set "folder"; [$Master ".active"] odb_set "active"; $Master odb_commit; ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE.odb_deriveds"] odb_factory -odb_id "/INACTIVE"]; [$Master ".name"] odb_set "INACTIVE"; [$Master ".description"] odb_set "Inactive 5 years"; [$Master ".folder"] odb_set "folder"; [$Master ".active"] odb_set "active"; #// until the import is finished $Master odb_commit; batch_complete; } ::set _import_action "process"; read_topic_codes; import_files; hookup_orders; create_users; sales_accounts_prices_set; ;#// set sales price to value of last item sold old_customers_active_separate_folder; ;#// move active customers (postings in the last x years) to active folder status "Committing /OBJECT/DATAEASE..."; [$_manager "/OBJECT/DATAEASE"] odb_commit; ::set DataEaseClientdata [$_manager "/OBJECT/DATAEASE.clientdata"]; ::set Clientdata [$DataEaseClientdata qw_get]; ::qw::structure::var::set Clientdata ".import.date" [::qw::date::from_number clock_seconds [::clock seconds]]; $DataEaseClientdata qw_set $Clientdata; status "Committing object database manager ..." $_manager cpp_commit ".odb_commit_before 0"; $_manager cpp_audit_state_set $_save_audit_state; $_manager cpp_user_set $_save_user; $_manager cpp_session_set $_save_session; ::if {$_is_batch} { status "Closing database ..."; $_database cpp_destroy; ::set _database ""; } $itk_interior.controls.action configure -text "Dismiss" -command [::itcl::code $this dismiss]; ::set TotalSeconds [::expr [$_stopwatch seconds]+$_seconds]; ::if {$_table(_errors)==0&&$_table(_warnings)==0} { status "Import completed successfully in $TotalSeconds seconds."; } else { status "Import completed with $_table(_errors) errors and $_table(_warnings) warnings in $TotalSeconds seconds."; } ::set _is_importing 0; logMessage "Import time: $TotalSeconds seconds"; ::if {$_logFileHandle ne ""} {::close $_logFileHandle;} ::return $this; } catch Exception { importError "$Exception $::errorInfo"; ::puts "import error: $Exception" ::if {[::qw::structure::select_name_value [::qw::structure .structure $Exception .name ".id" .value "batch_complete"]] ne ""} { status "The import reached the end of the batch." batch_shutdown; ::return $this; } status "Aborting object database manager ..." ::set _is_importing 0; $_manager cpp_user_set $_save_user; $_manager cpp_session_set $_save_session; $_manager cpp_audit_state_set $_save_audit_state; $itk_interior.controls.action configure -text "Dismiss" -command [::itcl::code $this dismiss]; ::qw::throw [::qw::exception::parent $Exception "The import has been stopped."]; ::if {[::qw::structure::select_name_value [::qw::structure .structure $Exception .name ".priority" .value "abort"]] ne ""} { ::raise $itk_component(hull); status "User aborted the import and rolled back all work in progress." ::return $this; } status "Aborted the import due to an error and rolled back all work in progress." ::eval ::qw::dialog::error [::qw::exception \ "Encountered an error while importing newviews data into $_database_directory." \ "Aborted the import and rolled back all work in progress." \ $Exception ]; ::raise $itk_component(hull); ::return $this; } } public method create_users {} { ::set Index [$_manager "/OBJECT/DATAEASE/SUPPORTREP.odb_deriveds.index/name"]; ::for {::set Ref [$Index odb_first];} {$Ref ne ""} {::set Ref [$Index odb_next $Ref];} { ::set Rep [$Ref odb_master]; ::set Name [[$Rep ".name"] odb_get]; ::if {$Name eq "ADMINISTRATOR"} {::continue;} ::set User [[$_manager "/OBJECT/SYSTEM/USER.odb_deriveds"] odb_factory]; [$User ".name"] odb_set $Name [$User ".description"] odb_set [::string totitle $Name]; [$User ".access_view"] odb_set "yes"; [$User ".audit_view"] odb_set "yes"; [$User ".options.date.entry"] odb_set "ddmmyyyy"; commit $User; ::set Access [[$_manager "/OBJECT/SYSTEM/ACCESS.odb_deriveds"] odb_factory]; [$Access ".object"] odb_set [$_manager "/OBJECT.access_froms"]; [$Access ".user"] odb_set [$User ".access_tos"]; [$Access ".folder"] odb_set "folder"; commit $Access; status "Created user $Name"; } ::set Names ""; ::lappend Names "QUACKENP";::lappend Names "Phil Quackenbush"; ::lappend Names "QUACKENH";::lappend Names "Helen Quackenbush"; ::lappend Names "QUACKENK";::lappend Names "Kyle Quackenbush"; ::lappend Names "BENNRON"; ::lappend Names "Ron Benn"; ::lappend Names "PETERSJA";::lappend Names "Jack Peters"; ::lappend Names "PETERSCH";::lappend Names "Christine Peters"; ::lappend Names "PETERSLI";::lappend Names "Lindsay Peters"; } method buildFieldNameArrays {} { ::catch {::unset _customerFieldNameArray};::array set _customerFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { company# string .customer_number nvserial# string .serial_number phone# string .address.phone.freeform fax string .address.phone/fax.freeform date_entered date .date_entered first pString .address.name.first last pString .address.name.last email string .address.email inet string .address.website company pString .address.company street pString .address.street street2 pString .address.street2 city pString .address.city state string .address.state country string .address.country zip string .address.zipcode shipstreet pString .address/shipping.street shipstreet2 pString .address/shipping.street2 shipcity pString .address/shipping.city shipstate string .address/shipping.state shipcountry string .address/shipping.country shipzip string .address/shipping.zipcode user1 bool .user1 reguser bool .reguser incorrect_address bool .incorrect_address reseller bool .reseller dealer bool .dealer var1 bool .var1 cc1 bool .cc1 approval_date date .approval_date atc1 bool .atc1 ap1 bool .ap1 dead bool .dead disk string .disksize bustype pString .business_type number_of_employees string .number_of_employees currency string .currency busdesc pString .business_description referral bool .referral source pString .referral_source notes ignore .ignore freewin bool .free_windows_upgrade free_upgrade string .free_windows_upgrade_reason payplan bool .on_payroll_plan ship string .payroll_plan_ship_method begdate2 date .payroll_plan_begin_date enddate2 date .payroll_plan_end_date cour2 pString .payroll_plan_courier_name cour string .payroll_plan_courier_account contract# string .support_plan_contract_number begdate date .support_plan_begin_date enddate date .support_plan_end_date tottime number .support_plan_time_used protime number .support_plan_projected_time long:notes1 string .notes.1 long:notes2 string .notes.2 long:notes3 string .notes.3 long:notes4 string .notes.4 nvaccount string .newviews_account region string .region type_of_account string .type_of_account nv2amp bool .nv2_upgrades_plan nv2sp bool .nv2_support_plan nv2lic number .nv2_licences method string .payroll_plan_ship_method begdate3 ignore .ignore enddate3 ignore .ignore } { ::set _customerFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _customerFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _contactFieldNameArray};::array set _contactFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { company# string .customer dateopen string .date starttime string .starttime rep string .supportrep l1 string .l1 l2code string .l2code l2 string .l2 l3code string .l3code l3 string .l3 l4code string .l4code l4 string .l4 endtime string .endtime elapsed ignore ignore tminutes ignore ignore long:notes string .notes1 long:notes2 string .notes2 long:notes3 string .notes3 long:notes4 string .notes4 long:notes5 string .notes5 } { ::set _contactFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _contactFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _orderFieldNameArray};::array set _orderFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { company# string .customer person string .ordered_by company string .company_name phone# string .phone_number order# number .order invoice_date date .invoice_date employee string .taken_by order_date date .order_date terms string .terms courier string .courier waybill# string .waybill_number shipdate date .shipped_date cmsg string .message entered_by string .entered_by } { ::set _orderFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _orderFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _orderitemFieldNameArray};::array set _orderitemFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { order# number .order shipdate date .ship_date item# number .item quantity number .quantity product# string .product_code description string .order_description amount number .amount currency string .currency serial#1 string .serial1 serial#2 string .serial2 serial#3 string .serial3 serial#4 string .serial4 serial#5 string .serial5 month number .month year number .year } { ::set _orderitemFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _orderitemFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _productFieldNameArray};::array set _productFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { product# string .name product_description string .description active bool .active } { ::set _productFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _productFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _creditcardFieldNameArray};::array set _creditcardFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { company# string .customer american_express# string .amex amex_expiry_date# date .amex_expiry_date visa# string .visa visa_expiry_date date .visa_expiry_date master_card# string .mastercard mc_expiry_date date .mastercard_expiry_date salestax# string .sales_tax_number fax# string .fax_number } { ::set _creditcardFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _creditcardFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _serialnumberFieldNameArray};::array set _serialnumberFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { serial# string .serial_number date_entered date .date old_serial# string .old_serial_number company# string .customer date_updated2 date .date_updated purchase_date date .date_purchased computer string .computer order# string .order vendor_co# string .vendor vendor string .vendor_description } { ::set _serialnumberFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _serialnumberFieldNameArray($DEFieldName-type) $FieldType; } ::catch {::unset _contractFieldNameArray};::array set _contractFieldNameArray {}; ::foreach {DEFieldName FieldType NVFieldName} { date date .date sent string .sent type string .type contract# string .contract_number company# string .customer nvserial# string .serial_number } { ::set _contractFieldNameArray($DEFieldName-nvName) $NVFieldName; ::set _contractFieldNameArray($DEFieldName-type) $FieldType; } } method importError {Src} { ::puts "importError: $Src"; logMessage "Error: $Src"; ::incr _table(_errors); } method importWarning {Src} { ::puts "importWarning: $Src"; logMessage "Warning: $Src"; ::incr _table(_warnings); } method logMessage {Src} { ::if {$_logFileHandle eq ""} { ::if {[::catch {::set _logFileHandle [::open [::file join $_exported_path $_logFileName] a]} ErrorText]} { ::qw::throw "Could not open log file; $ErrorText"; } ::puts $_logFileHandle [::string repeat "-" 60]; } ::puts $_logFileHandle $Src; ::flush $_logFileHandle; } method contact_count {args} { ::if {![::eval contact_date_within_limit $args]} {::return;} increment contact-target; } method contract_count {args} {increment contract-target;} method creditcard_count {args} { ::array set Args $args; ::foreach Type {amex visa mastercard} { ::if {$Args(.$Type) ne ""} {increment creditcard-target;} } } method customer_count {args} {increment customer-target;} method order_count {args} { ::if {![::eval order_date_within_limit $args]} {::return;} increment order-target; increment order_hookup-target; } method orderitem_count {args} {increment orderitem-target;} method product_count {args} {increment product-target;} method serialnumber_count {args} {increment serialnumber-target;} method contact_date_within_limit {args} { ::if {$_contact_begin_date eq [::qw::date::null]} {::return 1;} ::array set Args $args; ::if {![::info exists Args(.date)]} {::return 1;} ::set Date $Args(.date); ::if {[::catch {::set Date [dataease_date_to_ymdhms $Date]} ErrorText]} {::return 1;} ::if {$Date eq [::qw::date::null]} {::return 1;} ::if {[::qw::date::difference $Date $_contact_begin_date "day"]<0} {::return 0;} ::if {[::qw::date::difference $Date "19700101" "day"]<0} {::return 0;} ::return 1; } method order_date_within_limit {args} { ::if {$_order_begin_date eq [::qw::date::null]} {::return 1;} ::array set Args $args; ::if {![::info exists Args(.order_date)]} {::return 1;} ::set Date $Args(.order_date); ::if {$Date eq [::qw::date::null]} {::return 1;} ::if {[::qw::date::difference $Date $_order_begin_date "day"]<0} {::return 0;} ::if {[::qw::date::difference $Date "19700101" "day"]<0} {::return 0;} ::return 1; } public method is_valid_support_rep {Src} { ::if {[::lsearch -exact $_valid_support_reps [::string toupper $Src]]<0} {::return 0;} ::return 1; } method contact_process {args} { ::if {![::eval contact_date_within_limit $args]} {::return;} ::set CustomerNumber ""; ::set Customer ""; ::set SupportRep ""; ::set ErrorFlag 0; ::set Date ""; ::set StartTime ""; ::set EndTime ""; ::array set NotesArray {1 {} 2 {} 3 {} 4 {} 5 {}}; ::foreach {Name Value} $args { ::switch $Name { ".notes1" { ::set NotesArray(1) [::string trim $Value]; ::continue; } ".notes2" { ::set NotesArray(2) [::string trim $Value]; ::continue; } ".notes3" { ::set NotesArray(3) [::string trim $Value]; ::continue; } ".notes4" { ::set NotesArray(4) [::string trim $Value]; ::continue; } ".notes5" { ::set NotesArray(5) [::string trim $Value]; ::continue; } ".date" { ::set Date $Value; ::continue; } ".starttime" { ::set StartTime $Value; ::continue; } ".endtime" { ::set EndTime $Value; ::continue; } ".customer" { ::set CustomerNumber $Value; ::if {[::regexp -- {^[0-9]+$} $CustomerNumber]} { ::set Customer [customer_get $Value]; ::if {$Customer eq ""} { importWarning "Had to create customer $Value for contact record [::expr $_table(contact-processed)+1], Data: $args"; ::set Customer [customer_get $Value 1]; } } else { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: Invalid customer number \"$CustomerNumber\", Data: $args"; ::set ErrorFlag 1; } } ".supportrep" { ::if {[isStringValid $Value]} { ::if {$Value eq ""} {::set Value "-none-";} else {::set Value [::string tolower $Value];} ::set SupportRep [supportrep_get $Value]; ::if {$SupportRep eq ""} { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: $_errorText Data: $args"; ::set ErrorFlag 1; } } else { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: Invalid support rep value \"$Value\", Data: $args"; ::set ErrorFlag 1; } } } } ::if {$Date eq ""} { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: No Date. Data: $args"; ::set ErrorFlag 1; } ::if {$StartTime eq ""} { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: No start time. Data: $args"; ::set ErrorFlag 1; } ::if {$EndTime eq ""} { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: No end time. Data: $args"; ::set ErrorFlag 1; } ::if {$ErrorFlag} { increment contact-errors; ::return; } ::if {[::catch {::set date [dataease_date_to_ymdhms $Date $StartTime]} ErrorText]} { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: $ErrorText. Data: $args"; ::set ErrorFlag 1; } ::if {[::catch {::set time_end [dataease_date_to_ymdhms $Date $EndTime]} ErrorText]} { importError "Could not import contact record [::expr $_table(contact-processed)+1], Error: $ErrorText. Data: $args"; ::set ErrorFlag 1; } ::if {$ErrorFlag} { increment contact-errors; ::return; } ::set Journal [[[[$_manager "/OBJECT/NEWVIEWS/JOURNAL/GENERAL"] ".odb_deriveds.index/name"] odb_find_key .name "CONTACTS"] odb_master]; ::set Master [[[$Journal ".transactions"] odb_factory_reference] odb_master]; ::foreach {Name Value} $args { ::switch $Name { ".l1" {[$Master ".l1"] odb_set [::string toupper $Value]} ".l2" {[$Master ".l2"] odb_set [::string toupper $Value]} ".l3" {[$Master ".l3"] odb_set [::string toupper $Value]} ".l4" {[$Master ".l4"] odb_set [::string toupper $Value]} ".l2code" {[$Master ".l2code"] odb_set [::string toupper $Value]} ".l3code" {[$Master ".l3code"] odb_set [::string toupper $Value]} ".l4code" {[$Master ".l4code"] odb_set [::string toupper $Value]} ".customer" {} ".supportrep" {} ".date" {} ".starttime" {} ".endtime" {} ".notes1" {} ".notes2" {} ".notes3" {} ".notes4" {} ".notes5" {} default { [$Master "$Name"] odb_set $Value; } } } [$Master ".posting/debit.account"] odb_set [$Customer ".postings"]; [$Master ".supportrep"] odb_set [$SupportRep ".contacts"]; [$Master ".date"] odb_set $date; [$Master ".time_start"] odb_set $date; [$Master ".time_end"] odb_set $time_end; ::set Notes ""; ::for {::set i 1} {$i<=5} {::incr i;} { ::if {$NotesArray($i) eq ""} {::continue;} ::if {$Notes ne ""} {::append Notes " ";} ::append Notes $NotesArray($i); } ::if {$Notes ne ""} {[$Master ".notes"] odb_set $Notes;} commit $Master; status "Contact: $CustomerNumber" increment contact-processed; batch_check; } method customer_process {args} { ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE/INACTIVE.odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "file"; ::set CustomerNumber ""; ::set Company ""; ::array set NotesArray {1 {} 2 {} 3 {} 4 {}}; ::foreach {Name Value} $args { ::switch $Name { ".notes.1" { ::set NotesArray(1) [::string trim $Value]; ::continue; } ".notes.2" { ::set NotesArray(2) [::string trim $Value]; ::continue; } ".notes.3" { ::set NotesArray(3) [::string trim $Value]; ::continue; } ".notes.4" { ::set NotesArray(4) [::string trim $Value]; ::continue; } ".customer_number" { ::set CustomerNumber $Value; ::if {[[[customer_root_get] ".odb_deriveds.index/name"] odb_find_key .name $Value] ne ""} { importWarning "Discarding duplicate customer \"$Value\"."; $Master odb_commit; $Master odb_destroy; increment customer-processed; return; }; [$Master ".name"] odb_set $Value; } ".address.company" { ::set Company $Value; [$Master ".address.company"] odb_set $Value; [$Master ".description"] odb_set $Value; } ".support_plan_contract_number" { ::if {[::string first "EXPIRED" [::string toupper $Value]]==-1} { [$Master "$Name"] odb_set $Value; } } ".address.phone.freeform" - ".address.phone/fax.freeform" { ::set Value [::string map {( "" ) ""} $Value]; [$Master "$Name"] odb_set $Value; } default { [$Master "$Name"] odb_set $Value; } } } ::if {$CustomerNumber eq ""} {::qw::throw ".customer_number field is null in record \"$args\"";} ::set Notes ""; ::for {::set i 1} {$i<=4} {::incr i;} { ::if {$NotesArray($i) eq ""} {::continue;} ::if {$Notes ne ""} {::append Notes "\n";} ::append Notes $NotesArray($i); } ::if {$Notes ne ""} {[$Master ".notes"] odb_set $Notes;} ::set Country [::string toupper [[$Master ".address.country"] odb_get]]; ::set State [::string toupper [[$Master ".address.state"] odb_get]]; ::set Tax1 "no"; ::set Tax2 "no"; ::switch -- [::string range $Country 0 1] { "CA" { ::set Tax1 "yes"; ::switch -- [::string range $State 0 1] { "" {importWarning "No state/province found in customer $CustomerNumber";} "ON" {::set Tax2 "yes";} } } "" {importWarning "No country found in customer $CustomerNumber";} } [$Master ".trade_tax/1.is_charged"] odb_set $Tax1; [$Master ".trade_tax/2.is_charged"] odb_set $Tax2; commit $Master; status "Customer: $CustomerNumber, $Company"; increment customer-processed; batch_check; } method load_order_array {} { status "Loading orderinf.ins"; ::set Count1 0; ::set Count2 0; ::set FileName [::file join $_exported_path orderinf.ins]; ::set Handle [::open $FileName r]; ::while {[::gets $Handle RawData]>=0} { ::set Data [::string trim $RawData]; ::if {$Data eq ""} {::continue;} ::if {![::string is integer [::string index $Data 0]]} {::continue;} ::if {[::llength $Data]<3} {::continue;} ::set CustomerName [::lrange $Data 2 end]; ::if {[::string range $CustomerName 0 1] eq ". "} {::continue;} ::set Customer [::lindex $Data 0]; ::set Order [::lindex $Data 1]; ::set Order [::string trimleft $Order "0"]; ::lappend _order_array($Order) $Customer; ::incr Count1; ::incr Count2; ::if {$Count2>=1000} { status "Loading orderinf.ins $Count1"; ::set Count2 0; } } status "Order info loaded, $Count1 items in _order_array"; } method batch_check_order_hookup {} { ::set BatchLimit $_table(order_hookup-items_per_batch); ::incr _order_hookup_batch_count; ::if {$_order_hookup_batch_count<$BatchLimit} {::return;} batch_complete; } protected variable _order_hookup_batch_count 0; protected variable _order_hookup_total_to_do 0; protected variable _order_hookup_total_processed 0; protected variable _order_hookup_total_attached 0; method hookup_orders {} { ::if {$_hookup_orders_done} {::return;} ::set OphanOrderCustomer [customer_get "ORPHANED-ORDERS"]; ::if {$OphanOrderCustomer eq ""} { status "Customer ORPHANED-ORDERS not found, so no orphaned orders to process"; ::set _hookup_orders_done 1; ::return; } ::set PostingIndex [$OphanOrderCustomer ".postings.index/date"]; ::if {!$_pre_order_hookup_shutdown_done} { ::set _order_hookup_total_to_do [$PostingIndex odb_items]; ::set Postings [$PostingIndex odb_masters .order_is_kept 1]; ::foreach Posting $Postings { ::if {[::string first "/OBJECT/NEWVIEWS/SYSTEM/SUMMARY_POSTING" [$Posting odb_path]]<0} { ::break; } ::incr _order_hookup_total_to_do -1; ::incr _order_hookup_total_to_do [[[$Posting ".postings"] odb_primary] odb_items]; } ::set _pre_order_hookup_shutdown_done 1; } ::if {$_order_hookup_total_processed==0} { status "Order hookup start" status "Total orders: $_order_hookup_total_to_do"; } else { status "Order hookup continues" status "\tTotal Orders: $_order_hookup_total_to_do"; status "\tOrders Processed: $_order_hookup_total_processed"; status "\tOrders Attached: $_order_hookup_total_attached"; status "\tOrders Remaining: [::expr $_order_hookup_total_to_do-$_order_hookup_total_processed]"; } ::set _import_type "order_hookup"; ::set _order_hookup_batch_count 0; ::if {$_orphan_order_ref eq ""} { ::set Ref [$PostingIndex odb_first]; } else { ::set Ref $_orphan_order_ref; } ::for {;} {$Ref ne ""} {::set Ref [$PostingIndex odb_next $Ref];} { status ""; ::set _orphan_order_ref [$PostingIndex odb_next $Ref]; ::set Transaction [$Ref odb_master]; ::if {[::string first "/OBJECT/NEWVIEWS/SYSTEM/SUMMARY_POSTING" [$Transaction odb_path]]==0} { ::foreach Posting [[[$Transaction ".postings"] odb_primary] odb_masters .order_is_kept 1] { ::incr _order_hookup_total_processed; hookup_orders_summary_posting_fix [$Posting odb_master]; } ::continue; } ::incr _order_hookup_total_processed; hookup_orders_summary_posting_fix $Transaction; } status "Order processing end:"; status "\tTotal Orders: $_order_hookup_total_to_do"; status "\tOrders Processed: $_order_hookup_total_processed"; status "\tOrders Attached: $_order_hookup_total_attached"; status "\tOrders Remaining: [::expr $_order_hookup_total_to_do-$_order_hookup_total_attached]"; ::set _hookup_orders_done 1; } method hookup_orders_summary_posting_fix {Transaction} { ::array set SerialNumberArray {}; ::set Reference [[$Transaction ".reference"] odb_get]; ::set DerivedsIndex [$Transaction ".odb_deriveds.index/id"]; ::set Items [$DerivedsIndex odb_masters]; status ""; status "Order $Reference"; ::if {[::llength $Items]==0} { status "Order $Reference has no deriveds to obtain serial# from."; increment order_hookup-errors 1; batch_check_order_hookup; ::return; } ::array unset SerialNumberArray; ::foreach Item $Items { ::set Notes [[[$Item odb_master] ".notes"] odb_get]; ::foreach Number {1 2 3 4 5} { ::set Serial [::string trim [::qw::structure::get $Notes ".serial$Number"]] ; ::if {$Serial ne "" && $Serial ne "?"} {::set SerialNumberArray($Serial) 1;} } } ::set SerialNumbers [::array names SerialNumberArray]; ::if {[::llength $SerialNumbers]>1} { status "Order $Reference has [::llength $Items] item(s), but references [::llength $SerialNumbers] serial numbers: $SerialNumbers"; increment order_hookup-errors 1; batch_check_order_hookup; ::return; } ::set CustomerRef ""; ::set Customer ""; ::if {[::llength $SerialNumbers]==1} { ::set SerialNumber [::lindex [::array names SerialNumberArray] 0]; ::set CustomerRef [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE.odb_deriveds.index/serial_number"] odb_find_key .serial_number $SerialNumber]; ::if {$CustomerRef ne ""} { ::set Customer [$CustomerRef odb_master]; status "Order $Reference attached to customer [[$Customer .name] odb_get] by serial# $SerialNumber."; } else { status "Order $Reference has [::llength $Items] item(s), but no customer with serial# $SerialNumber was found."; } } else { status "Order $Reference has [::llength $Items] item(s), but no serial numbers."; } ::if {$CustomerRef eq ""} { ::set InvoiceInformation [[$Transaction ".invoice_information"] odb_get]; ::set CompanyName [::qw::structure::get $InvoiceInformation "/14.value"]; ::if {[::string range $CompanyName 0 1] eq ". "} {::set CompanyName [::string range $CompanyName 2 end];} ::set CompanyName [makeStringProper $CompanyName]; ::set CustomerRef [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE.odb_deriveds.index/description_closure"] odb_find_key .description_closure $CompanyName]; ::if {$CustomerRef ne ""} { ::set Customer [$CustomerRef odb_master]; status "Order $Reference attached to customer [[$Customer .name] odb_get] by name $CompanyName."; } } ::if {$CustomerRef eq ""} { ::set PhoneNumber [::qw::structure::get $InvoiceInformation "/2.value"]; ::set PhoneNumber [::string map {( "" ) ""} $PhoneNumber]; ::if {$PhoneNumber ne ""} { ::set CustomerRef [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE.odb_deriveds.index/address_inner_phone_inner_freeform"] odb_find_key .address_inner_phone_inner_freeform $PhoneNumber]; ::if {$CustomerRef ne ""} { ::set Customer [$CustomerRef odb_master]; status "Order $Reference attached to customer [[$Customer .name] odb_get] by phone number $PhoneNumber."; } else { status "Order $Reference - no customer with phone \"$PhoneNumber\" found."; } } } ::if {$CustomerRef eq ""} { status "Order $Reference could not be attached to a customer."; increment order_hookup-errors 1; batch_check_order_hookup; ::return; } [$Transaction ".posting/debit/customer.account"] odb_set [$Customer ".postings"]; commit $Transaction; increment order_hookup-processed; ::incr _order_hookup_total_attached; batch_check_order_hookup; ::return; } method order_journal_get {} { ::if {$_order_journal ne ""} {::return $_order_journal;} ::set Journal [[$_manager "/OBJECT/NEWVIEWS/JOURNAL/SALES.odb_deriveds.index/name"] odb_find_key ".name" "SI"]; ::if {$Journal ne ""} { ::set _order_journal [$Journal odb_master]; ::return $_order_journal; } ::set Journal [[$_manager "/OBJECT/NEWVIEWS/JOURNAL/SALES.odb_deriveds"] odb_factory]; [$Journal ".name"] odb_set "SI"; [$Journal ".description"] odb_set "Q.W. Page"; [$Journal ".tags"] odb_set "financial"; commit $Journal; ::set _order_journal $Journal; ::return $_order_journal; } protected method setup_invoice_information {} { ::set Master [order_journal_get]; ::set Master [$_manager "/OBJECT/NEWVIEWS/JOURNAL/SALES"]; ::set InvoiceInfo [[$Master ".invoice_information"] qw_get]; ::qw::structure::var::set InvoiceInfo "/1.name" "Ordered By"; ::qw::structure::var::set InvoiceInfo "/2.name" "Phone Number"; ::qw::structure::var::set InvoiceInfo "/3.name" "Order Number"; ::qw::structure::var::set InvoiceInfo "/4.name" "Invoice Date"; ::qw::structure::var::set InvoiceInfo "/5.name" "Taken By"; ::qw::structure::var::set InvoiceInfo "/6.name" "Order Date"; ::qw::structure::var::set InvoiceInfo "/7.name" "Payment Type"; ::qw::structure::var::set InvoiceInfo "/8.name" "Ship Method"; ::qw::structure::var::set InvoiceInfo "/9.name" "Waybill No."; ::qw::structure::var::set InvoiceInfo "/10.name" "Shipped Date"; ::qw::structure::var::set InvoiceInfo "/11.name" "Message"; ::qw::structure::var::set InvoiceInfo "/12.name" "Entered By"; ::qw::structure::var::set InvoiceInfo "/13.name" "NV1 AR Account"; ::qw::structure::var::set InvoiceInfo "/14.name" "Company Name"; ::qw::structure::var::set InvoiceInfo "/15.name" "Credit Card Number"; ::qw::structure::var::set InvoiceInfo "/16.name" "Credit Card Type"; ::qw::structure::var::set InvoiceInfo "/17.name" "Credit Card Expires"; ::qw::structure::var::set InvoiceInfo "/18.name" "Credit Card Name"; ::qw::structure::var::set InvoiceInfo "/19.name" "Credit Card Authorization"; [$Master ".invoice_information"] odb_set $InvoiceInfo; commit $Master; } protected method setup_trade_taxes {} { ::set Tax1Account [account_get [::qw::structure .name "GST_PAYABLE" .type "GENERAL" .description "GST Payable" .create "1"]]; [$Tax1Account ".normal_balance"] odb_set "credit"; $Tax1Account odb_commit; ::set Tax2Account [account_get [::qw::structure .name "PST_PAYABLE" .type "GENERAL" .description "PST Payable" .create "1"]]; [$Tax2Account ".normal_balance"] odb_set "credit"; $Tax2Account odb_commit; ::set Journal [$_manager "/OBJECT/NEWVIEWS/JOURNAL/SALES"]; [$Journal ".trade_tax/1.description"] odb_set "GST"; [$Journal ".trade_tax/1.is_charged"] odb_set "yes"; [$Journal ".trade_tax/1.payable_account"] odb_set $Tax1Account; [$Journal ".trade_tax/1.status"] odb_set "taxable"; [$Journal ".trade_tax/1.rate"] odb_set "7"; [$Journal ".trade_tax/2.description"] odb_set "PST"; [$Journal ".trade_tax/2.is_charged"] odb_set "yes"; [$Journal ".trade_tax/2.payable_account"] odb_set $Tax2Account; [$Journal ".trade_tax/2.status"] odb_set "taxable"; [$Journal ".trade_tax/2.rate"] odb_set "8"; [$Journal ".trade_tax/2.is_compounded"] odb_set "no"; $Journal odb_commit; ::set Account [$_manager "/OBJECT/NEWVIEWS/ACCOUNT/SALES"]; [$Account ".trade_tax/1.payable_account"] odb_set $Tax1Account; [$Account ".trade_tax/1.status"] odb_set "taxable"; [$Account ".trade_tax/1.rate"] odb_set "7"; [$Account ".trade_tax/2.payable_account"] odb_set $Tax2Account; [$Account ".trade_tax/2.status"] odb_set "taxable"; [$Account ".trade_tax/2.rate"] odb_set "8"; $Account odb_commit; ::return void; } ::if {$::qw::control(summary_posting)} { protected method setup_summary_posting_dates {} { ::set Master [$_manager "/OBJECT/NEWVIEWS/ODDS_AND_ENDS"]; ::if {[[$Master ".summary_posting_date_setup"] odb_get] ne ""} { ::return void; } ::set Dates [summary_posting_date_list]; ::qw::structure::var::set DateSetup ".opening" [::lindex $Dates 0]; ::switch 6 { 0 { ::return void; } 1 { ::qw::structure::var::set DateSetup ".year" [::lindex $Dates 8]; } 2 { ::qw::structure::var::set DateSetup ".year" [::lindex $Dates 7]; ::qw::structure::var::set DateSetup ".month" [::lindex $Dates 8]; } 3 { ::qw::structure::var::set DateSetup ".year" [::lindex $Dates 6]; ::qw::structure::var::set DateSetup ".month" [::lindex $Dates 8]; } 4 { ::qw::structure::var::set DateSetup ".year" [::lindex $Dates 8]; ::qw::structure::var::set DateSetup ".month" [::lindex $Dates 20]; } 5 { ::qw::structure::var::set DateSetup ".year" [::lindex $Dates 8]; ::qw::structure::var::set DateSetup ".month" [::lindex $Dates 17]; } 6 { ::qw::structure::var::set DateSetup ".year" [::lindex $Dates 6]; ::qw::structure::var::set DateSetup ".month" [::lindex $Dates 8]; } } [$Master ".summary_posting_date_setup"] odb_set $DateSetup; $Master odb_commit; ::return void; } method summary_posting_date_list {} { ::set DateList ""; ::set HistoryPeriodsList ""; ::if {$_current_fiscal_year_end eq ""} { ::set _current_fiscal_year_end "20091031"; } ::set Begin ""; ::set End [::qw::date::add $_current_fiscal_year_end year -10]; ::set End [::qw::date::set $End day [::qw::date::get $End "days_in_month"]]; ::set End [::string range $End 0 7]; ::lappend HistoryPeriodsList [::list ".begin" $Begin ".end" $End]; ::for {::set i 0} {$i<8} {::incr i;} { ::set End [::qw::date::add $End year 1]; ::set End [::qw::date::set $End day [::qw::date::get $End "days_in_month"]]; ::set Begin [::qw::date::add $End day 1]; ::set Begin [::qw::date::add $Begin year -1]; ::set Begin [::string range $Begin 0 7]; ::set End [::string range $End 0 7]; ::lappend HistoryPeriodsList [::list ".begin" $Begin ".end" $End]; } ::for {::set i 0} {$i<36} {::incr i;} { ::set End [::qw::date::add $End month 1]; ::set End [::qw::date::set $End day [::qw::date::get $End "days_in_month"]]; ::set Begin [::qw::date::set $End day 1]; ::set Begin [::string range $Begin 0 7]; ::set End [::string range $End 0 7]; ::lappend HistoryPeriodsList [::list ".begin" $Begin ".end" $End]; } ::foreach BooksPeriod $HistoryPeriodsList { ::lappend DateList [::qw::date::extend_end [::qw::structure::get $BooksPeriod ".end"]]; } ::return [::lrange $DateList 0 20]; } } method order_process {args} { ::if {![::eval order_date_within_limit $args]} {::return;} ::set Customer ""; ::set CompanyName ""; ::set ErrorFlag 0; ::array set Args $args ::if {![::info exists Args(.order)]} { importError "Could not import order record [::expr $_table(order-processed)+1], Error: .order not specified. Data: $args"; ::return } ::set OrderNumber $Args(.order); ::if {$OrderNumber eq ""} { importError "Could not import order record [::expr $_table(order-processed)+1], Error: .order is \"\". Data: $args"; ::return } ::set Master [[$_manager "/OBJECT/NEWVIEWS/SYSTEM/TRANSACTION/SALES.odb_deriveds"] odb_factory]; [$Master ".journal"] odb_set [[order_journal_get] ".transactions"]; [$Master ".folder"] odb_set "file"; ::set Notes ""; ::set CustomerNumber "ORPHANED-ORDERS"; ::if {[::info exists _order_array($OrderNumber)]} { ::if {[::llength $CustomerNumber]==1} { ::set CustomerNumber $_order_array($OrderNumber); increment order_hookup-processed; ::unset _order_array($OrderNumber); } } ::set Customer [customer_get $CustomerNumber]; ::if {$Customer eq ""} { importWarning "Had to create customer $CustomerNumber for order record [::expr $_table(order-processed)+1], Data: $args"; ::set Customer [customer_get $CustomerNumber 1]; } [$Master ".posting/debit/customer.account"] odb_set [$Customer ".postings"]; ::foreach {Name Value} $args { ::qw::structure::var::set Notes $Name $Value; ::switch $Name { ".order" { ::set OrderNumber $Value; [$Master ".reference"] odb_set $Value; } ".customer" { } ".company_name" { ::set CompanyName $Value; [$Master ".description"] odb_set $Value; } ".order_date" { [$Master ".date"] odb_set $Value; } ".ordered_by" - ".phone_number" - ".invoice_date" - ".taken_by" - ".terms" - ".courier" - ".waybill_number" - ".shipped_date" - ".message" - ".entered_by" {} default { [$Master "$Name"] odb_set $Value; } } } ::set InvoiceInfo [[$Master ".invoice_information"] qw_get]; ::foreach {Name Value} $args { ::switch $Name { ".ordered_by" {::qw::structure::var::set InvoiceInfo "/1.value" $Value;} ".phone_number" {::qw::structure::var::set InvoiceInfo "/2.value" $Value;} ".order" {::qw::structure::var::set InvoiceInfo "/3.value" $Value;} ".invoice_date" {::qw::structure::var::set InvoiceInfo "/4.value" $Value;} ".taken_by" {::qw::structure::var::set InvoiceInfo "/5.value" $Value;} ".order_date" {::qw::structure::var::set InvoiceInfo "/6.value" $Value;} ".terms" {::qw::structure::var::set InvoiceInfo "/7.value" $Value;} ".courier" {::qw::structure::var::set InvoiceInfo "/8.value" $Value;} ".waybill_number" {::qw::structure::var::set InvoiceInfo "/9.value" $Value;} ".shipped_date" {::qw::structure::var::set InvoiceInfo "/10.value" $Value;} ".message" {::qw::structure::var::set InvoiceInfo "/11.value" $Value;} ".entered_by" {::qw::structure::var::set InvoiceInfo "/12.value" $Value;} ".customer" {::qw::structure::var::set InvoiceInfo "/13.value" $Value;} ".company_name" {::qw::structure::var::set InvoiceInfo "/14.value" $Value;} } } [$Master ".invoice_information"] odb_set $InvoiceInfo; commit $Master; status "Order: $OrderNumber Customer: $CustomerNumber" increment order-processed; batch_check; ::return $Master; } method order_get {Order {Create {0}}} { ::if {$Order eq ""} { ::set _errorText "Order number is null"; ::return ""; } ::set OrderRoot [[order_journal_get] .transactions.index/reference]; ::set Result [$OrderRoot odb_find_key .tag financial .reference $Order]; ::if {$Result eq ""} { ::if {$Create} { increment order-target; ::set _batch_override 1; order_process .customer "*none*" .order $Order; ::set _batch_override 0; ::set Result [$OrderRoot odb_find_key .tag financial .reference $Order]; } else { ::set _errorText "Order \"$Order\" not found."; ::return ""; } } ::set Result [$Result odb_master]; ::return $Result; } method orderitem_process {args} { ::set ErrorFlag 0; ::set OrderNumber ""; ::array set Args $args; ::if {![::info exists Args(.order)]} { importError "Could not import order item record [::expr $_table(orderitem-processed)+1], Error: .order not specified. Data: $args"; ::return; } ::set OrderNumber $Args(.order); ::if {$OrderNumber eq ""} { importError "Could not import order item record [::expr $_table(orderitem-processed)+1], Error: .order is \"\". Data: $args"; ::return; } ::set Order [order_get $OrderNumber]; ::if {$Order eq ""} { ::if {$_order_begin_date ne [::qw::date::null]} { ::return; } importWarning "Had to create order $OrderNumber for order item record [::expr $_table(orderitem-processed)+1], Data: $args"; ::set Order [order_get $OrderNumber 1]; } ::set Master [[$Order ".odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "file"; ::set ProductCode ""; ::set ProductDescription ""; ::set Quantity ""; ::set Amount ""; ::set Notes ""; ::set ShipDate [::qw::date::null]; ::foreach {Name Value} $args { ::qw::structure::var::set Notes $Name $Value; ::switch $Name { ".order" { ::set OrderNumber $Value; } ".quantity" { ::set Quantity $Value; } ".amount" { ::set Amount $Value; } ".product_code" { ::set ProductCode $Value } ".order_description" { ::set ProductDescription $Value [$Master ".description"] odb_set $Value; } .serial1 - .serial2 - .serial3 - .serial4 - .serial5 {} .ship_date {::set ShipDate $Value;} .item - .order_description - .currency - .month - .year { } default { [$Master "$Name"] odb_set $Value; } } } ::if {[[$Order ".date"] odb_get] eq [::qw::date::null] && $ShipDate ne [::qw::date::null]} { [$Order ".date"] odb_set $ShipDate; } ::if {$ProductCode ne ""} { ::set Account [account_get [::qw::structure .name $ProductCode .description $ProductDescription .type "SALES" .create 0]]; ::if {$Account eq ""} { importWarning "Had to create SALES account $ProductCode for order item record [::expr $_table(orderitem-processed)+1], Data: $args"; ::set Account [account_get [::qw::structure .name $ProductCode .description $ProductDescription .type "SALES" .create 1]]; } } else { importWarning "Product code missing for order item record [::expr $_table(orderitem-processed)+1], Data: $args"; ::set Account [account_get [::qw::structure .type "SALES" .name "*NONE*" .description $ProductDescription .create 1]]; } [$Master ".posting/credit/charge.account"] odb_set [$Account ".postings"]; ::set Amount [::qw::number::scan $Amount]; ::set Quantity [::qw::number::scan $Quantity]; ::set Price 0.0; ::if {$Amount!=0.0} { ::if {$Quantity!=0.0} { ::set Price [::format %.2f [::qw::number::round2 [::expr $Amount/$Quantity]]]; } } [$Master ".posting/credit/charge.quantity"] odb_set [::qw::number::negative $Quantity]; [$Master ".posting/credit/charge.rate"] odb_set $Price; [$Master ".posting/credit/charge.amount"] odb_set [::qw::number::negative $Amount]; [$Master ".notes"] odb_set [::qw::structure::format $Notes]; ;#// for debugging commit $Master; status "Order item: $OrderNumber $ProductCode $Quantity x $Price = $Amount" increment orderitem-processed; batch_check; } method product_process {args} { ::puts "product_process _slashIdPrefix==$_slashIdPrefix args==$args"; ::if {[$_manager cpp_find "/OBJECT/NEWVIEWS/ACCOUNT/SALES$_slashIdPrefix"] eq ""} { ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/SALES.odb_deriveds"] odb_factory -odb_id $_slashIdPrefix]; [$Master ".name"] odb_set $_idprefix; [$Master ".description"] odb_set $_idDescription; [$Master ".folder"] odb_set "folder"; $Master odb_commit; ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/INVENTORY.odb_deriveds"] odb_factory -odb_id $_slashIdPrefix]; [$Master ".name"] odb_set $_idprefix; [$Master ".description"] odb_set $_idDescription; [$Master ".folder"] odb_set "folder"; $Master odb_commit; ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/CGS.odb_deriveds"] odb_factory -odb_id $_slashIdPrefix]; [$Master ".name"] odb_set $_idprefix; [$Master ".description"] odb_set $_idDescription; [$Master ".folder"] odb_set "folder"; $Master odb_commit; } ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/SALES$_slashIdPrefix.odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "file"; ::set Description ""; ::foreach {Name Value} $args { ::switch $Name { ".description" { ::set Description $Value; [$Master "$Name"] odb_set $Value; } ".name" { ::set AccountName $Value; [$Master "$Name"] odb_set $Value; } ".active" { ::if {$Value eq ""||![::string is boolean $Value]} { ::set Value "yes"; } ::if {$Value} { ::set Value "active"; } else { ::set Value "inactive"; } ::set Value "active"; [$Master ".active"] odb_set $Value; } default { [$Master "$Name"] odb_set $Value; } } } ::if {0} { ::set CGSAccount [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/CGS$_slashIdPrefix.odb_deriveds"] odb_factory]; [$CGSAccount ".name"] odb_set $AccountName; [$CGSAccount ".description"] odb_set $Description; [$CGSAccount ".folder"] odb_set "file"; commit $CGSAccount; ::set InventoryAccount [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/INVENTORY$_slashIdPrefix.odb_deriveds"] odb_factory]; [$InventoryAccount ".name"] odb_set $AccountName; [$InventoryAccount ".description"] odb_set $Description; [$InventoryAccount ".folder"] odb_set "file"; commit $InventoryAccount; [$Master ".cgs_account"] odb_set $CGSAccount; [$Master ".inventory_account"] odb_set $InventoryAccount; } commit $Master; status "Product: $Description" increment product-processed; batch_check; } method sales_accounts_prices_set {} { ::itcl::local ::QW::STOPWATCH StopWatch; ::set Index1 [$_manager "/OBJECT/NEWVIEWS/ACCOUNT/SALES$_slashIdPrefix.odb_deriveds.index/name"]; ::for {::set Ref1 [$Index1 odb_first];} {$Ref1 ne ""} {::set Ref1 [$Index1 odb_next $Ref1];} { ::set Account [$Ref1 odb_master]; ::set AccountName [[$Account .name] odb_get]; ::set Index2 [$Account ".postings.index/date"]; ::set Ref2 [$Index2 odb_last]; ::if {$Ref2 eq ""} { importWarning "Could not set price for ACCOUNT/SALES $AccountName, account contains no postings."; ::continue; } ::set Price 0.0; ::for {} {$Ref2 ne ""} {::set Ref2 [$Index2 odb_prev $Ref2]} { ::set Posting [$Ref2 odb_outer]; ::set Price [[$Posting ".rate"] odb_get]; ::if {$Price==0.0} { ::continue; } [$Account ".price"] odb_set $Price; $Account odb_commit; status "Sales account $AccountName price set to $Price." ::break; } ::if {$Price==0.0} { importWarning "Could not set price for ACCOUNT/SALES $AccountName, no posting contains a price."; } } } method old_customers_active_separate_folder {} { ::set Active [$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE/ACTIVE"]; ::set Inactive [$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE/INACTIVE"]; ::set Accounts [[$Inactive ".odb_deriveds.index/name"] odb_masters]; ::set Range [::qw::odb::factory range]; ::qw::finally [::list $Range cpp_destroy]; ::set Begin [::qw::date::extend_begin "20031101"]; ;#// 5 years ::set End [::qw::date::extend_end "20091031"]; ::foreach Account $Accounts { status "ACCOUNT/AR/QWPAGE [[$Account .name] odb_get] checking active status." $Range cpp_configure -index [$Account ".postings.index/date"]; $Range cpp_configure -begin ".tag contact .date $Begin"; $Range cpp_configure -end ".tag contact .date $End"; ::set Contacts [$Range odb_items]; $Range cpp_configure -begin ".tag financial .date $Begin"; $Range cpp_configure -end ".tag financial .date $End"; ::if {$Contacts>0||[$Range odb_items]>0} { importWarning "Set ACCOUNT/AR/QWPAGE [[$Account .name] odb_get] active - postings in the last 5 years."; [$Account ".odb_base"] odb_set [$Active ".odb_deriveds"]; $Account odb_commit; } } [$Inactive ".active"] odb_set "inactive"; $Inactive odb_commit; } method account_get {s_args} { ::set Name [::qw::structure::get $s_args ".name"]; ::set Type [::qw::structure::get $s_args ".type"] ::if {[$_manager cpp_find "/OBJECT/NEWVIEWS/ACCOUNT/$Type$_slashIdPrefix"] eq ""} { ::set Master [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/$Type.odb_deriveds"] odb_factory -odb_id $_slashIdPrefix]; [$Master ".name"] odb_set $_idprefix; [$Master ".description"] odb_set $_idDescription; [$Master ".folder"] odb_set "folder"; $Master odb_commit; } ::set Account [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/$Type$_slashIdPrefix.odb_deriveds.index/name"] odb_find_key ".name" $Name]; ::if {$Account ne ""} { ::return [$Account odb_master]; } ::if {![::qw::structure::get $s_args ".create"]} {::return "";} ::set Account [[$_manager "/OBJECT/NEWVIEWS/ACCOUNT/$Type$_slashIdPrefix.odb_deriveds"] odb_factory]; [$Account ".name"] odb_set $Name; [$Account ".description"] odb_set [::qw::structure::get $s_args ".description"]; commit $Account; ::return $Account; } method creditcard_process {args} { ::array set Args $args; ::foreach Type {amex visa mastercard} { ::if {$Args(.$Type) ne ""} { ::set Master [[$_manager "/OBJECT/DATAEASE/CREDITCARD.odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "file"; ::set CustomerNumber $Args(.customer); ::set Customer [customer_get $CustomerNumber]; ::if {$Customer eq ""} { importWarning "Had to create customer $CustomerNumber for credit card record [::expr $_table(creditcard-processed)+1], Data: $args"; ::set Customer [customer_get $CustomerNumber 1]; } [$Master ".customer"] odb_set [$Customer ".creditcards"]; [$Master ".issuer"] odb_set $Type; [$Master ".number"] odb_set $Args(.$Type); [$Master ".expiry_date"] odb_set $Args(.$Type\_expiry_date); [$Master ".sales_tax_number"] odb_set $Args(.sales_tax_number); [$Master ".fax_number"] odb_set $Args(.fax_number); ::if {$Args(.customer) eq ""} {::qw::throw ".customer field is null in record \"$args\"";} commit $Master; status "Credit card: Issurer: $Type Number: $Args(.$Type)" increment creditcard-processed; } } batch_check; } method serialnumber_process {args} { ::set Master [[$_manager "/OBJECT/DATAEASE/SERIALNUMBER.odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "file"; ::set Description ""; ::foreach {Name Value} $args { ::switch $Name { ".serial_number" { ::set Description $Value; ::if {[[[$Master odb_base] ".odb_deriveds.index/name"] odb_find_key ".name" $Value] eq ""} { [$Master ".name"] odb_set $Value; } [$Master "$Name"] odb_set $Value; } ".customer" { ::if {$Value eq ""} { ::set Value "*none*"; importWarning "Customer number is empty (using *none*) in serial number record [::expr $_table(serialnumber-processed)+1], Data: $args"; ::set Customer [customer_get $Value 1]; } else { ::set Customer [customer_get $Value]; } ::if {$Customer eq ""} { importWarning "Had to create customer $Value for serial number record [::expr $_table(serialnumber-processed)+1], Data: $args"; ::set Customer [customer_get $Value 1]; } [$Master ".customer"] odb_set [$Customer ".serialnumbers"]; } default { [$Master "$Name"] odb_set $Value; } } } commit $Master; status "Serial number: $Description" increment serialnumber-processed; batch_check; } method contract_process {args} { ::set Master [[$_manager "/OBJECT/DATAEASE/CONTRACT.odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "file"; ::set Description ""; ::foreach {Name Value} $args { ::switch $Name { ".contract_number" { ::set Description $Value; ::if {[[[$Master odb_base] ".odb_deriveds.index/name"] odb_find_key ".name" $Value] eq ""} { [$Master ".name"] odb_set $Value; } [$Master "$Name"] odb_set $Value; } ".customer" { ::set Customer [customer_get $Value]; ::if {$Customer eq ""} { importWarning "Had to create customer $Value for contract record [::expr $_table(contract-processed)+1], Data: $args"; ::set Customer [customer_get $Value 1]; } [$Master ".customer"] odb_set [$Customer ".contracts"]; } ".type" { ::switch $Value { "1" {::set Value "premium";} "2" {::set Value "accountant";} "3" {::set Value "reseller";} "4" {::set Value "basic";} "5" {::set Value "nv2";} default {::set Value "";} } [$Master "$Name"] odb_set $Value; } default { [$Master "$Name"] odb_set $Value; } } } ::if {$Description eq ""} {::qw::throw ".contract_number field is null in record \"$args\"";} commit $Master; status "Contract: $Description" increment contract-processed; batch_check; } method supportrep_get {Code {Create {1}}} { ::set Code [::string toupper $Code]; ::set Result [[supportrep_root_get] .odb_deriveds.index/name]; ::set Result [$Result odb_find_key .name $Code]; ::if {$Result ne ""} {::return [$Result odb_master];} ::if {!$Create} {::return "";} ::if {![is_valid_support_rep $Code]} { ::set _errorText "Invalid support rep \"$Code\""; ::return ""; } ::set Result [[$_manager "/OBJECT/DATAEASE/SUPPORTREP.odb_deriveds"] odb_factory]; [$Result ".folder"] odb_set "file"; [$Result ".name"] odb_set $Code; [$Result ".rep_name.last"] odb_set [::string totitle $Code]; commit $Result; status "Created supportrep $Code" increment supportrep-target; increment supportrep-processed; ::return $Result; } method supportrep_root_get {} { ::if {$_supportrep_root_address eq ""} { ::set _supportrep_root_address [[$_manager "/OBJECT/DATAEASE/SUPPORTREP"] odb_address]; } ::return [$_manager cpp_load $_supportrep_root_address]; } method customer_get {Number {Create {0}}} { ::if {$Number eq ""} { ::set _errorText "Customer number is null"; ::return ""; } ::set Reference [[[customer_root_get] ".odb_deriveds.index/name"] odb_find_key .name $Number]; ::if {$Reference eq ""} { ::if {$Create} { increment customer-target; ::set _batch_override 1; customer_process .customer_number $Number .address.company *unknown*; ::set _batch_override 0; ::set Reference [[[customer_root_get] ".odb_deriveds.index/name"] odb_find_key .name $Number]; } else { ::set _errorText "Customer \"$Number\" not found."; ::return ""; } } ::return [$Reference odb_master]; } method customer_root_get {} { ::if {$_customer_root_address eq ""} { ::set _customer_root_address [$_manager "/OBJECT/NEWVIEWS/ACCOUNT/AR/QWPAGE/INACTIVE"]; } ::set Result [$_manager cpp_load $_customer_root_address]; ::return $Result; } method topics_import {} { ::return; ::foreach L1Topic { {SUP Support 1} {UPD Update 3} {SAL Sales 2} {FX1 Fax1 1} {FX2 Fax2 1} {SUX ? 1} {INF ? {}} {SUPR {Support Refused} 7} {SUP$ {Support Pay-Per-Call} 1} {SER Service 6} } { ::set Name [::lindex $L1Topic 0]; ::set Description [::lindex $L1Topic 1]; ::set Node [::lindex $L1Topic 2]; ::set Master [[$_manager "/OBJECT/DATAEASE/CONTACT.odb_deriveds"] odb_factory]; [$Master ".folder"] odb_set "folder"; [$Master ".name"] odb_set $Name; [$Master ".description"] odb_set $Description; commit $Master; } } method read_topic_codes {} { ::set TopicStructure ""; ::foreach Level {2 3 4} { ::qw::try { ::set FileName [::file join $_exported_path L$Level.ins]; ::set Handle [::open $FileName r]; ::set Code ""; ::set Description ""; ::qw::structure::var::set _topic_codes /$Level {}; ::while {[::gets $Handle Data]>=0} { ::set Data [::string trim $Data]; ::if {$Data eq ""} { ::if {$Code eq "" || $Description eq ""} {::continue;} ::qw::structure::var::set TopicStructure /[::join [::split $Code ""] /].name $Description; ::set Code ""; ::set Description ""; ::continue; } ::set String [::lindex [::split $Data " "] 0]; ::set Remainder [::string trim [::string range $Data [::string length $String] end]]; ::if {$String eq "L${Level}CODE"} { ::set Code $Remainder; ::continue; } ::if {$String eq "L${Level}"} { ::set Description $Remainder; ::continue; } } ::close $Handle; } catch Exception { ::puts $::errorInfo; ::qw::throw $Exception; } } ::if {$_import_action eq "count"} {::return;} ::set OldTopicStructure [[[$_manager "/OBJECT/NEWVIEWS/SYSTEM/TRANSACTION"] ".topic_structure"] odb_get]; ::puts "Paths in DataEase not in database:"; ::foreach Path [::qw::structure::paths $TopicStructure] { ::if {![::qw::structure::exists $OldTopicStructure $Path]} { ::puts "\t$Path"; } } ::puts "Paths database not in DataEase:"; ::foreach Path [::qw::structure::paths $OldTopicStructure] { ::if {![::qw::structure::exists $TopicStructure $Path]} { ::puts "\t$Path"; } } [[$_manager "/OBJECT/NEWVIEWS/SYSTEM/TRANSACTION"] ".topic_structure"] odb_set $TopicStructure; commit [$_manager "/OBJECT/NEWVIEWS/SYSTEM/TRANSACTION"]; } method sort_topic_codes {Src} { ::set Subs [::lsort [::qw::structure::subs $Src]]; ::if {$Subs eq ""} {::return $Src;} ::set Result ""; ::set Names [::lsort [::qw::structure::names $Src]]; ::foreach Name $Names { ::qw::structure::var::set Result $Name [::qw::structure::get $Src $Name]; } ::foreach Sub $Subs { ::qw::structure::var::set Result $Sub [sort_topic_codes [::qw::structure::get $Src $Sub]]; } ::return $Result; } method charToDec {Src} { ::binary scan $Src c byte1d; ::return [::expr ($byte1d + 0x100) % 0x100]; } method characterValid {Src} { ::binary scan $Src c byte1d; ::set CharacterNumber [::expr ($byte1d + 0x100) % 0x100]; ::if {$CharacterNumber<32||$CharacterNumber>127} {::return 0;} ::return 1; } method isStringValid {Src} { ::foreach Character [::split $Src ""] { ::binary scan $Character c byte1d; ::set CharacterNumber [::expr ($byte1d + 0x100) % 0x100]; ::if {$CharacterNumber<32||$CharacterNumber>127} {::puts "20040525 Invalid string \"$Src\"";} ::if {$CharacterNumber<32||$CharacterNumber>127} {::return 0;} } ::return 1; } method isIntegerValid {Src} { ::if {$Src eq ""} {::return 0;} ::set Count 0; ::foreach Character [::split $Src ""] { ::if {[::string first $Character "-1234567890"]<0} {::return 0;} ::if {$Character eq "-"} {::incr Count;} } ::if {$Count>1} {::return 0;} ::return 1; } method isRealValid {Src} { ::if {$Src eq ""} {::return 0;} ::set Count1 0; ::set Count2 0; ::foreach Character [::split $Src ""] { ::if {[::string first $Character "-.1234567890"]<0} {::return 0;} ::if {$Character eq "-"} {::incr Count1;} ::if {$Character eq "."} {::incr Count2;} } ::if {$Count1>1||$Count2>1} {::return 0;} ::return 1; } method stringMakeValid {Src} { ::set Result ""; ::foreach Character [::split $Src ""] { ::binary scan $Character c byte1d; ::set CharacterNumber [::expr ($byte1d + 0x100) % 0x100]; ::if {$CharacterNumber>=32&&$CharacterNumber<=127} { ::append Result $Character; } else { ::append Result "?"; } } ::return $Result; } method checkData {Name Type Data} { ::set FileName $_table(${_import_type}-filename); ::qw::try { ::switch $Type { "number" { ::set Data [::string map {, "" " " "" * ""} [::string trimleft $Data "0"]]; ::if {$Data eq ""} {::set Data "0";} ::if {![isRealValid $Data]} { importWarning "$FileName line $_file_line_number field $Name, invalid number \"$Data\", using \"0\" instead."; ::set _error_flag 1; ::set Data 0; } } "date" { ::qw::try { ::set Data [dataease_date_to_ymdhms $Data]; } catch Exception { ::puts "DEIMPORT error: $Exception" importWarning "$FileName line $_file_line_number field $Name, $Exception, using default date of Jan 01,1985"; ::set _error_flag 1; ::set Data "19850101"; } } "string" { ::if {![isStringValid $Data]} { importWarning "$FileName line $_file_line_number field $Name, invalid string \"$Data\", using \"[stringMakeValid $Data]\" instead."; ::set _error_flag 1; ::set Data [stringMakeValid $Data]; } } "pString" { ::if {![isStringValid $Data]} { importWarning "$FileName line $_file_line_number field $Name, invalid string \"$Data\", using \"[stringMakeValid $Data]\" instead."; ::set _error_flag 1; ::set Data [stringMakeValid $Data]; } ::set Data [makeStringProper $Data]; } "ignore" {} "bool" { ::if {$Data eq ""} {::set Data "0";} ::if {![::string is boolean $Data]} { importWarning "$FileName line $_file_line_number field $Name, invalid bool \"$Data\", using \"0\" instead."; ::set Data "0"; } ::if {$Data} {::set Data "yes"} else {::set Data "no";} } default { ::qw::throw "Invalid field type \"$Type\". Must be one of string, date, bool, or number."; ::set _error_flag 1; } } } catch Exception { ::puts "DEIMPORT error: $Exception" ::set _error_flag 1; ::return [::qw::dialog::error "Error in import file $FileName line $_file_line_number, field $Name." $Exception]; } ::return $Data; } method padRight {Src Length Char} { ::if {[::string length $Src]==$Length} {return $Src;} ::if {[::string length $Src]<$Length} {::return $Src[::string repeat $Char [::expr $Length - [::string length $Src]]]} ::return [::string range $Src 0 [expr $Length - 1]] } method padLeft {Src Length Char} { ::if {[::string length $Src]==$Length} {::return $Src;} ::if {[::string length $Src]<$Length} {::return [::string repeat $Char [::expr $Length - [::string length $Src]]]$Src;} ::return [::string range $Src [expr [::string length $Src]-$Length] end] } method makeStringProper {Src} { ::set Result ""; ::foreach Word [::split $Src " "] { ::if {[::string is alpha $Word]} { ::append Result "[::string totitle $Word] " } else { ::append Result "$Word " } } ::return [::string trimright $Result " "]; } method dataease_date_to_ymdhms {Date {Time ""}} { ::if {$Date eq ""||$Date eq "00/00/00"} {::return "";} ::set Error "Invalid date \"$Date\""; ::set Day ""; ::set Month ""; ::set Year ""; ::regexp {([0-9]+)(/)([0-9]+)(/)([0-9]+)} [::string trim $Date] match Day x Month y Year; ::set Day [::string trimleft $Day 0]; ::set Month [::string trimleft $Month 0]; ::if {$Year ne "00"} { ::set Year [::string trimleft $Year 0]; ::if {![::string is integer $Year]} {::qw::throw $Error;} } else { ::set Year "0"; } ::if {![::string is integer $Month]} {::qw::throw $Error;} ::if {![::string is integer $Day]} {::qw::throw $Error;} ::if {$Year eq ""} {::qw::throw $Error;} ::if {$Month eq ""} {::qw::throw $Error;} ::if {$Day eq ""} {::qw::throw $Error;} ::if {$Month<1||$Month>12} {::qw::throw $Error;} ::if {$Year<10} { ::set Year "200$Year"; } else { ::set Year "19$Year"; } ::switch $Month { 1 - 3 - 5 - 7 - 8 - 10 - 12 {::if {$Day>31} {::qw::throw $Error;}} 4 - 6 - 9 - 11 {::if {$Day>30} {::qw::throw $Error;}} 2 { ::if {[::expr $Year%4]} { ::if {$Day>28} {::qw::throw $Error;} } else { ::if {$Day>29} {::qw::throw $Error;} } } } ::if {$Month<10} {::set Month "0$Month";} ::if {$Day<10} {::set Day "0$Day";} ::set Date "$Year$Month$Day"; ::if {$Time eq ""} {::return $Date;} ::return $Date[dataease_time_to_hhmmss $Time]; } method dataease_time_to_hhmmss {Time} { ::set Error "Invalid time \"$Time\""; ::set H [::string trim [::lindex [::split $Time ":"] 0]]; ::set M [::string trim [::lindex [::split $Time ":"] 1]]; ::set S [::string trim [::lindex [::split $Time ":"] 2]]; ::set H [::string trimleft $H 0]; ::set M [::string trimleft $M 0]; ::set S [::string trimleft $S 0]; ::if {$H eq ""} { ::set H "00" } else { ::if {![::string is integer $H]} { ::qw::throw $Error; } else { ::if {$H<10} { ::set H "0$H"; } else { ::if {$H>24} { ::qw::throw $Error; } } } } ::if {$M eq ""} { ::set M "00" } else { ::if {![::string is integer $M]} { ::qw::throw $Error; } else { ::if {$M<10} { ::set M "0$M"; } else { ::if {$M>60} { ::qw::throw $Error; } } } } ::if {$S eq ""} { ::set S "00" } else { ::if {![::string is integer $S]} { ::qw::throw $Error; } else { ::if {$S<10} { ::set S "0$S"; } else { ::if {$S>60} { ::qw::throw $Error; } } } } ::return $H$M$S; } }