1 package FS::deploy_zone;
4 use base qw( FS::o2m_Common FS::Record );
5 use FS::Record qw( qsearch qsearchs dbh );
9 FS::deploy_zone - Object methods for deploy_zone records
15 $record = new FS::deploy_zone \%hash;
16 $record = new FS::deploy_zone { 'column' => 'value' };
18 $error = $record->insert;
20 $error = $new_record->replace($old_record);
22 $error = $record->delete;
24 $error = $record->check;
28 An FS::deploy_zone object represents a geographic zone where a certain kind
29 of service is available. Currently we store this information to generate
30 the FCC Form 477 deployment reports, but it may find other uses later.
32 FS::deploy_zone inherits from FS::Record. The following fields are currently
43 Optional text describing the zone.
47 The agent that serves this zone.
51 The name under which service is marketed in this zone. If null, will
52 default to the agent name.
56 The way the zone geography is defined: "B" for a list of census blocks
57 (used by the FCC for fixed broadband service), "P" for a polygon (for
58 mobile services). See L<FS::deploy_zone_block> and L<FS::deploy_zone_vertex>.
62 The FCC technology code for the type of service available.
66 For mobile service zones, the FCC code for the RF band.
70 For broadband, the advertised upstream bandwidth in the zone. If multiple
71 speed tiers are advertised, use the highest.
75 For broadband, the advertised downstream bandwidth in the zone.
79 For broadband, the contractually guaranteed upstream bandwidth, if that type
84 For broadband, the contractually guaranteed downstream bandwidth, if that
85 type of service is sold.
89 'Y' if this service is sold for consumer/household use.
93 'Y' if this service is sold to business or institutional use. Not mutually
94 exclusive with is_consumer.
98 'Y' if this service includes broadband Internet.
102 'Y' if this service includes voice communication.
106 The date this zone became active.
110 The date this zone became inactive, if any.
120 Creates a new zone. To add the zone to the database, see L<"insert">.
124 # the new method can be inherited from FS::Record, if a table method is defined
126 sub table { 'deploy_zone'; }
128 =item insert ELEMENTS
130 Adds this record to the database. If there is an error, returns the error,
131 otherwise returns false.
135 # the insert method can be inherited from FS::Record
139 Delete this record from the database.
144 my $oldAutoCommit = $FS::UID::AutoCommit;
145 local $FS::UID::AutoCommit = 0;
146 # clean up linked records
148 my $error = $self->process_o2m(
149 'table' => $self->element_table,
150 'num_col' => 'zonenum',
151 'fields' => 'zonenum',
153 ) || $self->SUPER::delete(@_);
156 dbh->rollback if $oldAutoCommit;
162 =item replace OLD_RECORD
164 Replaces the OLD_RECORD with this one in the database. If there is an error,
165 returns the error, otherwise returns false.
169 # the replace method can be inherited from FS::Record
173 Checks all fields to make sure this is a valid zone record. If there is
174 an error, returns the error, otherwise returns false. Called by the insert
183 $self->ut_numbern('zonenum')
184 || $self->ut_text('description')
185 || $self->ut_number('agentnum')
186 || $self->ut_foreign_key('agentnum', 'agent', 'agentnum')
187 || $self->ut_textn('dbaname')
188 || $self->ut_enum('zonetype', [ 'B', 'P' ])
189 || $self->ut_number('technology')
190 || $self->ut_numbern('spectrum')
191 || $self->ut_decimaln('adv_speed_up', 3)
192 || $self->ut_decimaln('adv_speed_down', 3)
193 || $self->ut_decimaln('cir_speed_up', 3)
194 || $self->ut_decimaln('cir_speed_down', 3)
195 || $self->ut_flag('is_consumer')
196 || $self->ut_flag('is_business')
197 || $self->ut_flag('is_broadband')
198 || $self->ut_flag('is_voice')
199 || $self->ut_numbern('active_date')
200 || $self->ut_numbern('expire_date')
202 return $error if $error;
204 foreach(qw(adv_speed_down adv_speed_up cir_speed_down cir_speed_up)) {
205 if ($self->get('is_broadband')) {
206 if (!$self->get($_)) {
213 if (!$self->get('active_date')) {
214 $self->set('active_date', time);
222 Returns the name of the table that contains the zone's elements (blocks or
229 if ($self->zonetype eq 'B') {
230 return 'deploy_zone_block';
231 } elsif ( $self->zonetype eq 'P') {
232 return 'deploy_zone_vertex';
234 die 'unknown zonetype';
238 =item deploy_zone_block
240 Returns the census block records in this zone, in order by census block
241 number. Only appropriate to block-type zones.
243 =item deploy_zone_vertex
245 Returns the vertex records for this zone, in order by sequence number. Only
246 appropriate to polygon-type zones.
250 sub deploy_zone_block {
253 table => 'deploy_zone_block',
254 hashref => { zonenum => $self->zonenum },
255 order_by => ' ORDER BY censusblock',
259 sub deploy_zone_vertex {
262 table => 'deploy_zone_vertex',
263 hashref => { zonenum => $self->zonenum },
264 order_by => ' ORDER BY vertexnum',