public function seed()
 {
     $states = ['AU' => ['ACT' => 'Australian Capital Territory', 'NSW' => 'New South Wales', 'NT' => 'Northern Territory', 'QLD' => 'Queensland', 'SA' => 'South Australia', 'TAS' => 'Tasmania', 'VIC' => 'Victoria', 'WA' => 'Western Australia'], 'CA' => ['AB' => 'Alberta', 'BC' => 'British Columbia', 'MB' => 'Manitoba', 'NB' => 'New Brunswick', 'NL' => 'Newfoundland and Labrador', 'NT' => 'Northwest Territories', 'NS' => 'Nova Scotia', 'NU' => 'Nunavut', 'ON' => 'Ontario', 'PE' => 'Prince Edward Island', 'QC' => 'Quebec', 'SK' => 'Saskatchewan', 'YT' => 'Yukon'], 'US' => ['AL' => 'Alabama', 'AK' => 'Alaska', 'AZ' => 'Arizona', 'AR' => 'Arkansas', 'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware', 'DC' => 'District of Columbia', 'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho', 'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas', 'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine', 'MD' => 'Maryland', 'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MS' => 'Mississippi', 'MO' => 'Missouri', 'MT' => 'Montana', 'NE' => 'Nebraska', 'NV' => 'Nevada', 'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NY' => 'New York', 'NC' => 'North Carolina', 'ND' => 'North Dakota', 'OH' => 'Ohio', 'OK' => 'Oklahoma', 'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina', 'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah', 'VT' => 'Vermont', 'VA' => 'Virginia', 'WA' => 'Washington', 'WV' => 'West Virginia', 'WI' => 'Wisconsin', 'WY' => 'Wyoming']];
     $criteria = new \CDbCriteria();
     $criteria->addInCondition('iso', array_keys($states));
     $countries = Market_CountryRecord::model()->findAll($criteria);
     $code2id = [];
     foreach ($countries as $record) {
         $code2id[$record->iso] = $record->id;
     }
     $rows = [];
     foreach ($states as $iso => $list) {
         foreach ($list as $abbr => $name) {
             $rows[] = [$code2id[$iso], $abbr, $name];
         }
     }
     $table = Market_StateRecord::model()->getTableName();
     \Craft\craft()->db->createCommand()->insertAll($table, ['countryId', 'abbreviation', 'name'], $rows);
 }
 /**
  * @param Market_TaxZoneModel $model
  * @param array               $countriesIds
  * @param array               $statesIds
  *
  * @return bool
  * @throws \Exception
  */
 public function save(Market_TaxZoneModel $model, $countriesIds, $statesIds)
 {
     if ($model->id) {
         $record = Market_TaxZoneRecord::model()->findById($model->id);
         if (!$record) {
             throw new Exception(Craft::t('No tax zone exists with the ID “{id}”', ['id' => $model->id]));
         }
     } else {
         $record = new Market_TaxZoneRecord();
     }
     //remembering which links should be clean
     $deleteOldCountries = $deleteOldStates = false;
     if ($record->id) {
         if ($record->countryBased) {
             $deleteOldCountries = true;
         } else {
             $deleteOldStates = true;
         }
     }
     //setting attributes
     $record->name = $model->name;
     $record->description = $model->description;
     $record->countryBased = $model->countryBased;
     $record->default = $model->default;
     $record->validate();
     $model->addErrors($record->getErrors());
     //validating given ids
     if ($record->countryBased) {
         $criteria = new \CDbCriteria();
         $criteria->addInCondition('id', $countriesIds);
         $exist = Market_CountryRecord::model()->exists($criteria);
         if (!$exist) {
             $model->addError('countries', 'Please select some countries');
         }
     } else {
         $criteria = new \CDbCriteria();
         $criteria->addInCondition('id', $statesIds);
         $exist = Market_StateRecord::model()->exists($criteria);
         if (!$exist) {
             $model->addError('states', 'Please select some states');
         }
     }
     //saving
     if (!$model->hasErrors()) {
         MarketDbHelper::beginStackedTransaction();
         try {
             // Save it!
             $record->save(false);
             // Now that we have a record ID, save it on the model
             $model->id = $record->id;
             //deleting old links
             if ($deleteOldCountries) {
                 Market_TaxZoneCountryRecord::model()->deleteAllByAttributes(['taxZoneId' => $record->id]);
             }
             if ($deleteOldStates) {
                 Market_TaxZoneStateRecord::model()->deleteAllByAttributes(['taxZoneId' => $record->id]);
             }
             //saving new links
             if ($model->countryBased) {
                 $rows = array_map(function ($id) use($model) {
                     return [$id, $model->id];
                 }, $countriesIds);
                 $cols = ['countryId', 'taxZoneId'];
                 $table = Market_TaxZoneCountryRecord::model()->getTableName();
             } else {
                 $rows = array_map(function ($id) use($model) {
                     return [$id, $model->id];
                 }, $statesIds);
                 $cols = ['stateId', 'taxZoneId'];
                 $table = Market_TaxZoneStateRecord::model()->getTableName();
             }
             craft()->db->createCommand()->insertAll($table, $cols, $rows);
             //If this was the default make all others not the default.
             if ($model->default) {
                 Market_TaxZoneRecord::model()->updateAll(['default' => 0], 'id != ?', [$record->id]);
             }
             MarketDbHelper::commitStackedTransaction();
         } catch (\Exception $e) {
             MarketDbHelper::rollbackStackedTransaction();
             throw $e;
         }
         return true;
     } else {
         return false;
     }
 }