Annotation of RT/Invoicing/lib/RTI/Config.pm, Revision 1.2
1.1 andrew 1: package RTI::Config;
2: use strict;
3: use warnings;
4:
5: use 5.010;
6:
1.2 ! andrew 7: use YAML::XS qw/ LoadFile Dump Load /;
1.1 andrew 8: use File::Spec;
9:
10: sub new {
11: my ( $class, $args ) = @_;
12:
13: my $self = { file => '', };
14: bless $self, $class;
15:
16: my $file = $args->{file} || $self->_find_config;
17: $self->read_config($file);
18:
19: return $self;
20: }
21:
22: sub _find_config {
23: my ($self) = @_;
24:
25: # XXX This needs to be better
26: foreach my $file (qw/ rt_invoice.conf rt_invoice.cfg .rt_invoicerc /) {
27: foreach my $dir ( '.', $ENV{HOME} . '/.rt_invoicing', $ENV{HOME} ) {
28: my $path = join '/', $dir, $file;
29: return $path if -e $path;
30: }
31: }
32: return;
33: }
34:
35: sub read_config {
36: my ( $self, $file ) = @_;
37:
38: $file ||= $self->{file};
39: die "$file: no such file\n" unless -e $file;
40:
41: my $c = LoadFile($file) or die "Unable to load $file\n";
42:
43: $c->{customers} ||= [];
44: if ( $c->{default} ) {
45: foreach my $cust ( @{ $c->{customers} } ) {
46: foreach my $k ( keys %{ $c->{default} } ) {
47: $cust->{$k} //= Load( Dump( $c->{default}->{$k} ) );
48: }
49: }
50: }
51:
52: $self->{_config} = $c;
53: $self->{file} = $file;
54: }
55:
56: sub get {
57: my ( $self, $key ) = @_;
58: my $value = Load( Dump( $self->{_config}->{$key} ) );
59:
60: my ( $volume, $directories, $file )
61: = File::Spec->splitpath( File::Spec->rel2abs( $self->{file} ) );
62:
63: given ($key) {
64: when ('state') {
65: if (!$value) {
66: $value = $self->{file};
67: $value =~ s/(?:\.[^.]+)?$/\.state/;
68: }
69: }
70: when ('invoice_dir') {
71: $value //= File::Spec->catdir( $volume, $directories, 'invoices' );
72: }
73: when ('template_dir') {
74: $value //= File::Spec->catdir( $volume, $directories );
75: }
76: when ('invoice_template') {
77: $value //= 'invoice.tex.tt';
78: }
79: when ('logo') {
80: $value //= File::Spec->catfile( $volume, $directories, 'Logo.pdf' );
81: }
82: when ('customers') {
83: $value = $self->_customers($value);
84: }
85: }
86:
87: return $value;
88: }
89:
90: sub _customers {
91: my ( $self, $customers ) = @_;
92: my $default_cust = $self->new_customer;
93:
94: foreach my $cust ( @{$customers} ) {
95: foreach (keys %{ $default_cust }) {
96: $cust->{$_} = $default_cust->{$_} unless exists $cust->{$_}
97: }
98: }
99:
100: return $customers;
101: }
102:
103: sub new_customer {
104: my ($self) = @_;
105:
106: my $cust = $self->get('default');
107:
108: return {
109: day => 0,
110: per => 'week',
111: frequency => 1,
112: hours => { default => 0 },
113: rates => {},
114: %{$cust}
115: };
116: }
117:
118: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>